| /* |
| * This file was generated automatically by gen-mterp.py for 'x86-atom'. |
| * |
| * --> DO NOT EDIT <-- |
| */ |
| |
| /* File: x86-atom/header.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: header.S |
| */ |
| |
| /* |
| * IA32 calling convention and general notes: |
| * |
| * EAX, ECX, EDX - general purpose scratch registers (caller-saved); |
| * |
| * The stack (%esp) - used to pass arguments to functions |
| * |
| * EAX - holds the first 4 bytes of a return |
| * EDX - holds the second 4 bytes of a return |
| * |
| * EBX, ESI, EDI, EBP - are callee saved |
| * |
| * CS, DS, SS - are segment registers |
| * ES, FS, GS - are segment registers. We will try to avoid using these registers |
| * |
| * The stack is "full descending". Only the arguments that do not fit * in the first two arg registers are placed on the stack. |
| * "%esp" points to the first stacked argument (i.e. the 3rd arg). |
| */ |
| |
| /* |
| * Mterp and IA32 notes |
| * |
| * mem nick purpose |
| * (%ebp) rGLUE InterpState base pointer (A.K.A. MterpGlue Pointer) |
| * %esi rPC interpreted program counter, used for fetching |
| * instructions |
| * %ebx rINST first 16-bit code unit of current instruction |
| * %edi rFP interpreted frame pointer, used for accessing |
| * locals and args |
| */ |
| |
| /* |
| * Includes |
| */ |
| |
| #include "../common/asm-constants.h" |
| |
| /* |
| * Reserved registers |
| */ |
| |
| #define rGLUE (%ebp) |
| #define rINST %ebx |
| #define rINSTbl %bl |
| #define rINSTbh %bh |
| #define rINSTw %bx |
| #define rPC %esi |
| #define rFP %edi |
| |
| /* |
| * Temporary register used when finishing an opcode |
| */ |
| |
| #define rFinish %edx |
| |
| /* |
| * Stack locations used for temporary data. For convenience. |
| */ |
| |
| #define sReg0 4(%ebp) |
| #define sReg1 8(%ebp) |
| #define sReg2 12(%ebp) |
| #define sReg3 16(%ebp) |
| |
| /* |
| * Save the PC and FP to the glue struct |
| */ |
| |
| .macro SAVE_PC_FP_TO_GLUE _reg |
| movl rGLUE, \_reg |
| movl rPC, offGlue_pc(\_reg) |
| movl rFP, offGlue_fp(\_reg) |
| .endm |
| |
| /* |
| * Restore the PC and FP from the glue struct |
| */ |
| |
| .macro LOAD_PC_FP_FROM_GLUE |
| movl rGLUE, rFP |
| movl offGlue_pc(rFP), rPC |
| movl offGlue_fp(rFP), rFP |
| .endm |
| |
| /* |
| * "Export" the PC to the stack frame, f/b/o future exception objects. This must |
| * be done *before* something calls dvmThrowException. |
| * |
| * In C this is "SAVEAREA_FROM_FP(fp)->xtra.currentPc = pc", i.e. |
| * fp - sizeof(StackSaveArea) + offsetof(SaveArea, xtra.currentPc) |
| * |
| * It's okay to do this more than once. |
| */ |
| |
| .macro EXPORT_PC |
| movl rPC, (-sizeofStackSaveArea + offStackSaveArea_currentPc)(rFP) |
| .endm |
| |
| /* |
| * Given a frame pointer, find the stack save area. |
| * In C this is "((StackSaveArea*)(_fp) -1)". |
| */ |
| |
| .macro SAVEAREA_FROM_FP _reg |
| lea -sizeofStackSaveArea(rFP), \_reg |
| .endm |
| |
| /* |
| * Get the 32-bit value from a dalvik register. |
| */ |
| |
| .macro GET_VREG _vreg |
| movl (rFP,\_vreg, 4), \_vreg |
| .endm |
| |
| /* |
| * Set the 32-bit value from a dalvik register. |
| */ |
| |
| .macro SET_VREG _reg _vreg |
| movl \_reg, (rFP,\_vreg, 4) |
| .endm |
| |
| /* |
| * Fetch the next instruction from rPC into rINST. Does not advance rPC. |
| */ |
| |
| .macro FETCH_INST |
| movzwl (rPC), rINST |
| .endm |
| |
| /* |
| * Fetch the next instruction from the specified offset. Advances rPC |
| * to point to the next instruction. "_count" is in 16-bit code units. |
| * |
| * This must come AFTER anything that can throw an exception, or the |
| * exception catch may miss. (This also implies that it must come after |
| * EXPORT_PC()) |
| */ |
| |
| .macro FETCH_ADVANCE_INST _count |
| add $(\_count*2), rPC |
| movzwl (rPC), rINST |
| .endm |
| |
| /* |
| * Fetch the next instruction from an offset specified by _reg. Updates |
| * rPC to point to the next instruction. "_reg" must specify the distance |
| * in bytes, *not* 16-bit code units, and may be a signed value. |
| */ |
| |
| .macro FETCH_ADVANCE_INST_RB _reg |
| addl \_reg, rPC |
| movzwl (rPC), rINST |
| .endm |
| |
| /* |
| * Fetch a half-word code unit from an offset past the current PC. The |
| * "_count" value is in 16-bit code units. Does not advance rPC. |
| * For example, given instruction of format: AA|op BBBB, it |
| * fetches BBBB. |
| */ |
| |
| .macro FETCH _count _reg |
| movzwl (\_count*2)(rPC), \_reg |
| .endm |
| |
| /* |
| * Fetch a half-word code unit from an offset past the current PC. The |
| * "_count" value is in 16-bit code units. Does not advance rPC. |
| * This variant treats the value as signed. |
| */ |
| |
| .macro FETCHs _count _reg |
| movswl (\_count*2)(rPC), \_reg |
| .endm |
| |
| /* |
| * Fetch the first byte from an offset past the current PC. The |
| * "_count" value is in 16-bit code units. Does not advance rPC. |
| * For example, given instruction of format: AA|op CC|BB, it |
| * fetches BB. |
| */ |
| |
| .macro FETCH_BB _count _reg |
| movzbl (\_count*2)(rPC), \_reg |
| .endm |
| |
| /* |
| * Fetch the second byte from an offset past the current PC. The |
| * "_count" value is in 16-bit code units. Does not advance rPC. |
| * For example, given instruction of format: AA|op CC|BB, it |
| * fetches CC. |
| */ |
| |
| .macro FETCH_CC _count _reg |
| movzbl (\_count*2 + 1)(rPC), \_reg |
| .endm |
| |
| /* |
| * Fetch the second byte from an offset past the current PC. The |
| * "_count" value is in 16-bit code units. Does not advance rPC. |
| * This variant treats the value as signed. |
| */ |
| |
| .macro FETCH_CCs _count _reg |
| movsbl (\_count*2 + 1)(rPC), \_reg |
| .endm |
| |
| |
| /* |
| * Fetch one byte from an offset past the current PC. Pass in the same |
| * "_count" as you would for FETCH, and an additional 0/1 indicating which |
| * byte of the halfword you want (lo/hi). |
| */ |
| |
| .macro FETCH_B _reg _count _byte |
| movzbl (\_count*2+\_byte)(rPC), \_reg |
| .endm |
| |
| /* |
| * Put the instruction's opcode field into the specified register. |
| */ |
| |
| .macro GET_INST_OPCODE _reg |
| movzbl rINSTbl, \_reg |
| .endm |
| |
| /* |
| * Begin executing the opcode in _reg. |
| */ |
| |
| .macro GOTO_OPCODE _reg |
| shl $6, \_reg |
| addl $dvmAsmInstructionStart,\_reg |
| jmp *\_reg |
| .endm |
| |
| |
| |
| /* |
| * Macros pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE |
| * by using a jump table. _rFinish should must be the same register for |
| * both macros. |
| */ |
| |
| .macro FFETCH _rFinish |
| movzbl (rPC), \_rFinish |
| .endm |
| |
| .macro FGETOP_JMPa _rFinish |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) |
| .endm |
| |
| /* |
| * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE |
| * by using a jump table. _rFinish and _count should must be the same register for |
| * both macros. |
| */ |
| |
| .macro FFETCH_ADV _count _rFinish |
| movzbl (\_count*2)(rPC), \_rFinish |
| .endm |
| |
| .macro FGETOP_JMP _count _rFinish |
| movzbl (\_count*2 + 1)(rPC), rINST |
| addl $(\_count*2), rPC |
| jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) |
| .endm |
| |
| .macro FGETOP_JMP2 _rFinish |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) |
| .endm |
| |
| .macro OLD_JMP_1 _count _rFinish |
| movzbl (\_count*2)(rPC), \_rFinish |
| shl $6, \_rFinish |
| .endm |
| |
| .macro OLD_JMP_2 _rFinish |
| addl $dvmAsmInstructionStart,\_rFinish |
| .endm |
| |
| .macro OLD_JMP_3 _count |
| addl $(\_count*2), rPC |
| .endm |
| |
| .macro OLD_JMP_4 _rFinish |
| movzbl 1(rPC), rINST |
| jmp *\_rFinish |
| .endm |
| |
| .macro OLD_JMP_A_1 _reg _rFinish |
| movzbl (rPC, \_reg), \_rFinish |
| shl $6, \_rFinish |
| .endm |
| |
| .macro OLD_JMP_A_2 _rFinish |
| addl $dvmAsmInstructionStart,\_rFinish |
| .endm |
| |
| .macro OLD_JMP_A_3 _reg _rFinish |
| addl \_reg, rPC |
| movzbl 1(rPC, \_reg), rINST |
| jmp *\_rFinish |
| .endm |
| |
| /* |
| * Macro pair attempts to speed up FETCH_INST, GET_INST_OPCODE and GOTO_OPCODE |
| * by using a jump table. _rFinish and _reg should must be the same register for |
| * both macros. |
| */ |
| |
| .macro FFETCH_ADV_RB _reg _rFinish |
| movzbl (\_reg, rPC), \_rFinish |
| .endm |
| |
| .macro FGETOP_RB_JMP _reg _rFinish |
| movzbl 1(\_reg, rPC), rINST |
| addl \_reg, rPC |
| jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) |
| .endm |
| |
| /* |
| * Attempts to speed up FETCH_INST, GET_INST_OPCODE using |
| * a jump table. This macro should be called before FINISH_JMP where |
| * rFinish should be the same register containing the opcode value. |
| * This is an attempt to split up FINISH in order to reduce or remove |
| * potential stalls due to the wait for rFINISH. |
| */ |
| |
| .macro FINISH_FETCH _rFinish |
| movzbl (rPC), \_rFinish |
| movzbl 1(rPC), rINST |
| .endm |
| |
| |
| /* |
| * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE using |
| * a jump table. This macro should be called before FINISH_JMP where |
| * rFinish should be the same register containing the opcode value. |
| * This is an attempt to split up FINISH in order to reduce or remove |
| * potential stalls due to the wait for rFINISH. |
| */ |
| |
| .macro FINISH_FETCH_ADVANCE _count _rFinish |
| movzbl (\_count*2)(rPC), \_rFinish |
| movzbl (\_count*2 + 1)(rPC), rINST |
| addl $(\_count*2), rPC |
| .endm |
| |
| /* |
| * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE using |
| * a jump table. This macro should be called before FINISH_JMP where |
| * rFinish should be the same register containing the opcode value. |
| * This is an attempt to split up FINISH in order to reduce or remove |
| * potential stalls due to the wait for rFINISH. |
| */ |
| |
| .macro FINISH_FETCH_ADVANCE_RB _reg _rFinish |
| movzbl (\_reg, rPC), \_rFinish |
| movzbl 1(\_reg, rPC), rINST |
| addl \_reg, rPC |
| .endm |
| |
| /* |
| * Attempts to speed up GOTO_OPCODE using a jump table. This macro should |
| * be called after a FINISH_FETCH* instruction where rFinish should be the |
| * same register containing the opcode value. This is an attempt to split up |
| * FINISH in order to reduce or remove potential stalls due to the wait for rFINISH. |
| */ |
| |
| .macro FINISH_JMP _rFinish |
| jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) |
| .endm |
| |
| /* |
| * Attempts to speed up FETCH_INST, GET_INST_OPCODE, GOTO_OPCODE by using |
| * a jump table. Uses a single macro - but it should be faster if we |
| * split up the fetch for rFinish and the jump using rFinish. |
| */ |
| |
| .macro FINISH_A |
| movzbl (rPC), rFinish |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(,rFinish, 4) |
| .endm |
| |
| /* |
| * Attempts to speed up FETCH_ADVANCE_INST, GET_INST_OPCODE, |
| * GOTO_OPCODE by using a jump table. Uses a single macro - |
| * but it should be faster if we split up the fetch for rFinish |
| * and the jump using rFinish. |
| */ |
| |
| .macro FINISH _count |
| movzbl (\_count*2)(rPC), rFinish |
| movzbl (\_count*2 + 1)(rPC), rINST |
| addl $(\_count*2), rPC |
| jmp *dvmAsmInstructionJmpTable(,rFinish, 4) |
| .endm |
| |
| /* |
| * Attempts to speed up FETCH_ADVANCE_INST_RB, GET_INST_OPCODE, |
| * GOTO_OPCODE by using a jump table. Uses a single macro - |
| * but it should be faster if we split up the fetch for rFinish |
| * and the jump using rFinish. |
| */ |
| |
| .macro FINISH_RB _reg _rFinish |
| movzbl (\_reg, rPC), \_rFinish |
| movzbl 1(\_reg, rPC), rINST |
| addl \_reg, rPC |
| jmp *dvmAsmInstructionJmpTable(,\_rFinish, 4) |
| .endm |
| |
| /* |
| * Hard coded helper values. |
| */ |
| |
| .balign 16 |
| |
| .LdoubNeg: |
| .quad 0x8000000000000000 |
| |
| .L64bits: |
| .quad 0xFFFFFFFFFFFFFFFF |
| |
| .LshiftMask2: |
| .quad 0x0000000000000000 |
| .LshiftMask: |
| .quad 0x000000000000003F |
| |
| .Lvalue64: |
| .quad 0x0000000000000040 |
| |
| .LvaluePosInfLong: |
| .quad 0x7FFFFFFFFFFFFFFF |
| |
| .LvalueNegInfLong: |
| .quad 0x8000000000000000 |
| |
| .LvalueNanLong: |
| .quad 0x0000000000000000 |
| |
| .LintMin: |
| .long 0x80000000 |
| |
| .LintMax: |
| .long 0x7FFFFFFF |
| |
| .global dvmAsmInstructionStart |
| .type dvmAsmInstructionStart, %function |
| dvmAsmInstructionStart = .L_OP_NOP |
| .text |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NOP: /* 0x00 */ |
| /* File: x86-atom/OP_NOP.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NOP.S |
| * |
| * Code: Use a cycle. Uses no substitutions. |
| * |
| * For: nop |
| * |
| * Description: No operation. Use a cycle |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| FINISH 1 # jump to next instruction |
| |
| #ifdef ASSIST_DEBUGGER |
| |
| /* |
| * insert fake function header to help gdb find the stack frame |
| */ |
| |
| .type dalvik_inst, %function |
| dalvik_inst: |
| MTERP_ENTRY |
| #endif |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE: /* 0x01 */ |
| /* File: x86-atom/OP_MOVE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE.S |
| * |
| * Code: Copies contents from one register to another. Uses no |
| * substitutions. |
| * |
| * For: move, move-object, long-to-int |
| * |
| * Description: Copies contents from one non-object register to another. |
| * vA<- vB; fp[A]<- fp[B] |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vB |
| SET_VREG rINST, %ecx # vA<- vB; %edx |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_FROM16: /* 0x02 */ |
| /* File: x86-atom/OP_MOVE_FROM16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_FROM16.S |
| * |
| * Code: Copies contents from one register to another |
| * |
| * For: move/from16, move-object/from16 |
| * |
| * Description: Copies contents from one non-object register to another. |
| * vA<- vB; fp[A]<- fp[B] |
| * |
| * Format: AA|op BBBB (22x) |
| * |
| * Syntax: op vAA, vBBBB |
| */ |
| |
| FETCH 1, %edx # %edx<- BBBB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vB |
| SET_VREG %edx, rINST # vA<- vB; %edx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_16: /* 0x03 */ |
| /* File: x86-atom/OP_MOVE_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_16.S |
| * |
| * Code: Copies contents from one register to another |
| * |
| * For: move/16, move-object/16 |
| * |
| * Description: Copies contents from one non-object register to another. |
| * fp[A]<- fp[B] |
| * |
| * Format: ØØ|op AAAA BBBB (32x) |
| * |
| * Syntax: op vAAAA, vBBBB |
| */ |
| |
| FETCH 2, %edx # %edx<- BBBB |
| FETCH 1, %ecx # %ecx<- AAAA |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vB |
| SET_VREG %edx, %ecx # vA<- vB; %edx |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_WIDE: /* 0x04 */ |
| /* File: x86-atom/OP_MOVE_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_WIDE.S |
| * |
| * Code: Copies contents from one register to another. Uses no |
| * substitutions. |
| * |
| * For: move-wide |
| * |
| * Description: Copies contents from one non-object register to another. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA+ |
| shr $4, %edx # %edx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vB |
| movq %xmm0, (rFP, rINST, 4) # vA<- vB |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_WIDE_FROM16: /* 0x05 */ |
| /* File: x86-atom/OP_MOVE_WIDE_FROM16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_WIDE_FROM16.S |
| * |
| * Code: Copies contents from one register to another |
| * |
| * For: move-wide/from16 |
| * |
| * Description: Copies contents from one non-object register to another. |
| * |
| * Format: AA|op BBBB (22x) |
| * |
| * Syntax: op vAA, vBBBB |
| */ |
| |
| FETCH 1, %edx # %edx<- BBBB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vB |
| movq %xmm0, (rFP, rINST, 4) # vA<- vB |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_WIDE_16: /* 0x06 */ |
| /* File: x86-atom/OP_MOVE_WIDE_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_WIDE_16.S |
| * |
| * Code: Copies contents from one register to another. Uses no |
| * substitutions. |
| * |
| * For: move-wide/16 |
| * |
| * Description: Copies contents from one non-object register to another. |
| * |
| * Format: ØØ|op AAAA BBBB (32x) |
| * |
| * Syntax: op vAAAA, vBBBB |
| */ |
| |
| FETCH 2, %edx # %edx<- BBBB |
| FETCH 1, %ecx # %ecx<- AAAA |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vB |
| movq %xmm0, (rFP, %ecx, 4) # vA<- vB; %xmm0 |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_OBJECT: /* 0x07 */ |
| /* File: x86-atom/OP_MOVE_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_MOVE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE.S |
| * |
| * Code: Copies contents from one register to another. Uses no |
| * substitutions. |
| * |
| * For: move, move-object, long-to-int |
| * |
| * Description: Copies contents from one non-object register to another. |
| * vA<- vB; fp[A]<- fp[B] |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vB |
| SET_VREG rINST, %ecx # vA<- vB; %edx |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_OBJECT_FROM16: /* 0x08 */ |
| /* File: x86-atom/OP_MOVE_OBJECT_FROM16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_OBJECT_FROM16.S |
| */ |
| |
| /* File: x86-atom/OP_MOVE_FROM16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_FROM16.S |
| * |
| * Code: Copies contents from one register to another |
| * |
| * For: move/from16, move-object/from16 |
| * |
| * Description: Copies contents from one non-object register to another. |
| * vA<- vB; fp[A]<- fp[B] |
| * |
| * Format: AA|op BBBB (22x) |
| * |
| * Syntax: op vAA, vBBBB |
| */ |
| |
| FETCH 1, %edx # %edx<- BBBB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vB |
| SET_VREG %edx, rINST # vA<- vB; %edx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_OBJECT_16: /* 0x09 */ |
| /* File: x86-atom/OP_MOVE_OBJECT_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_OBJECT_16.S |
| */ |
| |
| /* File: x86-atom/OP_MOVE_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_16.S |
| * |
| * Code: Copies contents from one register to another |
| * |
| * For: move/16, move-object/16 |
| * |
| * Description: Copies contents from one non-object register to another. |
| * fp[A]<- fp[B] |
| * |
| * Format: ØØ|op AAAA BBBB (32x) |
| * |
| * Syntax: op vAAAA, vBBBB |
| */ |
| |
| FETCH 2, %edx # %edx<- BBBB |
| FETCH 1, %ecx # %ecx<- AAAA |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vB |
| SET_VREG %edx, %ecx # vA<- vB; %edx |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_RESULT: /* 0x0a */ |
| /* File: x86-atom/OP_MOVE_RESULT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_RESULT.S |
| * |
| * Code: Copies a return value to a register |
| * |
| * For: move-result, move-result-object |
| * |
| * Description: Move the single-word non-object result of the most |
| * recent method invocation into the indicated register. This |
| * must be done as the instruction immediately after a |
| * method invocation whose (single-word, non-object) result |
| * is not to be ignored; anywhere else is invalid. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| FFETCH_ADV 1, %ecx # %ecx<- next instruction hi; fetch, advance |
| movl offGlue_retval(%eax), %edx # %edx<- glue->retval |
| SET_VREG %edx, rINST # vA<- glue->retval |
| FGETOP_JMP 1, %ecx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_RESULT_WIDE: /* 0x0b */ |
| /* File: x86-atom/OP_MOVE_RESULT_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_RESULT_WIDE.S |
| * |
| * Code: Copies a return value to a register |
| * |
| * For: move-result-wide |
| * |
| * Description: Move the double-word non-object result of the most |
| * recent method invocation into the indicated register. This |
| * must be done as the instruction immediately after a |
| * method invocation whose (single-word, non-object) result |
| * is not to be ignored; anywhere else is invalid. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movq offGlue_retval(%eax), %xmm0 # %xmm0<- glue->retval |
| movq %xmm0, (rFP, rINST, 4) # vA<- glue->retval |
| FFETCH_ADV 1, %edx # %edx<- next instruction hi; fetch, advance |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_RESULT_OBJECT: /* 0x0c */ |
| /* File: x86-atom/OP_MOVE_RESULT_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_RESULT_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_MOVE_RESULT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_RESULT.S |
| * |
| * Code: Copies a return value to a register |
| * |
| * For: move-result, move-result-object |
| * |
| * Description: Move the single-word non-object result of the most |
| * recent method invocation into the indicated register. This |
| * must be done as the instruction immediately after a |
| * method invocation whose (single-word, non-object) result |
| * is not to be ignored; anywhere else is invalid. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| FFETCH_ADV 1, %ecx # %ecx<- next instruction hi; fetch, advance |
| movl offGlue_retval(%eax), %edx # %edx<- glue->retval |
| SET_VREG %edx, rINST # vA<- glue->retval |
| FGETOP_JMP 1, %ecx # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MOVE_EXCEPTION: /* 0x0d */ |
| /* File: x86-atom/OP_MOVE_EXCEPTION.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE_EXCEPTION.S |
| * |
| * Code: Moves an exception to a register |
| * |
| * For: move-exception |
| * |
| * Description: Save a just-caught exception into the given register. This |
| * instruction is only valid as the first instruction of an |
| * exception handler. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_self(%eax), %ecx # %ecx<- glue->self |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movl offThread_exception(%ecx), %edx # %edx<- glue->self->exception |
| movl $0, offThread_exception(%ecx) # clear exception |
| SET_VREG %edx, rINST # vAA<- glue->self->exception |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RETURN_VOID: /* 0x0e */ |
| /* File: x86-atom/OP_RETURN_VOID.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RETURN_VOID.S |
| */ |
| |
| jmp common_returnFromMethod |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RETURN: /* 0x0f */ |
| /* File: x86-atom/OP_RETURN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RETURN.S |
| */ |
| |
| /* File: x86-atom/OP_RETURN_COMMON.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RETURN_COMMON.S |
| * |
| * Code: Return a 32-bit value. Uses no substitutions. |
| * |
| * For: return, return-object |
| * |
| * Description: Copies the return value into the "glue" |
| * structure, then jumps to the return handler. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offGlue_retval(%edx) # glue->retval<- vAA |
| jmp common_returnFromMethod # jump to common return code |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RETURN_WIDE: /* 0x10 */ |
| /* File: x86-atom/OP_RETURN_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RETURN_WIDE.S |
| * |
| * Code: Return a 64-bit value. Uses no substitutions. |
| * |
| * For: return-wide |
| * |
| * Description: Copies the return value into the "glue" |
| * structure, then jumps to the return handler. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vAA |
| movq %xmm0, offGlue_retval(%edx)# glue->retval<- vAA |
| jmp common_returnFromMethod # jump to common return code |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RETURN_OBJECT: /* 0x11 */ |
| /* File: x86-atom/OP_RETURN_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RETURN_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_RETURN_COMMON.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RETURN_COMMON.S |
| * |
| * Code: Return a 32-bit value. Uses no substitutions. |
| * |
| * For: return, return-object |
| * |
| * Description: Copies the return value into the "glue" |
| * structure, then jumps to the return handler. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offGlue_retval(%edx) # glue->retval<- vAA |
| jmp common_returnFromMethod # jump to common return code |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_4: /* 0x12 */ |
| /* File: x86-atom/OP_CONST_4.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_4.S |
| * |
| * Code: Moves a literal to a register. Uses no substitutions. |
| * |
| * For: const/4 |
| * |
| * Description: Move the given literal value (right-sign-extended to 32 |
| * bits) into the specified register. |
| * |
| * Format: B|A|op (11n) |
| * |
| * Syntax: op vA, #+B |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| andl $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next i nstruction hi; fetch, advance |
| shl $24, %edx # %edx<- B000 |
| addl $2, rPC # update PC |
| sar $28, %edx # %edx<- right-zero-extended B |
| SET_VREG %edx, rINST # vA<- %edx; literal |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_16: /* 0x13 */ |
| /* File: x86-atom/OP_CONST_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_16.S |
| * |
| * Code: Moves a literal to a register. Uses no substitutions. |
| * |
| * For: const/16 |
| * |
| * Description: Move the given literal value (right-zero-extended to 32 |
| * bits) into the specified register |
| * |
| * Format: AA|op BBBB (21s) |
| * |
| * Syntax: op vAA, #+BBBB |
| */ |
| |
| FETCHs 1, %edx # %edx<- BBBB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| SET_VREG %edx rINST # vAA<- BBBB; literal |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST: /* 0x14 */ |
| /* File: x86-atom/OP_CONST.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST.S |
| * |
| * Code: Move a literal to a register. Uses no substitutions. |
| * |
| * For: const |
| * |
| * Description: Move the given literal value into the specified register |
| * |
| * Format: AA|op BBBBlo BBBBhi (31i) |
| * |
| * Syntax: op vAA, #+BBBBBBBB |
| */ |
| |
| FETCH 2, %edx # %edx<- BBBBhi |
| FETCH 1, %ecx # %ecx<- BBBBlo |
| shl $16, %edx # move BBBB to high bits |
| or %edx, %ecx # %ecx<- #+BBBBBBBB |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| SET_VREG %ecx, rINST # vAA<- %ecx; literal |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_HIGH16: /* 0x15 */ |
| /* File: x86-atom/OP_CONST_HIGH16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_HIGH16.S |
| * |
| * Code: Move a literal to a register. Uses no substitutions. |
| * |
| * For: const/high16 |
| * |
| * Description: Move the given literal value (right-zero-extended to 32 |
| * bits) into the specified register |
| * |
| * Format: AA|op BBBB (21h) |
| * |
| * Syntax: op vAA, #+BBBB0000 |
| */ |
| |
| FETCH 1, %ecx # %ecx<- 0000BBBB (zero-extended) |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| shl $16, %ecx # %ecx<- BBBB0000 |
| SET_VREG %ecx, rINST # vAA<- %ecx; BBBB0000 |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_WIDE_16: /* 0x16 */ |
| /* File: x86-atom/OP_CONST_WIDE_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_WIDE_16.S |
| * |
| * Code: Move a literal to a register. Uses no substitutions. |
| * |
| * For: const-wide/16 |
| * |
| * Description: Move the given literal value (sign-extended to 64 bits) |
| * into the specified register-pair |
| * |
| * Format: AA|op BBBB (21s) |
| * |
| * Syntax: op vAA, #+BBBB |
| */ |
| |
| FETCHs 1, %ecx # %ecx<- ssssBBBB (sign-extended) |
| movl %ecx, %edx # %edx<- ssssBBBB (sign-extended) |
| sar $31, %ecx # %ecx<- sign bit |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl %edx, (rFP, rINST, 4) # vAA<- ssssBBBB |
| movl %ecx, 4(rFP, rINST, 4) # vAA+1<- ssssssss |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_WIDE_32: /* 0x17 */ |
| /* File: x86-atom/OP_CONST_WIDE_32.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_WIDE_32.S |
| * |
| * Code: Move a literal to a register. Uses no substitutions. |
| * |
| * For: const-wide/32 |
| * |
| * Description: Move the given literal value (sign-extended to 64 bits) |
| * into the specified register-pair |
| * |
| * Format: AA|op BBBBlo BBBBhi (31i) |
| * |
| * Syntax: op vAA, #+BBBBBBBB |
| */ |
| |
| FETCH 1, %edx # %edx<- BBBBlo |
| FETCHs 2, %ecx # %ecx<- BBBBhi |
| shl $16, %ecx # prepare to create #+BBBBBBBB |
| or %ecx, %edx # %edx<- %edx<- #+BBBBBBBB |
| sar $31, %ecx # %ecx<- sign bit |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| movl %edx, (rFP, rINST, 4) # vAA<- BBBBBBBB |
| movl %ecx, 4(rFP, rINST, 4) # vAA+1<- ssssssss |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_WIDE: /* 0x18 */ |
| /* File: x86-atom/OP_CONST_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_WIDE.S |
| * |
| * Code: Move a literal to a register. Uses no substitutions. |
| * |
| * For: const-wide |
| * |
| * Description: Move the given literal value into the specified |
| * register pair |
| * |
| * Format: AA|op BBBBlolo BBBBlohi BBBBhilo BBBBhihi (51l) |
| * |
| * Syntax: op vAA, #+BBBBBBBBBBBBBBBB |
| */ |
| |
| FETCH 1, %ecx # %ecx<- BBBBlolo |
| FETCH 2, %edx # %edx<- BBBBlohi |
| shl $16, %edx # %edx<- prepare to create #+BBBBBBBBlo |
| or %edx, %ecx # %ecx<- #+BBBBBBBBlo |
| movl %ecx, (rFP, rINST, 4) # vAA <- #+BBBBBBBBlo |
| FETCH 3, %ecx # %ecx<- BBBBhilo |
| FETCH 4, %edx # %edx<- BBBBhihi |
| FFETCH_ADV 5, %eax # %eax<- next instruction hi; fetch, advance |
| shl $16, %edx # %edx<- prepare to create #+BBBBBBBBhi |
| or %edx, %ecx # %ecx<- #+BBBBBBBBhi |
| movl %ecx, 4(rFP, rINST, 4) # vAA+1 <- #+BBBBBBBBlo |
| FGETOP_JMP 5, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_WIDE_HIGH16: /* 0x19 */ |
| /* File: x86-atom/OP_CONST_WIDE_HIGH16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_WIDE_HIGH16.S |
| * |
| * Code: Move a literal value to a register. Uses no substitutions. |
| * |
| * For: const-wide/high16 |
| * |
| * Description: Move the given literal value (right-zero-extended to 64 |
| * bits) into the specified register |
| * |
| * Format: AA|op BBBB (21h) |
| * |
| * Syntax: op vAA, #+BBBB000000000000 |
| */ |
| |
| FETCH 1, %ecx # %ecx<- 0000BBBB (zero-extended) |
| shl $16, %ecx # rINST<- AA |
| movl $0, (rFP, rINST, 4) # vAAlow<- 00000000 |
| movl %ecx, 4(rFP, rINST, 4) # vAAhigh<- %ecx; BBBB0000 |
| FINISH 2 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_STRING: /* 0x1a */ |
| /* File: x86-atom/OP_CONST_STRING.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_STRING.S |
| * |
| * Code: Move a string reference to a register. Uses no substitutions. |
| * |
| * For: const/string |
| * |
| * Description: Move a referece to the string specified by the given |
| * index into the specified register. vAA <- pResString[BBBB] |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| FETCH 1, %ecx # %ecx<- BBBB |
| movl rGLUE, %edx # get MterpGlue pointer |
| movl offGlue_methodClassDex(%edx), %eax # %eax<- glue->methodClassDex |
| movl offDvmDex_pResStrings(%eax), %eax # %eax<- glue->methodClassDex->pResStrings |
| movl (%eax, %ecx, 4), %eax # %eax<- pResStrings[BBBB] |
| cmp $0, %eax # check if string is resolved |
| je .LOP_CONST_STRING_resolve # resolve string reference |
| SET_VREG %eax, rINST # vAA<- %eax; pResString[BBBB] |
| FINISH 2 # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_STRING_JUMBO: /* 0x1b */ |
| /* File: x86-atom/OP_CONST_STRING_JUMBO.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_STRING_JUMBO.S |
| * |
| * Code: Move a string reference to a register. Uses no substitutions. |
| * |
| * For: const/string-jumbo |
| * |
| * Description: Move a reference to the string specified by the given |
| * index into the specified register. vAA <- pResString[BBBB] |
| * |
| * Format: AA|op BBBBlo BBBBhi (31c) |
| * |
| * Syntax: op vAA, string@BBBBBBBB |
| */ |
| |
| movl rGLUE, %edx # get MterpGlue pointer |
| movl offGlue_methodClassDex(%edx), %eax # %eax<- glue->methodClassDex |
| movl offDvmDex_pResStrings(%eax), %eax # %eax<- glue->methodClassDex->pResStrings |
| FETCH 1, %ecx # %ecx<- BBBBlo |
| FETCH 2, %edx # %edx<- BBBBhi |
| shl $16, %edx # %edx<- prepare to create &BBBBBBBB |
| or %edx, %ecx # %ecx<- &BBBBBBBB |
| movl (%eax, %ecx, 4), %eax # %eax<- pResStrings[BBBB] |
| cmp $0, %eax # check if string is resolved |
| je .LOP_CONST_STRING_JUMBO_resolve # resolve string reference |
| SET_VREG %eax, rINST # vAA<- %eax; pResString[BBBB] |
| FINISH 3 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CONST_CLASS: /* 0x1c */ |
| /* File: x86-atom/OP_CONST_CLASS.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CONST_CLASS.S |
| * |
| * Code: Move a class reference to a register. Uses no substitutions. |
| * |
| * For: const/class |
| * |
| * Description: Move a reference to the class specified |
| * by the given index into the specified register. |
| * In the case where the indicated type is primitive, |
| * this will store a reference to the primitive type's |
| * degenerate class. |
| * |
| * Format: AA|op BBBBlo BBBBhi (21c) |
| * |
| * Syntax: op vAA, field@BBBB |
| */ |
| |
| movl rGLUE, %edx # get MterpGlue pointer |
| FETCH 1, %ecx # %ecx<- BBBB |
| movl offGlue_methodClassDex(%edx), %eax # %eax<- pDvmDex |
| movl offDvmDex_pResClasses(%eax), %eax # %eax<- pDvmDex->pResClasses |
| movl (%eax, %ecx, 4), %eax # %eax<- resolved class |
| cmp $0, %eax # check if classes is resolved before? |
| je .LOP_CONST_CLASS_resolve # resolve class |
| SET_VREG %eax, rINST # vAA<- resolved class |
| FINISH 2 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MONITOR_ENTER: /* 0x1d */ |
| /* File: x86-atom/OP_MONITOR_ENTER.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MONITOR_ENTER.S |
| * |
| * Code: Aquire a monitor |
| * |
| * For: monitor-enter |
| * |
| * Description: Aquire a monitor for the indicated object. |
| * |
| * |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| GET_VREG rINST # rINST<- vAA |
| cmp $0, rINST # check for null object |
| movl offGlue_self(%eax), %eax # %eax<- glue->self |
| #ifdef WITH_MONITOR_TRACKING |
| EXPORT_PC # export PC so we can grab stack trace |
| #endif |
| je common_errNullObject # handle null object |
| # jmp .LOP_MONITOR_ENTER_finish |
| #%break |
| #.LOP_MONITOR_ENTER_finish: |
| movl rINST, -4(%esp) # push parameter reference |
| movl %eax, -8(%esp) # push parameter |
| lea -8(%esp), %esp |
| call dvmLockObject # call: (struct Thread* self, |
| # struct Object* obj) |
| # return: void |
| FFETCH_ADV 1, %edx # %edx<- next instruction hi; fetch, advance |
| lea 8(%esp), %esp |
| #ifdef WITH_DEADLOCK_PREDICTION |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_self(%eax), %eax # %eax<- glue->self |
| movl offThread_exception(%eax), %eax # %eax<- glue->self->exception |
| cmp $0, %eax # check for exception |
| jne common_exceptionThrown # handle exception |
| #endif |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MONITOR_EXIT: /* 0x1e */ |
| /* File: x86-atom/OP_MONITOR_EXIT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MONITOR_EXIT.S |
| * |
| * Code: Release a monitor |
| * |
| * For: monitor-exit |
| * |
| * Description: Release a monitor for the indicated object. If this instruction needs |
| * to throw an execption, it must do so as if the pc has already |
| * advanced pased the instruction. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| EXPORT_PC # export the pc |
| GET_VREG rINST # rINST<- vAA |
| cmp $0, rINST # rINST<- check for null object |
| je common_errNullObject # handle null object |
| push rINST # push parameter object |
| push offGlue_self(%eax) # push parameter self |
| call dvmUnlockObject # call: (struct Thread* self, |
| # struct Object* obj) |
| # return: bool |
| FINISH_FETCH_ADVANCE 1, %edx # advance pc before exception |
| cmp $0, %eax # check for success |
| lea 8(%esp), %esp |
| je common_exceptionThrown # handle exception |
| FINISH_JMP %edx # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CHECK_CAST: /* 0x1f */ |
| /* File: x86-atom/OP_CHECK_CAST.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CHECK_CAST.S |
| * |
| * Code: Checks to see if a cast is allowed. Uses no substitutions. |
| * |
| * For: check-cast |
| * |
| * Description: Throw if the reference in the given register cannot be |
| * cast to the indicated type. The type must be a reference |
| * type (not a primitive type). |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, type@BBBB |
| */ |
| |
| movl rGLUE, %edx # get MterpGlue pointer |
| movl offGlue_methodClassDex(%edx), %eax # %eax<- pDvmDex |
| GET_VREG rINST # rINST<- vAA |
| movl offDvmDex_pResClasses(%eax), %eax # %eax<- pDvmDex->pResClasses |
| cmp $0, rINST # check for null reference object |
| je .LOP_CHECK_CAST_okay # can always cast null object |
| FETCH 1, %ecx # %ecx<- BBBB |
| movl (%eax, %ecx, 4), %ecx # %ecx<- resolved class |
| cmp $0, %ecx # check if classes is resolved before? |
| je .LOP_CHECK_CAST_resolve # resolve class |
| jmp .LOP_CHECK_CAST_resolved # continue |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INSTANCE_OF: /* 0x20 */ |
| /* File: x86-atom/OP_INSTANCE_OF.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INSTANCE_OF.S |
| * |
| * Code: Checks if object is instance of a class. Uses no substitutions. |
| * |
| * For: instance-of |
| * |
| * Description: Store in the given destination register 1 if the indicated |
| * reference is an instance of the given type, or 0 if not. |
| * The type must be a reference type (not a primitive type). |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| GET_VREG %edx # %edx<- vB |
| cmp $0, %edx # check for null object |
| je .LOP_INSTANCE_OF_store # null object |
| jmp .LOP_INSTANCE_OF_break |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ARRAY_LENGTH: /* 0x21 */ |
| /* File: x86-atom/OP_ARRAY_LENGTH.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ARRAY_LENGTH.S |
| * |
| * Code: 32-bit array length operation. |
| * |
| * For: array-length |
| * |
| * Description: Store the length of the indicated array in the given |
| * destination register. vB <- offArrayObject_length(vA) |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| andl $15, rINST # rINST<- A |
| FFETCH_ADV 1, %edx # %edx<- next instruction hi; fetch, advance |
| GET_VREG %eax # %eax<- vB |
| testl %eax, %eax # check for null array object |
| je common_errNullObject # handle null array object |
| movl offArrayObject_length(%eax), %eax # %eax<- array length |
| movl %eax, (rFP, rINST, 4) # vA<- %eax; array length |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NEW_INSTANCE: /* 0x22 */ |
| /* File: x86-atom/OP_NEW_INSTANCE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NEW_INSTANCE.S |
| * |
| * Code: Create a new instance of a given type. Uses no substitutions. |
| * |
| * For: new-instance |
| * |
| * Description: Construct a new instance of the indicated type, |
| * storing a reference to it in the destination. |
| * The type must refer to a non-array class. |
| * |
| * |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, type@BBBB |
| * op vAA, field@BBBB |
| * op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_methodClassDex(%ecx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %edx # %edx<- BBBB |
| movl offDvmDex_pResClasses(%ecx), %ecx # %ecx<- glue->pDvmDex->pResClasses |
| movl (%ecx, %edx, 4), %edx # %edx<- vB |
| EXPORT_PC # required for resolve |
| cmp $0, %edx # check for null |
| je .LOP_NEW_INSTANCE_resolve # need to resolve |
| |
| /* |
| * %edx holds class object |
| */ |
| |
| .LOP_NEW_INSTANCE_resolved: |
| movzbl offClassObject_status(%edx), %eax # %eax<- class status |
| cmp $CLASS_INITIALIZED, %eax # check if class is initialized |
| jne .LOP_NEW_INSTANCE_needinit # initialize class |
| |
| /* |
| * %edx holds class object |
| */ |
| |
| .LOP_NEW_INSTANCE_initialized: |
| testl $(ACC_INTERFACE|ACC_ABSTRACT), offClassObject_accessFlags(%edx) |
| mov $ALLOC_DONT_TRACK, %eax # %eax<- flag for alloc call |
| je .LOP_NEW_INSTANCE_finish # continue |
| jmp .LOP_NEW_INSTANCE_abstract # handle abstract or interface |
| |
| /* |
| * %edx holds class object |
| * %eax holds flags for alloc call |
| */ |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NEW_ARRAY: /* 0x23 */ |
| /* File: x86-atom/OP_NEW_ARRAY.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NEW_ARRAY.S |
| * |
| * Code: Create a new array. Uses no substitutions. |
| * |
| * For: new-array |
| * |
| * Description: Construct a new array of the indicated type and size. |
| * The type must be an array type. |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| movl offGlue_methodClassDex(%eax), %eax # %eax<- glue->pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| GET_VREG %edx # %edx<- vB |
| movl offDvmDex_pResClasses(%eax), %eax # %eax<- glue->pDvmDex->pResClasses |
| cmp $0, %edx # check for negative length |
| movl (%eax, %ecx, 4), %eax # %eax<- resolved class |
| js common_errNegativeArraySize # handle negative array length |
| cmp $0, %eax # check for null |
| EXPORT_PC # required for resolve |
| jne .LOP_NEW_ARRAY_finish # already resovled so continue |
| jmp .LOP_NEW_ARRAY_resolve # need to resolve |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_FILLED_NEW_ARRAY: /* 0x24 */ |
| /* File: x86-atom/OP_FILLED_NEW_ARRAY.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FILLED_NEW_ARRAY.S |
| * |
| * Code: Constructs and fills an array with the given data. Provides |
| * |
| * For: float-to-int |
| * |
| * Description: Construct an array of the given type and size, |
| * filling it with the supplied contents. The type |
| * must be an array type. The array's contents |
| * must be single-word. The constructed instance |
| * is stored as a result in the same way that the |
| * method invocation instructions store their results, |
| * so the constructed instance must be moved to a |
| * register with a subsequent move-result-object |
| * instruction. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) (range) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, vtaboff@CCCC |
| * [B=4] op {vD, vE, vF, vG}, vtaboff@CCCC |
| * [B=3] op {vD, vE, vF}, vtaboff@CCCC |
| * [B=2] op {vD, vE}, vtaboff@CCCC |
| * [B=1] op {vD}, vtaboff@CCCC |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB |
| * op {vCCCC .. vNNNN}, type@BBBB |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- MterpGlue pointer |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- glue->methodClassDex |
| movl offDvmDex_pResClasses(%edx), %edx # %edx<- glue->methodClassDex->pResClasses |
| FETCH 1, %ecx # %ecx<- BBBB |
| EXPORT_PC |
| movl (%edx, %ecx, 4), %eax # %eax<- possibly resolved class |
| cmp $0, %eax # %eax<- check if already resolved |
| jne .LOP_FILLED_NEW_ARRAY_continue |
| jmp .LOP_FILLED_NEW_ARRAY_break |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_FILLED_NEW_ARRAY_RANGE: /* 0x25 */ |
| /* File: x86-atom/OP_FILLED_NEW_ARRAY_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FILLED_NEW_ARRAY_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_FILLED_NEW_ARRAY.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FILLED_NEW_ARRAY.S |
| * |
| * Code: Constructs and fills an array with the given data. Provides |
| * |
| * For: float-to-int |
| * |
| * Description: Construct an array of the given type and size, |
| * filling it with the supplied contents. The type |
| * must be an array type. The array's contents |
| * must be single-word. The constructed instance |
| * is stored as a result in the same way that the |
| * method invocation instructions store their results, |
| * so the constructed instance must be moved to a |
| * register with a subsequent move-result-object |
| * instruction. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) (range) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, vtaboff@CCCC |
| * [B=4] op {vD, vE, vF, vG}, vtaboff@CCCC |
| * [B=3] op {vD, vE, vF}, vtaboff@CCCC |
| * [B=2] op {vD, vE}, vtaboff@CCCC |
| * [B=1] op {vD}, vtaboff@CCCC |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB |
| * op {vCCCC .. vNNNN}, type@BBBB |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- MterpGlue pointer |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- glue->methodClassDex |
| movl offDvmDex_pResClasses(%edx), %edx # %edx<- glue->methodClassDex->pResClasses |
| FETCH 1, %ecx # %ecx<- BBBB |
| EXPORT_PC |
| movl (%edx, %ecx, 4), %eax # %eax<- possibly resolved class |
| cmp $0, %eax # %eax<- check if already resolved |
| jne .LOP_FILLED_NEW_ARRAY_RANGE_continue |
| jmp .LOP_FILLED_NEW_ARRAY_RANGE_break |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_FILL_ARRAY_DATA: /* 0x26 */ |
| /* File: x86-atom/OP_FILL_ARRAY_DATA.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FILL_ARRAY_DATA.S |
| * |
| * Code: Fills an array with given data. Uses no substitutions. |
| * |
| * For: fill-array-data |
| * |
| * Description: Fill the given array with the idicated data. The reference |
| * must be an array of primitives, and the data table must |
| * match it in type and size |
| * |
| * Format: AA|op BBBBlo BBBBhi (31t) |
| * |
| * Syntax: op vAA, +BBBBBBBB |
| */ |
| |
| FETCH 1, %ecx # %ecx<- BBBBlo |
| FETCH 2, %edx # %edx<- BBBBhi |
| shl $16, %edx # prepare to create +BBBBBBBB |
| or %ecx, %edx # %edx<- +BBBBBBBB |
| lea (rPC, %edx, 2), %edx # %edx<- PC + +BBBBBBBB; array data location |
| EXPORT_PC |
| push %edx |
| push (rFP, rINST, 4) |
| call dvmInterpHandleFillArrayData # call: (ArrayObject* arrayObject, const u2* arrayData) |
| # return: bool |
| FFETCH_ADV 3, %edx # %edx<- next instruction hi; fetch, advance |
| cmp $0, %eax |
| lea 8(%esp), %esp |
| je common_exceptionThrown |
| FGETOP_JMP 3, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_THROW: /* 0x27 */ |
| /* File: x86-atom/OP_THROW.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_THROW.S |
| * |
| * Code: Throw an exception |
| * |
| * For: throw |
| * |
| * Description: Throw an exception object in the current thread. |
| * |
| * Format: AA|op (11x) |
| * |
| * Syntax: op vAA |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| GET_VREG rINST # rINST<- vAA |
| cmp $0, rINST # check for null |
| movl offGlue_self(%eax), %ecx # %ecx<- glue->self |
| je common_errNullObject # handle null object |
| movl rINST, offThread_exception(%ecx) # thread->exception<- object |
| jmp common_exceptionThrown # handle exception |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_GOTO: /* 0x28 */ |
| /* File: x86-atom/OP_GOTO.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_GOTO.S |
| * |
| * Code: Do an unconditional branch. Uses no substitutions. |
| * |
| * For: goto |
| * |
| * Description: Performs an unconditionally jump to the indicated instruction. |
| * The branch uses an 8-bit offset that cannot be zero. |
| * |
| * Format: AA|op (10t) |
| * |
| * Syntax: op +AA |
| */ |
| |
| LOP_GOTO.S: |
| |
| movsbl rINSTbl, %edx # %edx<- +AA |
| shl $1, %edx # %edx is shifted for byte offset |
| js common_periodicChecks2 # do check on backwards branch |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_GOTO_16: /* 0x29 */ |
| /* File: x86-atom/OP_GOTO_16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_GOTO_16.S |
| * |
| * Code: Do an unconditional branch. Uses no substitutions. |
| * |
| * For: goto/16 |
| * |
| * Description: Performs an unconditionally jump to the indicated instruction. |
| * The branch uses a 16-bit offset that cannot be zero. |
| * |
| * Format: ØØ|op AAAA (20t) |
| * |
| * Syntax: op +AAAA |
| */ |
| |
| FETCHs 1, %edx # %edx<- ssssAAAA (sign-extended) |
| shl $1, %edx # %edx is doubled to get the byte offset |
| js common_periodicChecks2 # do check on backwards branch |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_GOTO_32: /* 0x2a */ |
| /* File: x86-atom/OP_GOTO_32.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_GOTO_32.S |
| * |
| * Code: Do an unconditional branch. Uses no substitutions. |
| * |
| * For: goto/32 |
| * |
| * Description: Performs an unconditionally jump to the indicated instruction. |
| * The branch uses a 32-bit offset that can be zero. |
| * |
| * Format: ØØ|op AAAAlo AAAAhi (30t) |
| * |
| * Syntax: op +AAAAAAAA |
| */ |
| |
| FETCH 1, %edx # %edx<- AAAAlo |
| FETCH 2, %ecx # %ecx<- AAAAhi |
| shl $16, %ecx # prepare to create +AAAAAAAA |
| or %ecx, %edx # %edx<- +AAAAAAAA |
| shl $1, %edx # %edx is doubled to get the byte offset |
| jle common_periodicChecks2 # do check on backwards branch |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_PACKED_SWITCH: /* 0x2b */ |
| /* File: x86-atom/OP_PACKED_SWITCH.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_PACKED_SWITCH.S |
| * |
| * Code: Jump to a new instruction using a jump table |
| * |
| * For: packed-switch, sparse-switch |
| * |
| * Description: Jump to a new instruction based on the value in the given |
| * register, using a table of offsets corresponding to each |
| * value in a particular integral range, or fall through to |
| * the next instruction if there is no match. |
| * |
| * Format: AA|op BBBBlo BBBBhi (31t) |
| * |
| * Syntax: op vAA, +BBBBBBBB |
| */ |
| |
| |
| FETCH 1, %ecx # %ecx<- BBBBlo |
| FETCH 2, %edx # %edx<- BBBBhi |
| shl $16, %edx # prepare to create +BBBBBBBB |
| or %edx, %ecx # %ecx<- +BBBBBBBB |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, -4(%esp) # push parameter vAA |
| lea (rPC, %ecx, 2), %ecx # %ecx<- PC + +BBBBBBBB*2 |
| movl %ecx, -8(%esp) # push parameter PC + +BBBBBBBB*2 |
| lea -8(%esp), %esp |
| call dvmInterpHandlePackedSwitch # call code-unit branch offset |
| shl $1, %eax # shift for byte offset |
| movl %eax, %edx # %edx<- offset |
| lea 8(%esp), %esp |
| jle common_periodicChecks2 # do backward branch |
| jmp .LOP_PACKED_SWITCH_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPARSE_SWITCH: /* 0x2c */ |
| /* File: x86-atom/OP_SPARSE_SWITCH.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPARSE_SWITCH.S |
| */ |
| |
| /* File: x86-atom/OP_PACKED_SWITCH.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_PACKED_SWITCH.S |
| * |
| * Code: Jump to a new instruction using a jump table |
| * |
| * For: packed-switch, sparse-switch |
| * |
| * Description: Jump to a new instruction based on the value in the given |
| * register, using a table of offsets corresponding to each |
| * value in a particular integral range, or fall through to |
| * the next instruction if there is no match. |
| * |
| * Format: AA|op BBBBlo BBBBhi (31t) |
| * |
| * Syntax: op vAA, +BBBBBBBB |
| */ |
| |
| |
| FETCH 1, %ecx # %ecx<- BBBBlo |
| FETCH 2, %edx # %edx<- BBBBhi |
| shl $16, %edx # prepare to create +BBBBBBBB |
| or %edx, %ecx # %ecx<- +BBBBBBBB |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, -4(%esp) # push parameter vAA |
| lea (rPC, %ecx, 2), %ecx # %ecx<- PC + +BBBBBBBB*2 |
| movl %ecx, -8(%esp) # push parameter PC + +BBBBBBBB*2 |
| lea -8(%esp), %esp |
| call dvmInterpHandleSparseSwitch # call code-unit branch offset |
| shl $1, %eax # shift for byte offset |
| movl %eax, %edx # %edx<- offset |
| lea 8(%esp), %esp |
| jle common_periodicChecks2 # do backward branch |
| jmp .LOP_SPARSE_SWITCH_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CMPL_FLOAT: /* 0x2d */ |
| /* File: x86-atom/OP_CMPL_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPL_FLOAT.S |
| * |
| * Code: Provides a "nan" variable to specify the return value for |
| * NaN. Provides a variable "sod" which appends a "s" or a "d" |
| * to the move and comparison instructions, depending on if we |
| * are working with a float or a double. For instructions |
| * cmpx-float and cmpx-double, the x will be eiher a g or a l |
| * to specify positive or negative bias for NaN. |
| * |
| * For: cmpg-double, dmpg-float, cmpl-double, cmpl-float |
| * |
| * Description: Perform the indicated floating point or long comparison, |
| * storing 0 if the two arguments are equal, 1 if the second |
| * argument is larger, or -1 if the first argument is larger. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| |
| flds (rFP, %edx, 4) |
| flds (rFP, %ecx, 4) |
| |
| fucompp |
| fnstsw %ax |
| sahf |
| |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| ja .LOP_CMPL_FLOAT_greater |
| jp .LOP_CMPL_FLOAT_finalNan |
| jz .LOP_CMPL_FLOAT_final |
| |
| .LOP_CMPL_FLOAT_less: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- less than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CMPG_FLOAT: /* 0x2e */ |
| /* File: x86-atom/OP_CMPG_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPG_FLOAT.S |
| */ |
| |
| /* File: x86-atom/OP_CMPL_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPL_FLOAT.S |
| * |
| * Code: Provides a "nan" variable to specify the return value for |
| * NaN. Provides a variable "sod" which appends a "s" or a "d" |
| * to the move and comparison instructions, depending on if we |
| * are working with a float or a double. For instructions |
| * cmpx-float and cmpx-double, the x will be eiher a g or a l |
| * to specify positive or negative bias for NaN. |
| * |
| * For: cmpg-double, dmpg-float, cmpl-double, cmpl-float |
| * |
| * Description: Perform the indicated floating point or long comparison, |
| * storing 0 if the two arguments are equal, 1 if the second |
| * argument is larger, or -1 if the first argument is larger. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| |
| flds (rFP, %edx, 4) |
| flds (rFP, %ecx, 4) |
| |
| fucompp |
| fnstsw %ax |
| sahf |
| |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| ja .LOP_CMPG_FLOAT_greater |
| jp .LOP_CMPG_FLOAT_finalNan |
| jz .LOP_CMPG_FLOAT_final |
| |
| .LOP_CMPG_FLOAT_less: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- less than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CMPL_DOUBLE: /* 0x2f */ |
| /* File: x86-atom/OP_CMPL_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPL_DOUBLE.S |
| */ |
| |
| /* File: x86-atom/OP_CMPL_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPL_FLOAT.S |
| * |
| * Code: Provides a "nan" variable to specify the return value for |
| * NaN. Provides a variable "sod" which appends a "s" or a "d" |
| * to the move and comparison instructions, depending on if we |
| * are working with a float or a double. For instructions |
| * cmpx-float and cmpx-double, the x will be eiher a g or a l |
| * to specify positive or negative bias for NaN. |
| * |
| * For: cmpg-double, dmpg-float, cmpl-double, cmpl-float |
| * |
| * Description: Perform the indicated floating point or long comparison, |
| * storing 0 if the two arguments are equal, 1 if the second |
| * argument is larger, or -1 if the first argument is larger. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| |
| fldl (rFP, %edx, 4) |
| fldl (rFP, %ecx, 4) |
| |
| fucompp |
| fnstsw %ax |
| sahf |
| |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| ja .LOP_CMPL_DOUBLE_greater |
| jp .LOP_CMPL_DOUBLE_finalNan |
| jz .LOP_CMPL_DOUBLE_final |
| |
| .LOP_CMPL_DOUBLE_less: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- less than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CMPG_DOUBLE: /* 0x30 */ |
| /* File: x86-atom/OP_CMPG_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPG_DOUBLE.S |
| */ |
| |
| /* File: x86-atom/OP_CMPL_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMPL_FLOAT.S |
| * |
| * Code: Provides a "nan" variable to specify the return value for |
| * NaN. Provides a variable "sod" which appends a "s" or a "d" |
| * to the move and comparison instructions, depending on if we |
| * are working with a float or a double. For instructions |
| * cmpx-float and cmpx-double, the x will be eiher a g or a l |
| * to specify positive or negative bias for NaN. |
| * |
| * For: cmpg-double, dmpg-float, cmpl-double, cmpl-float |
| * |
| * Description: Perform the indicated floating point or long comparison, |
| * storing 0 if the two arguments are equal, 1 if the second |
| * argument is larger, or -1 if the first argument is larger. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| |
| fldl (rFP, %edx, 4) |
| fldl (rFP, %ecx, 4) |
| |
| fucompp |
| fnstsw %ax |
| sahf |
| |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| ja .LOP_CMPG_DOUBLE_greater |
| jp .LOP_CMPG_DOUBLE_finalNan |
| jz .LOP_CMPG_DOUBLE_final |
| |
| .LOP_CMPG_DOUBLE_less: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- less than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_CMP_LONG: /* 0x31 */ |
| /* File: x86-atom/OP_CMP_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_CMP_LONG.S |
| * |
| * Code: Compare floating point values. Uses no substitutions. |
| * |
| * For: cmp-long |
| * |
| * Description: Perform a long comparison, storing 0 if the two |
| * arguments are equal, 1 if the second argument is larger |
| * or -1 if the first argument is larger. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| movl 4(rFP, %ecx, 4), %eax # %eax<- vBBhi |
| cmp 4(rFP, %edx, 4), %eax # compare vCChi and vBBhi |
| jl .LOP_CMP_LONG_less |
| jg .LOP_CMP_LONG_greater |
| movl (rFP, %ecx, 4), %eax # %eax<- vBBlo |
| cmp (rFP, %edx, 4), %eax # compare vCClo and vBBlo |
| ja .LOP_CMP_LONG_greater |
| jne .LOP_CMP_LONG_less |
| jmp .LOP_CMP_LONG_final |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_EQ: /* 0x32 */ |
| /* File: x86-atom/OP_IF_EQ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_EQ.S |
| */ |
| |
| /* File: x86-atom/bincmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: bincmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform. |
| * |
| * For: if-eq, if-ge, if-gt, if-le, if-lt, if-ne |
| * |
| * Description: Branch to the given destination if the comparison |
| * test between the given registers values is true. |
| * |
| * Format: B|A|op CCCC (22t) |
| * |
| * Syntax: op vA, vB, +CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| andl $15, rINST # rINST<- A |
| shr $4, %eax # %eax<- B |
| GET_VREG rINST # rINST<- vA |
| movl $4, %edx # %edx<- 4 |
| cmp (rFP, %eax, 4), rINST # compare vA and vB |
| jne 1f # goto next instruction if reverse |
| # comparison is true |
| FETCHs 1, %edx # %edx<- +CCCC, Branch offset |
| sal $1, %edx |
| js common_periodicChecks2 |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_NE: /* 0x33 */ |
| /* File: x86-atom/OP_IF_NE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_NE.S |
| */ |
| |
| /* File: x86-atom/bincmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: bincmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform. |
| * |
| * For: if-eq, if-ge, if-gt, if-le, if-lt, if-ne |
| * |
| * Description: Branch to the given destination if the comparison |
| * test between the given registers values is true. |
| * |
| * Format: B|A|op CCCC (22t) |
| * |
| * Syntax: op vA, vB, +CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| andl $15, rINST # rINST<- A |
| shr $4, %eax # %eax<- B |
| GET_VREG rINST # rINST<- vA |
| movl $4, %edx # %edx<- 4 |
| cmp (rFP, %eax, 4), rINST # compare vA and vB |
| je 1f # goto next instruction if reverse |
| # comparison is true |
| FETCHs 1, %edx # %edx<- +CCCC, Branch offset |
| sal $1, %edx |
| js common_periodicChecks2 |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_LT: /* 0x34 */ |
| /* File: x86-atom/OP_IF_LT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_LT.S |
| */ |
| |
| /* File: x86-atom/bincmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: bincmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform. |
| * |
| * For: if-eq, if-ge, if-gt, if-le, if-lt, if-ne |
| * |
| * Description: Branch to the given destination if the comparison |
| * test between the given registers values is true. |
| * |
| * Format: B|A|op CCCC (22t) |
| * |
| * Syntax: op vA, vB, +CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| andl $15, rINST # rINST<- A |
| shr $4, %eax # %eax<- B |
| GET_VREG rINST # rINST<- vA |
| movl $4, %edx # %edx<- 4 |
| cmp (rFP, %eax, 4), rINST # compare vA and vB |
| jge 1f # goto next instruction if reverse |
| # comparison is true |
| FETCHs 1, %edx # %edx<- +CCCC, Branch offset |
| sal $1, %edx |
| js common_periodicChecks2 |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_GE: /* 0x35 */ |
| /* File: x86-atom/OP_IF_GE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_GE.S |
| */ |
| |
| /* File: x86-atom/bincmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: bincmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform. |
| * |
| * For: if-eq, if-ge, if-gt, if-le, if-lt, if-ne |
| * |
| * Description: Branch to the given destination if the comparison |
| * test between the given registers values is true. |
| * |
| * Format: B|A|op CCCC (22t) |
| * |
| * Syntax: op vA, vB, +CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| andl $15, rINST # rINST<- A |
| shr $4, %eax # %eax<- B |
| GET_VREG rINST # rINST<- vA |
| movl $4, %edx # %edx<- 4 |
| cmp (rFP, %eax, 4), rINST # compare vA and vB |
| jl 1f # goto next instruction if reverse |
| # comparison is true |
| FETCHs 1, %edx # %edx<- +CCCC, Branch offset |
| sal $1, %edx |
| js common_periodicChecks2 |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_GT: /* 0x36 */ |
| /* File: x86-atom/OP_IF_GT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_GT.S |
| */ |
| |
| /* File: x86-atom/bincmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: bincmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform. |
| * |
| * For: if-eq, if-ge, if-gt, if-le, if-lt, if-ne |
| * |
| * Description: Branch to the given destination if the comparison |
| * test between the given registers values is true. |
| * |
| * Format: B|A|op CCCC (22t) |
| * |
| * Syntax: op vA, vB, +CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| andl $15, rINST # rINST<- A |
| shr $4, %eax # %eax<- B |
| GET_VREG rINST # rINST<- vA |
| movl $4, %edx # %edx<- 4 |
| cmp (rFP, %eax, 4), rINST # compare vA and vB |
| jle 1f # goto next instruction if reverse |
| # comparison is true |
| FETCHs 1, %edx # %edx<- +CCCC, Branch offset |
| sal $1, %edx |
| js common_periodicChecks2 |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_LE: /* 0x37 */ |
| /* File: x86-atom/OP_IF_LE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_LE.S |
| */ |
| |
| /* File: x86-atom/bincmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: bincmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform. |
| * |
| * For: if-eq, if-ge, if-gt, if-le, if-lt, if-ne |
| * |
| * Description: Branch to the given destination if the comparison |
| * test between the given registers values is true. |
| * |
| * Format: B|A|op CCCC (22t) |
| * |
| * Syntax: op vA, vB, +CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| andl $15, rINST # rINST<- A |
| shr $4, %eax # %eax<- B |
| GET_VREG rINST # rINST<- vA |
| movl $4, %edx # %edx<- 4 |
| cmp (rFP, %eax, 4), rINST # compare vA and vB |
| jg 1f # goto next instruction if reverse |
| # comparison is true |
| FETCHs 1, %edx # %edx<- +CCCC, Branch offset |
| sal $1, %edx |
| js common_periodicChecks2 |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_EQZ: /* 0x38 */ |
| /* File: x86-atom/OP_IF_EQZ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_EQZ.S |
| */ |
| |
| /* File: x86-atom/zcmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: zcmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform |
| * |
| * For: if-eqz, if-gez, if-gtz, if-lez, if-ltz, if-nez |
| * |
| * Description: Branch to the given destination if the given register's |
| * value compares with 0 as specified. |
| * |
| * Format: AA|op BBBB (21t) |
| * |
| * Syntax: op vAA, +BBBB |
| */ |
| |
| cmp $0, (rFP, rINST, 4) # compare vAA with zero |
| jne OP_IF_EQZ_2f # goto next instruction or branch |
| FETCHs 1, %edx # %edx<- BBBB; branch offset |
| sal $1, %edx # %edx<- adjust byte offset |
| |
| /* |
| * Inline common_backwardBranch |
| */ |
| |
| js common_periodicChecks2 # jump on backwards branch |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* |
| * FINISH code |
| */ |
| |
| OP_IF_EQZ_2f: |
| movzbl 4(rPC), %edx # grab the next opcode |
| movzbl 5(rPC), rINST # update the instruction |
| addl $4, rPC # update the program counter |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_NEZ: /* 0x39 */ |
| /* File: x86-atom/OP_IF_NEZ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_NEZ.S |
| */ |
| |
| /* File: x86-atom/zcmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: zcmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform |
| * |
| * For: if-eqz, if-gez, if-gtz, if-lez, if-ltz, if-nez |
| * |
| * Description: Branch to the given destination if the given register's |
| * value compares with 0 as specified. |
| * |
| * Format: AA|op BBBB (21t) |
| * |
| * Syntax: op vAA, +BBBB |
| */ |
| |
| cmp $0, (rFP, rINST, 4) # compare vAA with zero |
| je OP_IF_NEZ_2f # goto next instruction or branch |
| FETCHs 1, %edx # %edx<- BBBB; branch offset |
| sal $1, %edx # %edx<- adjust byte offset |
| |
| /* |
| * Inline common_backwardBranch |
| */ |
| |
| js common_periodicChecks2 # jump on backwards branch |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* |
| * FINISH code |
| */ |
| |
| OP_IF_NEZ_2f: |
| movzbl 4(rPC), %edx # grab the next opcode |
| movzbl 5(rPC), rINST # update the instruction |
| addl $4, rPC # update the program counter |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_LTZ: /* 0x3a */ |
| /* File: x86-atom/OP_IF_LTZ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_LTZ.S |
| */ |
| |
| /* File: x86-atom/zcmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: zcmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform |
| * |
| * For: if-eqz, if-gez, if-gtz, if-lez, if-ltz, if-nez |
| * |
| * Description: Branch to the given destination if the given register's |
| * value compares with 0 as specified. |
| * |
| * Format: AA|op BBBB (21t) |
| * |
| * Syntax: op vAA, +BBBB |
| */ |
| |
| cmp $0, (rFP, rINST, 4) # compare vAA with zero |
| jge OP_IF_LTZ_2f # goto next instruction or branch |
| FETCHs 1, %edx # %edx<- BBBB; branch offset |
| sal $1, %edx # %edx<- adjust byte offset |
| |
| /* |
| * Inline common_backwardBranch |
| */ |
| |
| js common_periodicChecks2 # jump on backwards branch |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* |
| * FINISH code |
| */ |
| |
| OP_IF_LTZ_2f: |
| movzbl 4(rPC), %edx # grab the next opcode |
| movzbl 5(rPC), rINST # update the instruction |
| addl $4, rPC # update the program counter |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_GEZ: /* 0x3b */ |
| /* File: x86-atom/OP_IF_GEZ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_GEZ.S |
| */ |
| |
| /* File: x86-atom/zcmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: zcmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform |
| * |
| * For: if-eqz, if-gez, if-gtz, if-lez, if-ltz, if-nez |
| * |
| * Description: Branch to the given destination if the given register's |
| * value compares with 0 as specified. |
| * |
| * Format: AA|op BBBB (21t) |
| * |
| * Syntax: op vAA, +BBBB |
| */ |
| |
| cmp $0, (rFP, rINST, 4) # compare vAA with zero |
| jl OP_IF_GEZ_2f # goto next instruction or branch |
| FETCHs 1, %edx # %edx<- BBBB; branch offset |
| sal $1, %edx # %edx<- adjust byte offset |
| |
| /* |
| * Inline common_backwardBranch |
| */ |
| |
| js common_periodicChecks2 # jump on backwards branch |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* |
| * FINISH code |
| */ |
| |
| OP_IF_GEZ_2f: |
| movzbl 4(rPC), %edx # grab the next opcode |
| movzbl 5(rPC), rINST # update the instruction |
| addl $4, rPC # update the program counter |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_GTZ: /* 0x3c */ |
| /* File: x86-atom/OP_IF_GTZ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_GTZ.S |
| */ |
| |
| /* File: x86-atom/zcmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: zcmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform |
| * |
| * For: if-eqz, if-gez, if-gtz, if-lez, if-ltz, if-nez |
| * |
| * Description: Branch to the given destination if the given register's |
| * value compares with 0 as specified. |
| * |
| * Format: AA|op BBBB (21t) |
| * |
| * Syntax: op vAA, +BBBB |
| */ |
| |
| cmp $0, (rFP, rINST, 4) # compare vAA with zero |
| jle OP_IF_GTZ_2f # goto next instruction or branch |
| FETCHs 1, %edx # %edx<- BBBB; branch offset |
| sal $1, %edx # %edx<- adjust byte offset |
| |
| /* |
| * Inline common_backwardBranch |
| */ |
| |
| js common_periodicChecks2 # jump on backwards branch |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* |
| * FINISH code |
| */ |
| |
| OP_IF_GTZ_2f: |
| movzbl 4(rPC), %edx # grab the next opcode |
| movzbl 5(rPC), rINST # update the instruction |
| addl $4, rPC # update the program counter |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IF_LEZ: /* 0x3d */ |
| /* File: x86-atom/OP_IF_LEZ.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IF_LEZ.S |
| */ |
| |
| /* File: x86-atom/zcmp.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: zcmp.S |
| * |
| * Code: Generic 32-bit comparison operation. Provides a "revcmp" |
| * variable to specify the reverse comparison to perform |
| * |
| * For: if-eqz, if-gez, if-gtz, if-lez, if-ltz, if-nez |
| * |
| * Description: Branch to the given destination if the given register's |
| * value compares with 0 as specified. |
| * |
| * Format: AA|op BBBB (21t) |
| * |
| * Syntax: op vAA, +BBBB |
| */ |
| |
| cmp $0, (rFP, rINST, 4) # compare vAA with zero |
| jg OP_IF_LEZ_2f # goto next instruction or branch |
| FETCHs 1, %edx # %edx<- BBBB; branch offset |
| sal $1, %edx # %edx<- adjust byte offset |
| |
| /* |
| * Inline common_backwardBranch |
| */ |
| |
| js common_periodicChecks2 # jump on backwards branch |
| 1: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* |
| * FINISH code |
| */ |
| |
| OP_IF_LEZ_2f: |
| movzbl 4(rPC), %edx # grab the next opcode |
| movzbl 5(rPC), rINST # update the instruction |
| addl $4, rPC # update the program counter |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) # jump to next instruction |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_3E: /* 0x3e */ |
| /* File: x86-atom/OP_UNUSED_3E.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_3E.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_3F: /* 0x3f */ |
| /* File: x86-atom/OP_UNUSED_3F.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_3F.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_40: /* 0x40 */ |
| /* File: x86-atom/OP_UNUSED_40.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_40.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_41: /* 0x41 */ |
| /* File: x86-atom/OP_UNUSED_41.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_41.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_42: /* 0x42 */ |
| /* File: x86-atom/OP_UNUSED_42.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_42.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_43: /* 0x43 */ |
| /* File: x86-atom/OP_UNUSED_43.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_43.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET: /* 0x44 */ |
| /* File: x86-atom/OP_AGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET.S |
| * |
| * Code: Generic 32-bit array "get" operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * |
| * For: aget, aget-boolean, aget-byte, aget-char, aget-object, sget, aget-short |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the value |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| lea (%ecx, %edx, 4), %ecx # %ecx<- &vBB[vCC] |
| # trying: lea (%ecx, %edx, scale), %ecx |
| # to reduce code size |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl offArrayObject_contents(%ecx), %edx # %edx<- vBB[vCC] |
| # doing this and the previous instr |
| # with one instr was not faster |
| SET_VREG %edx rINST # vAA<- %edx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET_WIDE: /* 0x45 */ |
| /* File: x86-atom/OP_AGET_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET_WIDE.S |
| * |
| * Code: 64-bit array get operation. |
| * |
| * For: aget-wide |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the destination |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq offArrayObject_contents(%ecx, %edx, 8), %xmm0 # %xmm0<- vBB[vCC] |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %xmm0; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET_OBJECT: /* 0x46 */ |
| /* File: x86-atom/OP_AGET_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_AGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET.S |
| * |
| * Code: Generic 32-bit array "get" operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * |
| * For: aget, aget-boolean, aget-byte, aget-char, aget-object, sget, aget-short |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the value |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| lea (%ecx, %edx, 4), %ecx # %ecx<- &vBB[vCC] |
| # trying: lea (%ecx, %edx, scale), %ecx |
| # to reduce code size |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl offArrayObject_contents(%ecx), %edx # %edx<- vBB[vCC] |
| # doing this and the previous instr |
| # with one instr was not faster |
| SET_VREG %edx rINST # vAA<- %edx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET_BOOLEAN: /* 0x47 */ |
| /* File: x86-atom/OP_AGET_BOOLEAN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET_BOOLEAN.S |
| */ |
| |
| /* File: x86-atom/OP_AGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET.S |
| * |
| * Code: Generic 32-bit array "get" operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * |
| * For: aget, aget-boolean, aget-byte, aget-char, aget-object, sget, aget-short |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the value |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| lea (%ecx, %edx, 1), %ecx # %ecx<- &vBB[vCC] |
| # trying: lea (%ecx, %edx, scale), %ecx |
| # to reduce code size |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movzbl offArrayObject_contents(%ecx), %edx # %edx<- vBB[vCC] |
| # doing this and the previous instr |
| # with one instr was not faster |
| SET_VREG %edx rINST # vAA<- %edx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET_BYTE: /* 0x48 */ |
| /* File: x86-atom/OP_AGET_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET_BYTE.S |
| */ |
| |
| /* File: x86-atom/OP_AGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET.S |
| * |
| * Code: Generic 32-bit array "get" operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * |
| * For: aget, aget-boolean, aget-byte, aget-char, aget-object, sget, aget-short |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the value |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| lea (%ecx, %edx, 1), %ecx # %ecx<- &vBB[vCC] |
| # trying: lea (%ecx, %edx, scale), %ecx |
| # to reduce code size |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movsbl offArrayObject_contents(%ecx), %edx # %edx<- vBB[vCC] |
| # doing this and the previous instr |
| # with one instr was not faster |
| SET_VREG %edx rINST # vAA<- %edx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET_CHAR: /* 0x49 */ |
| /* File: x86-atom/OP_AGET_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET_CHAR.S |
| */ |
| |
| /* File: x86-atom/OP_AGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET.S |
| * |
| * Code: Generic 32-bit array "get" operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * |
| * For: aget, aget-boolean, aget-byte, aget-char, aget-object, sget, aget-short |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the value |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| lea (%ecx, %edx, 2), %ecx # %ecx<- &vBB[vCC] |
| # trying: lea (%ecx, %edx, scale), %ecx |
| # to reduce code size |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movzwl offArrayObject_contents(%ecx), %edx # %edx<- vBB[vCC] |
| # doing this and the previous instr |
| # with one instr was not faster |
| SET_VREG %edx rINST # vAA<- %edx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AGET_SHORT: /* 0x4a */ |
| /* File: x86-atom/OP_AGET_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET_SHORT.S |
| */ |
| |
| /* File: x86-atom/OP_AGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AGET.S |
| * |
| * Code: Generic 32-bit array "get" operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * |
| * For: aget, aget-boolean, aget-byte, aget-char, aget-object, sget, aget-short |
| * |
| * Description: Perform an array get operation at the identified index |
| * of a given array; load the array value into the value |
| * register. vAA <- vBB[vCC]. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| lea (%ecx, %edx, 2), %ecx # %ecx<- &vBB[vCC] |
| # trying: lea (%ecx, %edx, scale), %ecx |
| # to reduce code size |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movswl offArrayObject_contents(%ecx), %edx # %edx<- vBB[vCC] |
| # doing this and the previous instr |
| # with one instr was not faster |
| SET_VREG %edx rINST # vAA<- %edx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT: /* 0x4b */ |
| /* File: x86-atom/OP_APUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT.S |
| * |
| * Code: Generic 32-bit array put operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * move performed also dependent on the type of the array element. |
| * Provides a "value" register to specify the source of the move |
| * |
| * For: aput-boolean, aput-byte, aput-char, aput-object, aput-short |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| lea (%ecx, %edx, 4), %ecx # %ecx<- &vBB[vCC] |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offArrayObject_contents(%ecx) # vBB[vCC]<- rINSTx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT_WIDE: /* 0x4c */ |
| /* File: x86-atom/OP_APUT_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT_WIDE.S |
| * |
| * Code: 64-bit array put operation. |
| * |
| * For: aput-wide |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vAA |
| movq %xmm0, offArrayObject_contents(%ecx, %edx, 8) # vBB[vCC]<- %xmm0; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT_OBJECT: /* 0x4d */ |
| /* File: x86-atom/OP_APUT_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT_OBJECT.S |
| * |
| * Code: 32-bit array put operation. Provides an "scale" variable |
| * specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * mov performed also dependent on the type of the array element. |
| * Provides a "value" register to specify the source of the mov |
| * |
| * For: aput-boolean, aput-byte, aput-char, aput-object, aput-short |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %eax # %eax<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %eax # %eax<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %eax # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%eax), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| GET_VREG rINST # rINST<- vAA |
| lea (%eax, %edx, 4), %edx # %edx<- &vBB[vCC] |
| cmp $0, rINST # check for null reference |
| je .LOP_APUT_OBJECT_skip_check # reference is null so skip type check |
| jmp .LOP_APUT_OBJECT_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT_BOOLEAN: /* 0x4e */ |
| /* File: x86-atom/OP_APUT_BOOLEAN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT_BOOLEAN.S |
| */ |
| |
| /* File: x86-atom/OP_APUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT.S |
| * |
| * Code: Generic 32-bit array put operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * move performed also dependent on the type of the array element. |
| * Provides a "value" register to specify the source of the move |
| * |
| * For: aput-boolean, aput-byte, aput-char, aput-object, aput-short |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| lea (%ecx, %edx, 1), %ecx # %ecx<- &vBB[vCC] |
| GET_VREG rINST # rINST<- vAA |
| movb rINSTbl, offArrayObject_contents(%ecx) # vBB[vCC]<- rINSTx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT_BYTE: /* 0x4f */ |
| /* File: x86-atom/OP_APUT_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT_BYTE.S |
| */ |
| |
| /* File: x86-atom/OP_APUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT.S |
| * |
| * Code: Generic 32-bit array put operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * move performed also dependent on the type of the array element. |
| * Provides a "value" register to specify the source of the move |
| * |
| * For: aput-boolean, aput-byte, aput-char, aput-object, aput-short |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| lea (%ecx, %edx, 1), %ecx # %ecx<- &vBB[vCC] |
| GET_VREG rINST # rINST<- vAA |
| movb rINSTbl, offArrayObject_contents(%ecx) # vBB[vCC]<- rINSTx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT_CHAR: /* 0x50 */ |
| /* File: x86-atom/OP_APUT_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT_CHAR.S |
| */ |
| |
| /* File: x86-atom/OP_APUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT.S |
| * |
| * Code: Generic 32-bit array put operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * move performed also dependent on the type of the array element. |
| * Provides a "value" register to specify the source of the move |
| * |
| * For: aput-boolean, aput-byte, aput-char, aput-object, aput-short |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| lea (%ecx, %edx, 2), %ecx # %ecx<- &vBB[vCC] |
| GET_VREG rINST # rINST<- vAA |
| movw rINSTw, offArrayObject_contents(%ecx) # vBB[vCC]<- rINSTx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_APUT_SHORT: /* 0x51 */ |
| /* File: x86-atom/OP_APUT_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT_SHORT.S |
| */ |
| |
| /* File: x86-atom/OP_APUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_APUT.S |
| * |
| * Code: Generic 32-bit array put operation. Provides a "scale" variable |
| * to specify a scale value which depends on the width of the array |
| * elements. Provides a "mov" variable which determines the type of |
| * move performed also dependent on the type of the array element. |
| * Provides a "value" register to specify the source of the move |
| * |
| * For: aput-boolean, aput-byte, aput-char, aput-object, aput-short |
| * |
| * Description: Perform an array put operation from the value register; |
| * store the value register at the identified index of a |
| * given array. vBB[vCC] <- vAA |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| cmp $0, %ecx # check for null array object |
| je common_errNullObject # handle null array object |
| cmp offArrayObject_length(%ecx), %edx # compare index to arrayObj->length |
| jnc common_errArrayIndex # handle index >= length, bail |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| lea (%ecx, %edx, 2), %ecx # %ecx<- &vBB[vCC] |
| GET_VREG rINST # rINST<- vAA |
| movw rINSTw, offArrayObject_contents(%ecx) # vBB[vCC]<- rINSTx; value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET: /* 0x52 */ |
| /* File: x86-atom/OP_IGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET.S |
| * |
| * Code: Generic 32-bit instance field "get" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iget's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iget-boolean, iget-byte, iget-char, iget-object, iget |
| * iget-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IGET_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %edx # %edx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| jmp .LOP_IGET_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_WIDE: /* 0x53 */ |
| /* File: x86-atom/OP_IGET_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_WIDE.S |
| * |
| * Code: 64 bit instance field "get" operation. Uses no substitutions. |
| * |
| * For: iget-wide |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| movl rGLUE, %eax # %eax<- MterpGlue pointer |
| movl offGlue_methodClassDex(%eax), %ecx # %ecx<- pDvmDex |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- CCCC |
| FETCH 1, %edx # %edx<- pDvmDex->pResFields |
| movl (%ecx, %edx, 4), %ecx # %ecx<- resolved InstField ptr |
| cmp $0, %ecx # check for null ptr; resolved InstField ptr |
| jne .LOP_IGET_WIDE_finish |
| movl offGlue_method(%eax), %ecx # %ecx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%ecx), %ecx # %ecx<- method->clazz |
| movl %ecx, -8(%esp) # push parameter CCCC; field ref |
| movl %edx, -4(%esp) # push parameter method->clazz |
| jmp .LOP_IGET_WIDE_finish2 |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_OBJECT: /* 0x54 */ |
| /* File: x86-atom/OP_IGET_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_IGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET.S |
| * |
| * Code: Generic 32-bit instance field "get" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iget's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iget-boolean, iget-byte, iget-char, iget-object, iget |
| * iget-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IGET_OBJECT_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %edx # %edx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| jmp .LOP_IGET_OBJECT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_BOOLEAN: /* 0x55 */ |
| /* File: x86-atom/OP_IGET_BOOLEAN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_BOOLEAN.S |
| */ |
| |
| /* File: x86-atom/OP_IGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET.S |
| * |
| * Code: Generic 32-bit instance field "get" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iget's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iget-boolean, iget-byte, iget-char, iget-object, iget |
| * iget-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IGET_BOOLEAN_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %edx # %edx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| jmp .LOP_IGET_BOOLEAN_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_BYTE: /* 0x56 */ |
| /* File: x86-atom/OP_IGET_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_BYTE.S |
| */ |
| |
| /* File: x86-atom/OP_IGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET.S |
| * |
| * Code: Generic 32-bit instance field "get" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iget's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iget-boolean, iget-byte, iget-char, iget-object, iget |
| * iget-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IGET_BYTE_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %edx # %edx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| jmp .LOP_IGET_BYTE_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_CHAR: /* 0x57 */ |
| /* File: x86-atom/OP_IGET_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_CHAR.S |
| */ |
| |
| /* File: x86-atom/OP_IGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET.S |
| * |
| * Code: Generic 32-bit instance field "get" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iget's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iget-boolean, iget-byte, iget-char, iget-object, iget |
| * iget-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IGET_CHAR_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %edx # %edx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| jmp .LOP_IGET_CHAR_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_SHORT: /* 0x58 */ |
| /* File: x86-atom/OP_IGET_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_SHORT.S |
| */ |
| |
| /* File: x86-atom/OP_IGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET.S |
| * |
| * Code: Generic 32-bit instance field "get" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iget's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iget-boolean, iget-byte, iget-char, iget-object, iget |
| * iget-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IGET_SHORT_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %edx # %edx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| jmp .LOP_IGET_SHORT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT: /* 0x59 */ |
| /* File: x86-atom/OP_IPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT.S |
| * |
| * Code: Generic 32-bit instance field "put" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iput's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iput-boolean, iput-byte, iput-char, iput-object, iput |
| * iput-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IPUT_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| jmp .LOP_IPUT_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_WIDE: /* 0x5a */ |
| /* File: x86-atom/OP_IPUT_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_WIDE.S |
| * |
| * Code: 64 bit instance field "put" operation. Uses no substitutions. |
| * |
| * For: iget-wide |
| * |
| * Description: Perform the object instance field "put" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| movl rGLUE, %eax # %eax<- MterpGlue pointer |
| movl offGlue_methodClassDex(%eax), %ecx # %ecx<- pDvmDex |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- CCCC |
| FETCH 1, %edx # %edx<- pDvmDex->pResFields |
| movl (%ecx, %edx, 4), %ecx # %ecx<- resolved InstField ptr |
| cmp $0, %ecx # check for null ptr; resolved InstField ptr |
| jne .LOP_IPUT_WIDE_finish |
| movl offGlue_method(%eax), %ecx # %ecx <- current method |
| EXPORT_PC # in case an exception is thrown |
| movl offMethod_clazz(%ecx), %ecx # %ecx<- method->clazz |
| movl %ecx, -8(%esp) # push parameter CCCC; field ref |
| movl %edx, -4(%esp) # push parameter method->clazz |
| jmp .LOP_IPUT_WIDE_finish2 |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_OBJECT: /* 0x5b */ |
| /* File: x86-atom/OP_IPUT_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_IPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT.S |
| * |
| * Code: Generic 32-bit instance field "put" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iput's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iput-boolean, iput-byte, iput-char, iput-object, iput |
| * iput-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IPUT_OBJECT_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| jmp .LOP_IPUT_OBJECT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_BOOLEAN: /* 0x5c */ |
| /* File: x86-atom/OP_IPUT_BOOLEAN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_BOOLEAN.S |
| */ |
| |
| /* File: x86-atom/OP_IPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT.S |
| * |
| * Code: Generic 32-bit instance field "put" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iput's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iput-boolean, iput-byte, iput-char, iput-object, iput |
| * iput-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IPUT_BOOLEAN_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| jmp .LOP_IPUT_BOOLEAN_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_BYTE: /* 0x5d */ |
| /* File: x86-atom/OP_IPUT_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_BYTE.S |
| */ |
| |
| /* File: x86-atom/OP_IPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT.S |
| * |
| * Code: Generic 32-bit instance field "put" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iput's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iput-boolean, iput-byte, iput-char, iput-object, iput |
| * iput-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IPUT_BYTE_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| jmp .LOP_IPUT_BYTE_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_CHAR: /* 0x5e */ |
| /* File: x86-atom/OP_IPUT_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_CHAR.S |
| */ |
| |
| /* File: x86-atom/OP_IPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT.S |
| * |
| * Code: Generic 32-bit instance field "put" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iput's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iput-boolean, iput-byte, iput-char, iput-object, iput |
| * iput-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IPUT_CHAR_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| jmp .LOP_IPUT_CHAR_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_SHORT: /* 0x5f */ |
| /* File: x86-atom/OP_IPUT_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_SHORT.S |
| */ |
| |
| /* File: x86-atom/OP_IPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT.S |
| * |
| * Code: Generic 32-bit instance field "put" operation. Provides a |
| * "mov" variable which determines the type of mov performed. |
| * Currently, none of the iput's use this variable - may want |
| * to change this, but seems ok for now. |
| * |
| * For: iput-boolean, iput-byte, iput-char, iput-object, iput |
| * iput-short |
| * |
| * Description: Perform the object instance field "get" operation |
| * with the identified field; load the instance value into |
| * the value register. |
| * |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, type@CCCC |
| * op vA, vB, field@CCCC |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %edx # %edx<- pDvmDex |
| FETCH 1, %ecx # %ecx<- CCCC |
| movl offDvmDex_pResFields(%edx), %edx # %edx<- pDvmDex->pResFields |
| cmp $0, (%edx, %ecx, 4) # check for null ptr; resolved InstField ptr |
| movl (%edx, %ecx, 4), %eax # %eax<- resolved InstField ptr |
| jne .LOP_IPUT_SHORT_finish2 |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| jmp .LOP_IPUT_SHORT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET: /* 0x60 */ |
| /* File: x86-atom/OP_SGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET.S |
| * |
| * Code: Generic 32-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-boolean, sget-byte, sget-char, sget-object, sget, sget-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; load the field value |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_resolve |
| jmp .LOP_SGET_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_WIDE: /* 0x61 */ |
| /* File: x86-atom/OP_SGET_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET_WIDE.S |
| * |
| * Code: 64-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-wide |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field, loading or storing |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_methodClassDex(%eax), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %edx # %edx<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %edx, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %edx, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_WIDE_resolve |
| |
| .LOP_SGET_WIDE_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq offStaticField_value(%ecx), %xmm0 # %xmm0<- field value |
| movq %xmm0, (rFP, rINST, 4) # vAA<- field value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_OBJECT: /* 0x62 */ |
| /* File: x86-atom/OP_SGET_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_SGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET.S |
| * |
| * Code: Generic 32-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-boolean, sget-byte, sget-char, sget-object, sget, sget-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; load the field value |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_OBJECT_resolve |
| jmp .LOP_SGET_OBJECT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_BOOLEAN: /* 0x63 */ |
| /* File: x86-atom/OP_SGET_BOOLEAN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET_BOOLEAN.S |
| */ |
| |
| /* File: x86-atom/OP_SGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET.S |
| * |
| * Code: Generic 32-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-boolean, sget-byte, sget-char, sget-object, sget, sget-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; load the field value |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_BOOLEAN_resolve |
| jmp .LOP_SGET_BOOLEAN_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_BYTE: /* 0x64 */ |
| /* File: x86-atom/OP_SGET_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET_BYTE.S |
| */ |
| |
| /* File: x86-atom/OP_SGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET.S |
| * |
| * Code: Generic 32-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-boolean, sget-byte, sget-char, sget-object, sget, sget-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; load the field value |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_BYTE_resolve |
| jmp .LOP_SGET_BYTE_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_CHAR: /* 0x65 */ |
| /* File: x86-atom/OP_SGET_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET_CHAR.S |
| */ |
| |
| /* File: x86-atom/OP_SGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET.S |
| * |
| * Code: Generic 32-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-boolean, sget-byte, sget-char, sget-object, sget, sget-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; load the field value |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_CHAR_resolve |
| jmp .LOP_SGET_CHAR_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_SHORT: /* 0x66 */ |
| /* File: x86-atom/OP_SGET_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET_SHORT.S |
| */ |
| |
| /* File: x86-atom/OP_SGET.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SGET.S |
| * |
| * Code: Generic 32-bit static field "get" operation. Uses no substitutions. |
| * |
| * For: sget-boolean, sget-byte, sget-char, sget-object, sget, sget-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; load the field value |
| * into the value register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SGET_SHORT_resolve |
| jmp .LOP_SGET_SHORT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT: /* 0x67 */ |
| /* File: x86-atom/OP_SPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_resolve |
| jmp .LOP_SPUT_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_WIDE: /* 0x68 */ |
| /* File: x86-atom/OP_SPUT_WIDE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT_WIDE.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_methodClassDex(%eax), %ecx # %ecx<- glue->pDvmDex |
| FETCH 1, %edx # %edx<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %edx, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %edx, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_WIDE_resolve |
| |
| .LOP_SPUT_WIDE_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vAA |
| movq %xmm0, offStaticField_value(%ecx) # field value<- field value |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_OBJECT: /* 0x69 */ |
| /* File: x86-atom/OP_SPUT_OBJECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT_OBJECT.S |
| */ |
| |
| /* File: x86-atom/OP_SPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_OBJECT_resolve |
| jmp .LOP_SPUT_OBJECT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_BOOLEAN: /* 0x6a */ |
| /* File: x86-atom/OP_SPUT_BOOLEAN.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT_BOOLEAN.S |
| */ |
| |
| /* File: x86-atom/OP_SPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_BOOLEAN_resolve |
| jmp .LOP_SPUT_BOOLEAN_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_BYTE: /* 0x6b */ |
| /* File: x86-atom/OP_SPUT_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT_BYTE.S |
| */ |
| |
| /* File: x86-atom/OP_SPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_BYTE_resolve |
| jmp .LOP_SPUT_BYTE_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_CHAR: /* 0x6c */ |
| /* File: x86-atom/OP_SPUT_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT_CHAR.S |
| */ |
| |
| /* File: x86-atom/OP_SPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_CHAR_resolve |
| jmp .LOP_SPUT_CHAR_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_SHORT: /* 0x6d */ |
| /* File: x86-atom/OP_SPUT_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT_SHORT.S |
| */ |
| |
| /* File: x86-atom/OP_SPUT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SPUT.S |
| * |
| * Code: Generic 32-bit static field "put" operation. Uses no substitutions. |
| * |
| * For: sput-boolean, sput-byte, sput-char, sput-object, sput, sput-short |
| * |
| * Description: Perform the identified object static field operation |
| * with the identified static field; store the field value |
| * register. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, string@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- BBBB |
| movl offDvmDex_pResFields(%ecx), %ecx # %ecx<- pResFields |
| cmp $0, (%ecx, %eax, 4) # check for null ptr; resolved StaticField ptr |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved StaticField ptr |
| je .LOP_SPUT_SHORT_resolve |
| jmp .LOP_SPUT_SHORT_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_VIRTUAL: /* 0x6e */ |
| /* File: x86-atom/OP_INVOKE_VIRTUAL.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_VIRTUAL.S |
| * |
| * Code: Call a virtual method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_direct that allows up to 255 arguments. |
| * |
| * For: invoke-virtual, invoke-virtual/range |
| * |
| * Description: invoke-virtual is used to invoke a normal virtual method; |
| * a method that is not static or final, and is not a constructor. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| EXPORT_PC # must export pc for invoke |
| movl offGlue_methodClassDex(%eax), %eax # %eax<- pDvmDex |
| FETCH 1, %ecx # %ecx<- method index |
| movl offDvmDex_pResMethods(%eax), %eax # %eax<- pDvmDex->pResMethods |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| .if (!0) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| cmp $0, (%eax, %ecx, 4) # check if already resolved |
| je .LOP_INVOKE_VIRTUAL_break |
| movl (%eax, %ecx, 4), %eax # %eax<- resolved base method |
| jmp .LOP_INVOKE_VIRTUAL_continue |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_SUPER: /* 0x6f */ |
| /* File: x86-atom/OP_INVOKE_SUPER.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_SUPER.S |
| * |
| * Code: Call super method. |
| * |
| * For: invoke-super, invoke-super/range |
| * |
| * Description: invoke-super is used to invoke the closest superclass's virtual |
| * method (as opposed to the one with the same method_id in the |
| * calling class). |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| FETCH 2, %eax # %eax<- GFED or CCCC |
| movl offGlue_methodClassDex(%ecx), %ecx # %ecx<- pDvmDex |
| .if (!0) |
| and $15, %eax # %eax<- D if not range |
| .endif |
| FETCH 1, %edx # %edx<- method index |
| movl offDvmDex_pResMethods(%ecx), %ecx # %ecx<- pDvmDex->pResMethods |
| cmp $0, (rFP, %eax, 4) # check for null object |
| movl (%ecx, %edx, 4), %ecx # %ecx<- resolved base method |
| je common_errNullObject # handle null object |
| jmp .LOP_INVOKE_SUPER_continue2 |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_DIRECT: /* 0x70 */ |
| /* File: x86-atom/OP_INVOKE_DIRECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_DIRECT.S |
| * |
| * Code: Call a non-static direct method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_direct that allows up to 255 arguments. |
| * |
| * For: invoke-direct, invoke-direct/range |
| * |
| * Description: invoke-direct is used to invoke a non-static direct method; |
| * an instance method that is non-overridable, for example, |
| * either a private instance method or a constructor. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_methodClassDex(%ecx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- method index |
| movl offDvmDex_pResMethods(%ecx), %ecx # %ecx<- pDvmDex->pResMethods |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved method to call |
| .if (!0) |
| andl $15, %edx # %edx<- D if not range |
| .endif |
| EXPORT_PC # must export for invoke |
| movl %edx, -4(%esp) # save "this" pointer register |
| cmp $0, %ecx # check if already resolved |
| GET_VREG %edx # %edx<- "this" pointer |
| je .LOP_INVOKE_DIRECT_resolve # handle resolve |
| |
| .LOP_INVOKE_DIRECT_finish: |
| cmp $0, %edx # check for null "this" |
| jne common_invokeMethodNoRange # invoke method common code |
| jmp common_errNullObject |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_STATIC: /* 0x71 */ |
| /* File: x86-atom/OP_INVOKE_STATIC.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_STATIC.S |
| * |
| * Code: Call static direct method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_static that allows up to 255 arguments. |
| * |
| * For: invoke-static, invoke-static/range |
| * |
| * Description: invoke-static is used to invoke static direct method. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %edx<- pDvmDex |
| FETCH 1, %eax # %eax<- method index |
| movl offDvmDex_pResMethods(%ecx), %ecx # %edx<- pDvmDex->pResMethods |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved method to call |
| cmp $0, %ecx # check if already resolved |
| EXPORT_PC # must export for invoke |
| jne common_invokeMethodNoRange # invoke method common code |
| jmp .LOP_INVOKE_STATIC_break |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_INTERFACE: /* 0x72 */ |
| /* File: x86-atom/OP_INVOKE_INTERFACE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_INTERFACE.S |
| * |
| * Code: Call at method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_interface that allows up to 255 arguments. |
| * |
| * For: invoke-interface, invoke-interface-range |
| * |
| * Description: invoke-interface is used to invoke an interface method; on an |
| * object whose concrete class isn't known, using a method_id that |
| * refers to an interface. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| FETCH 1, %ecx # %ecx<- method index |
| movl %ecx, -12(%esp) # push argument method index |
| .if (!0) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| EXPORT_PC # must export for invoke |
| GET_VREG %edx # %edx<- first arg "this pointer" |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_methodClassDex(%eax), %eax # %eax<- glue->pDvmDex |
| movl %eax, -4(%esp) # push parameter class |
| cmp $0, %edx # check for null object |
| je common_errNullObject # handle null object |
| jmp .LOP_INVOKE_INTERFACE_break |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_73: /* 0x73 */ |
| /* File: x86-atom/OP_UNUSED_73.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_73.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_VIRTUAL_RANGE: /* 0x74 */ |
| /* File: x86-atom/OP_INVOKE_VIRTUAL_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_VIRTUAL_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_VIRTUAL.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_VIRTUAL.S |
| * |
| * Code: Call a virtual method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_direct that allows up to 255 arguments. |
| * |
| * For: invoke-virtual, invoke-virtual/range |
| * |
| * Description: invoke-virtual is used to invoke a normal virtual method; |
| * a method that is not static or final, and is not a constructor. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| EXPORT_PC # must export pc for invoke |
| movl offGlue_methodClassDex(%eax), %eax # %eax<- pDvmDex |
| FETCH 1, %ecx # %ecx<- method index |
| movl offDvmDex_pResMethods(%eax), %eax # %eax<- pDvmDex->pResMethods |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| .if (!1) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| cmp $0, (%eax, %ecx, 4) # check if already resolved |
| je .LOP_INVOKE_VIRTUAL_RANGE_break |
| movl (%eax, %ecx, 4), %eax # %eax<- resolved base method |
| jmp .LOP_INVOKE_VIRTUAL_RANGE_continue |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_SUPER_RANGE: /* 0x75 */ |
| /* File: x86-atom/OP_INVOKE_SUPER_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_SUPER_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_SUPER.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_SUPER.S |
| * |
| * Code: Call super method. |
| * |
| * For: invoke-super, invoke-super/range |
| * |
| * Description: invoke-super is used to invoke the closest superclass's virtual |
| * method (as opposed to the one with the same method_id in the |
| * calling class). |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| FETCH 2, %eax # %eax<- GFED or CCCC |
| movl offGlue_methodClassDex(%ecx), %ecx # %ecx<- pDvmDex |
| .if (!1) |
| and $15, %eax # %eax<- D if not range |
| .endif |
| FETCH 1, %edx # %edx<- method index |
| movl offDvmDex_pResMethods(%ecx), %ecx # %ecx<- pDvmDex->pResMethods |
| cmp $0, (rFP, %eax, 4) # check for null object |
| movl (%ecx, %edx, 4), %ecx # %ecx<- resolved base method |
| je common_errNullObject # handle null object |
| jmp .LOP_INVOKE_SUPER_RANGE_continue2 |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_DIRECT_RANGE: /* 0x76 */ |
| /* File: x86-atom/OP_INVOKE_DIRECT_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_DIRECT_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_DIRECT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_DIRECT.S |
| * |
| * Code: Call a non-static direct method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_direct that allows up to 255 arguments. |
| * |
| * For: invoke-direct, invoke-direct/range |
| * |
| * Description: invoke-direct is used to invoke a non-static direct method; |
| * an instance method that is non-overridable, for example, |
| * either a private instance method or a constructor. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_methodClassDex(%ecx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- method index |
| movl offDvmDex_pResMethods(%ecx), %ecx # %ecx<- pDvmDex->pResMethods |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved method to call |
| .if (!1) |
| andl $15, %edx # %edx<- D if not range |
| .endif |
| EXPORT_PC # must export for invoke |
| movl %edx, -4(%esp) # save "this" pointer register |
| cmp $0, %ecx # check if already resolved |
| GET_VREG %edx # %edx<- "this" pointer |
| je .LOP_INVOKE_DIRECT_RANGE_resolve # handle resolve |
| |
| .LOP_INVOKE_DIRECT_RANGE_finish: |
| cmp $0, %edx # check for null "this" |
| jne common_invokeMethodRange # invoke method common code |
| jmp common_errNullObject |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_STATIC_RANGE: /* 0x77 */ |
| /* File: x86-atom/OP_INVOKE_STATIC_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_STATIC_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_STATIC.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_STATIC.S |
| * |
| * Code: Call static direct method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_static that allows up to 255 arguments. |
| * |
| * For: invoke-static, invoke-static/range |
| * |
| * Description: invoke-static is used to invoke static direct method. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_methodClassDex(%edx), %ecx # %edx<- pDvmDex |
| FETCH 1, %eax # %eax<- method index |
| movl offDvmDex_pResMethods(%ecx), %ecx # %edx<- pDvmDex->pResMethods |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved method to call |
| cmp $0, %ecx # check if already resolved |
| EXPORT_PC # must export for invoke |
| jne common_invokeMethodRange # invoke method common code |
| jmp .LOP_INVOKE_STATIC_RANGE_break |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_INTERFACE_RANGE: /* 0x78 */ |
| /* File: x86-atom/OP_INVOKE_INTERFACE_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_INTERFACE_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_INTERFACE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_INTERFACE.S |
| * |
| * Code: Call at method. Provides an "isrange" variable and |
| * a "routine" variable to specify this is the "range" version of |
| * invoke_interface that allows up to 255 arguments. |
| * |
| * For: invoke-interface, invoke-interface-range |
| * |
| * Description: invoke-interface is used to invoke an interface method; on an |
| * object whose concrete class isn't known, using a method_id that |
| * refers to an interface. |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| * AA|op BBBB CCCC (3rc) |
| * |
| * Syntax: [B=5] op {vD, vE, vF, vG, vA}, meth@CCCC (35c) |
| * [B=5] op {vD, vE, vF, vG, vA}, type@CCCC (35c) |
| * [B=4] op {vD, vE, vF, vG}, kind@CCCC (35c) |
| * [B=3] op {vD, vE, vF}, kind@CCCC (35c) |
| * [B=2] op {vD, vE}, kind@CCCC (35c) |
| * [B=1] op {vD}, kind@CCCC (35c) |
| * [B=0] op {}, kind@CCCC (35c) |
| * |
| * op {vCCCC .. vNNNN}, meth@BBBB (3rc) (where NNNN = CCCC+AA-1, that |
| * op {vCCCC .. vNNNN}, type@BBBB (3rc) is A determines the count 0..255, |
| * and C determines the first register) |
| */ |
| |
| |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| FETCH 1, %ecx # %ecx<- method index |
| movl %ecx, -12(%esp) # push argument method index |
| .if (!1) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| EXPORT_PC # must export for invoke |
| GET_VREG %edx # %edx<- first arg "this pointer" |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_methodClassDex(%eax), %eax # %eax<- glue->pDvmDex |
| movl %eax, -4(%esp) # push parameter class |
| cmp $0, %edx # check for null object |
| je common_errNullObject # handle null object |
| jmp .LOP_INVOKE_INTERFACE_RANGE_break |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_79: /* 0x79 */ |
| /* File: x86-atom/OP_UNUSED_79.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_79.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_UNUSED_7A: /* 0x7a */ |
| /* File: x86-atom/OP_UNUSED_7A.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_UNUSED_7A.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NEG_INT: /* 0x7b */ |
| /* File: x86-atom/OP_NEG_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NEG_INT.S |
| */ |
| |
| /* File: x86-atom/unop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unop.S |
| * |
| * Code: Generic 32-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%ecx = op %edx". |
| * |
| * For: int-to-byte, int-to-char, int-to-short, neg-float, neg-int, not-int |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| # do operation part 1 |
| neg %ecx # do operation part 2 |
| SET_VREG %ecx, rINST # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NOT_INT: /* 0x7c */ |
| /* File: x86-atom/OP_NOT_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NOT_INT.S |
| */ |
| |
| /* File: x86-atom/unop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unop.S |
| * |
| * Code: Generic 32-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%ecx = op %edx". |
| * |
| * For: int-to-byte, int-to-char, int-to-short, neg-float, neg-int, not-int |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| # do operation part 1 |
| not %ecx # do operation part 2 |
| SET_VREG %ecx, rINST # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NEG_LONG: /* 0x7d */ |
| /* File: x86-atom/OP_NEG_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NEG_LONG.S |
| */ |
| |
| /* File: x86-atom/unopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unopWide.S |
| * |
| * Code: Generic 64-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%xmm0 = op %xmm1". |
| * |
| * For: neg-double, neg-long, not-long |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vB |
| xorps %xmm1, %xmm1 # do operation part 1 |
| psubq %xmm0, %xmm1 # do operation part 2 |
| movq %xmm1, (rFP, %ecx, 4) # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NOT_LONG: /* 0x7e */ |
| /* File: x86-atom/OP_NOT_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NOT_LONG.S |
| */ |
| |
| /* File: x86-atom/unopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unopWide.S |
| * |
| * Code: Generic 64-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%xmm0 = op %xmm1". |
| * |
| * For: neg-double, neg-long, not-long |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vB |
| # do operation part 1 |
| pandn 0xFFFFFFFF, %xmm0 # do operation part 2 |
| movq %xmm0, (rFP, %ecx, 4) # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NEG_FLOAT: /* 0x7f */ |
| /* File: x86-atom/OP_NEG_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NEG_FLOAT.S |
| */ |
| |
| /* File: x86-atom/unop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unop.S |
| * |
| * Code: Generic 32-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%ecx = op %edx". |
| * |
| * For: int-to-byte, int-to-char, int-to-short, neg-float, neg-int, not-int |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| # do operation part 1 |
| addl $0x80000000, %ecx # do operation part 2 |
| SET_VREG %ecx, rINST # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_NEG_DOUBLE: /* 0x80 */ |
| /* File: x86-atom/OP_NEG_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_NEG_DOUBLE.S |
| */ |
| |
| /* File: x86-atom/unopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unopWide.S |
| * |
| * Code: Generic 64-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%xmm0 = op %xmm1". |
| * |
| * For: neg-double, neg-long, not-long |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vB |
| movq .LdoubNeg, %xmm1 # do operation part 1 |
| pxor %xmm1, %xmm0 # do operation part 2 |
| movq %xmm0, (rFP, %ecx, 4) # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INT_TO_LONG: /* 0x81 */ |
| /* File: x86-atom/OP_INT_TO_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INT_TO_LONG.S |
| * |
| * Code: Convert an int to a long. Uses no substitutions. |
| * |
| * For: |
| * |
| * Description: Convert an int in the source register, to a long, and |
| * stores the result in the destintation register. vA<- (long) vB |
| * |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %eax # %eax<- BA+ |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %eax # %eax<- B |
| andl $15, %ecx # %ecx<- A |
| GET_VREG %eax # %eax<- vB |
| cdq # %edx:%eax<- sign-extend of %eax |
| movl %eax, (rFP, %ecx, 4) # vA<- lo part |
| movl %edx, 4(rFP, %ecx, 4) # vA+1<- hi part |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INT_TO_FLOAT: /* 0x82 */ |
| /* File: x86-atom/OP_INT_TO_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INT_TO_FLOAT.S |
| * |
| * Code: Convert an int to a float. Uses no substitutions. |
| * |
| * For: int-to-float |
| * |
| * Description: Convert an int in the source register, to a float, and |
| * stores the result in the destintation register. vA<- (float) vB |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %eax # %eax<- BA+ |
| shr $4, %eax # %eax<- B |
| andl $15, rINST # rINST<- A |
| cvtsi2ss (rFP,%eax,4), %xmm0 # %xmm0<- vB |
| movss %xmm0, (rFP, rINST, 4) # vA<- %xmm0 |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INT_TO_DOUBLE: /* 0x83 */ |
| /* File: x86-atom/OP_INT_TO_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INT_TO_DOUBLE.S |
| * |
| * Code: Convert an int to a double. Uses no substitutions. |
| * |
| * For: int-to-double |
| * |
| * Description: Converts an int in the source register, to a double, and |
| * stores the result in the destination register. vA<- (double) vB |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %eax # %eax<- BA+ |
| shr $4, %eax # %eax<- B |
| andl $15, rINST # rINST<- A |
| cvtsi2sd (rFP, %eax, 4), %xmm0 # %xmm0<- vB |
| movq %xmm0, (rFP, rINST, 4) # vA<- %xmm0; (double) vB |
| FFETCH_ADV 1, %edx # %edx<- next instruction hi; fetch, advance |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_LONG_TO_INT: /* 0x84 */ |
| /* File: x86-atom/OP_LONG_TO_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_LONG_TO_INT.S |
| */ |
| |
| /* File: x86-atom/OP_MOVE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MOVE.S |
| * |
| * Code: Copies contents from one register to another. Uses no |
| * substitutions. |
| * |
| * For: move, move-object, long-to-int |
| * |
| * Description: Copies contents from one non-object register to another. |
| * vA<- vB; fp[A]<- fp[B] |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vB |
| SET_VREG rINST, %ecx # vA<- vB; %edx |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_LONG_TO_FLOAT: /* 0x85 */ |
| /* File: x86-atom/OP_LONG_TO_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_LONG_TO_FLOAT.S |
| * |
| * Code: Convert a long to a float. Uses no substitutions. |
| * |
| * For: int-to-float |
| * |
| * Description: Converts a float in the source register, to a float, and |
| * stores the result in the destination register. vA<- (double) vB |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| fildll (rFP, rINST, 4) # FPU<- vB |
| fstps (rFP, %ecx, 4) # vA<- FPU; (float) vB |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_LONG_TO_DOUBLE: /* 0x86 */ |
| /* File: x86-atom/OP_LONG_TO_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_LONG_TO_DOUBLE.S |
| * |
| * Code: Convert a long to a dobule. Uses no substitutions. |
| * |
| * For: long-to-double |
| * |
| * Description: Converts a long in the source register to a double, and |
| * stores the result in the destination register. vA<- (double) vB |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, rINST # rINST<- B |
| and $15, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| fildll (rFP, rINST, 4) # FPU<- vB |
| fstpl (rFP, %ecx, 4) # vA<- FPU; (double) vB |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_FLOAT_TO_INT: /* 0x87 */ |
| /* File: x86-atom/OP_FLOAT_TO_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FLOAT_TO_INT.S |
| * |
| * Code: Converts a float to a int. Uses no substitutions. |
| * |
| * For: float-to-int |
| * |
| * Description: Convert the float in source register to a int |
| * and store the result in the destintation register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %edx # %edx<- A |
| flds (rFP, rINST, 4) # push vB to floating point stack |
| fildl .LintMax # push max int value |
| fildl .LintMin # push min int value |
| fucomip %st(2), %st(0) # check for negInf |
| jae .LOP_FLOAT_TO_INT_negInf # handle negInf |
| fucomip %st(1), %st(0) # check for posInf or NaN |
| jc .LOP_FLOAT_TO_INT_nanInf # handle posInf or NaN |
| jmp .LOP_FLOAT_TO_INT_break # do conversion |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_FLOAT_TO_LONG: /* 0x88 */ |
| /* File: x86-atom/OP_FLOAT_TO_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FLOAT_TO_LONG.S |
| * |
| * Code: Converts a float to a long. Uses no substitutions. |
| * |
| * For: float-to-long |
| * |
| * Description: Convert the float in source register to a long |
| * and store the result in the destintation register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %edx # %edx<- A |
| flds (rFP, rINST, 4) # push vB to floating point stack |
| fildll .LvaluePosInfLong # push max int value |
| fildll .LvalueNegInfLong # push min int value |
| fucomip %st(2), %st(0) # check for negInf |
| jae .LOP_FLOAT_TO_LONG_negInf # handle negInf |
| fucomip %st(1), %st(0) # check for posInf or NaN |
| jc .LOP_FLOAT_TO_LONG_nanInf # handle posInf or NaN |
| jmp .LOP_FLOAT_TO_LONG_break # do conversion |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_FLOAT_TO_DOUBLE: /* 0x89 */ |
| /* File: x86-atom/OP_FLOAT_TO_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_FLOAT_TO_DOUBLE.S |
| * |
| * Code: Converts a float to a double. Uses no substitutions. |
| * |
| * For: float-to-double |
| * |
| * Description: Convert the float in source register to a double |
| * and store the result in the destintation register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %edx # %edx<- A |
| flds (rFP, rINST, 4) # load float |
| fstpl (rFP, %edx, 4) # store double |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DOUBLE_TO_INT: /* 0x8a */ |
| /* File: x86-atom/OP_DOUBLE_TO_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DOUBLE_TO_INT.S |
| * |
| * Code: Converts a double to an integer. Uses no substitutions. |
| * |
| * For: double-to-int |
| * |
| * Description: Convert the source register (a double) to an integer |
| * and store the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %edx # %edx<- A |
| fldl (rFP, rINST, 4) # load &vB |
| fildl .LintMax # push max int value |
| fildl .LintMin # push min int value |
| fucomip %st(2), %st(0) # check for negInf |
| jae .LOP_DOUBLE_TO_INT_negInf # handle negInf |
| fucomip %st(1), %st(0) # check for posInf or NaN |
| jc .LOP_DOUBLE_TO_INT_nanInf # handle posInf or NaN |
| jmp .LOP_DOUBLE_TO_INT_break # do conversion |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DOUBLE_TO_LONG: /* 0x8b */ |
| /* File: x86-atom/OP_DOUBLE_TO_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DOUBLE_TO_LONG.S |
| * |
| * Code: Converts a double to a long. Uses no substitutions. |
| * |
| * For: double-to-long |
| * |
| * Description: Convert the double in source register to a long |
| * and store in the destintation register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %ecx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %edx # %ecx<- A |
| fldl (rFP, rINST, 4) # push vB to floating point stack |
| fildll .LvaluePosInfLong # push max int value |
| fildll .LvalueNegInfLong # push min int value |
| fucomip %st(2), %st(0) # check for negInf |
| jae .LOP_DOUBLE_TO_LONG_negInf # handle negInf |
| fucomip %st(1), %st(0) # check for posInf or NaN |
| jc .LOP_DOUBLE_TO_LONG_nanInf # handle posInf or NaN |
| jmp .LOP_DOUBLE_TO_LONG_break # do conversion |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DOUBLE_TO_FLOAT: /* 0x8c */ |
| /* File: x86-atom/OP_DOUBLE_TO_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DOUBLE_TO_FLOAT.S |
| * |
| * Code: Converts a double to a float. Uses no substitutions. |
| * |
| * For: double-to-float |
| * |
| * Description: Convert the source register (a double) to a float |
| * and store the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| and $15, %edx # %edx<- A |
| fldl (rFP, rINST, 4) # load &vB |
| fstps (rFP, %edx, 4) # store float |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INT_TO_BYTE: /* 0x8d */ |
| /* File: x86-atom/OP_INT_TO_BYTE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INT_TO_BYTE.S |
| */ |
| |
| /* File: x86-atom/unop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unop.S |
| * |
| * Code: Generic 32-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%ecx = op %edx". |
| * |
| * For: int-to-byte, int-to-char, int-to-short, neg-float, neg-int, not-int |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| sal $24, %ecx # do operation part 1 |
| sar $24, %ecx # do operation part 2 |
| SET_VREG %ecx, rINST # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INT_TO_CHAR: /* 0x8e */ |
| /* File: x86-atom/OP_INT_TO_CHAR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INT_TO_CHAR.S |
| */ |
| |
| /* File: x86-atom/unop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unop.S |
| * |
| * Code: Generic 32-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%ecx = op %edx". |
| * |
| * For: int-to-byte, int-to-char, int-to-short, neg-float, neg-int, not-int |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| sal $16, %ecx # do operation part 1 |
| shr $16, %ecx # do operation part 2 |
| SET_VREG %ecx, rINST # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INT_TO_SHORT: /* 0x8f */ |
| /* File: x86-atom/OP_INT_TO_SHORT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INT_TO_SHORT.S |
| */ |
| |
| /* File: x86-atom/unop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unop.S |
| * |
| * Code: Generic 32-bit unary operation. Provide an "instr" variable and a |
| * preinstr variable that together specify an instruction that |
| * performs, for example, "%ecx = op %edx". |
| * |
| * For: int-to-byte, int-to-char, int-to-short, neg-float, neg-int, not-int |
| * |
| * Description: Perform the identified unary operation on the source |
| * register, storing the result in the destination register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| sal $16, %ecx # do operation part 1 |
| sar $16, %ecx # do operation part 2 |
| SET_VREG %ecx, rINST # vA<- result |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_INT: /* 0x90 */ |
| /* File: x86-atom/OP_ADD_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_INT.S |
| */ |
| |
| /* File: x86-atom/binop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * For: add-int, and-int, mul-int, or-int, sub-int, xor-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| OLD_JMP_1 2, %eax |
| OLD_JMP_2 %eax |
| FETCH_CC 1, %edx # %edx<- CC |
| OLD_JMP_3 2 |
| GET_VREG %ecx # %ecx<- vBB |
| addl (rFP, %edx, 4), %ecx # %ecx<- vBB op vCC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_INT: /* 0x91 */ |
| /* File: x86-atom/OP_SUB_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_INT.S |
| */ |
| |
| /* File: x86-atom/binop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * For: add-int, and-int, mul-int, or-int, sub-int, xor-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| OLD_JMP_1 2, %eax |
| OLD_JMP_2 %eax |
| FETCH_CC 1, %edx # %edx<- CC |
| OLD_JMP_3 2 |
| GET_VREG %ecx # %ecx<- vBB |
| subl (rFP, %edx, 4), %ecx # %ecx<- vBB op vCC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_INT: /* 0x92 */ |
| /* File: x86-atom/OP_MUL_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_INT.S |
| * |
| * Code: 32-bit multiply operation. Performs "%ecx = %ecx * %edx" |
| * |
| * Description: Perform a multiplication operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vBB |
| addl $4, rPC # update PC |
| imul (rFP, %edx, 4), %ecx # %ecx<- vBB * vCC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_INT: /* 0x93 */ |
| /* File: x86-atom/OP_DIV_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_INT.S |
| */ |
| |
| /* File: x86-atom/binopD.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopD.S |
| * |
| * Code: 32-bit integer divide operation. If "div" is set, the code |
| * returns the quotient, else it returns the remainder. |
| * Also, a divide-by-zero check is done. |
| * |
| * For: div-int, rem-int |
| * |
| * Description: Perform a binary operation on two source |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_CC 1, %ecx # %ecx<- CC |
| FETCH_BB 1, %eax # %eax<- BB |
| GET_VREG %ecx # %ecx<- vCC |
| testl %ecx, %ecx |
| GET_VREG %eax # %eax<- vBB |
| je common_errDivideByZero # handle divide by zero |
| cmpl $-1, %ecx # handle -1 special case divide error |
| jnz .LOP_DIV_INT_continue |
| cmpl $0x80000000,%eax # handle min int special case divide error |
| je .LOP_DIV_INT_break |
| .LOP_DIV_INT_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 1 |
| FFETCH_ADV 2 %edx |
| SET_VREG %eax rINST # vAA<- %eax (quotient) |
| FGETOP_JMP 2 %edx |
| .else |
| FFETCH_ADV 2 %eax |
| SET_VREG %edx rINST # vAA<- %edx (remainder) |
| FGETOP_JMP 2 %eax |
| .endif |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_INT: /* 0x94 */ |
| /* File: x86-atom/OP_REM_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_INT.S |
| */ |
| |
| /* File: x86-atom/binopD.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopD.S |
| * |
| * Code: 32-bit integer divide operation. If "div" is set, the code |
| * returns the quotient, else it returns the remainder. |
| * Also, a divide-by-zero check is done. |
| * |
| * For: div-int, rem-int |
| * |
| * Description: Perform a binary operation on two source |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_CC 1, %ecx # %ecx<- CC |
| FETCH_BB 1, %eax # %eax<- BB |
| GET_VREG %ecx # %ecx<- vCC |
| testl %ecx, %ecx |
| GET_VREG %eax # %eax<- vBB |
| je common_errDivideByZero # handle divide by zero |
| cmpl $-1, %ecx # handle -1 special case divide error |
| jnz .LOP_REM_INT_continue |
| cmpl $0x80000000,%eax # handle min int special case divide error |
| je .LOP_REM_INT_break |
| .LOP_REM_INT_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 0 |
| FFETCH_ADV 2 %edx |
| SET_VREG %eax rINST # vAA<- %eax (quotient) |
| FGETOP_JMP 2 %edx |
| .else |
| FFETCH_ADV 2 %eax |
| SET_VREG %edx rINST # vAA<- %edx (remainder) |
| FGETOP_JMP 2 %eax |
| .endif |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AND_INT: /* 0x95 */ |
| /* File: x86-atom/OP_AND_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AND_INT.S |
| */ |
| |
| /* File: x86-atom/binop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * For: add-int, and-int, mul-int, or-int, sub-int, xor-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| OLD_JMP_1 2, %eax |
| OLD_JMP_2 %eax |
| FETCH_CC 1, %edx # %edx<- CC |
| OLD_JMP_3 2 |
| GET_VREG %ecx # %ecx<- vBB |
| andl (rFP, %edx, 4), %ecx # %ecx<- vBB op vCC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_OR_INT: /* 0x96 */ |
| /* File: x86-atom/OP_OR_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_OR_INT.S |
| */ |
| |
| /* File: x86-atom/binop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * For: add-int, and-int, mul-int, or-int, sub-int, xor-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| OLD_JMP_1 2, %eax |
| OLD_JMP_2 %eax |
| FETCH_CC 1, %edx # %edx<- CC |
| OLD_JMP_3 2 |
| GET_VREG %ecx # %ecx<- vBB |
| or (rFP, %edx, 4), %ecx # %ecx<- vBB op vCC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_XOR_INT: /* 0x97 */ |
| /* File: x86-atom/OP_XOR_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_XOR_INT.S |
| */ |
| |
| /* File: x86-atom/binop.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * For: add-int, and-int, mul-int, or-int, sub-int, xor-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| OLD_JMP_1 2, %eax |
| OLD_JMP_2 %eax |
| FETCH_CC 1, %edx # %edx<- CC |
| OLD_JMP_3 2 |
| GET_VREG %ecx # %ecx<- vBB |
| xor (rFP, %edx, 4), %ecx # %ecx<- vBB op vCC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHL_INT: /* 0x98 */ |
| /* File: x86-atom/OP_SHL_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHL_INT.S |
| */ |
| |
| /* File: x86-atom/binopS.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopS.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%edx = %edx op %cl" |
| * |
| * For: shl-int, shr-int, ushr-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_CC 1, %ecx # %ecx<- CC |
| FETCH_BB 1, %edx # %edx<- BB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| addl $4, rPC # update PC |
| GET_VREG %ecx # %ecx<- vCC |
| GET_VREG %edx # %edx<- vBB |
| sal %cl, %edx # %edx<- vBB op +CC |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHR_INT: /* 0x99 */ |
| /* File: x86-atom/OP_SHR_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHR_INT.S |
| */ |
| |
| /* File: x86-atom/binopS.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopS.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%edx = %edx op %cl" |
| * |
| * For: shl-int, shr-int, ushr-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_CC 1, %ecx # %ecx<- CC |
| FETCH_BB 1, %edx # %edx<- BB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| addl $4, rPC # update PC |
| GET_VREG %ecx # %ecx<- vCC |
| GET_VREG %edx # %edx<- vBB |
| sar %cl, %edx # %edx<- vBB op +CC |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_USHR_INT: /* 0x9a */ |
| /* File: x86-atom/OP_USHR_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_USHR_INT.S |
| */ |
| |
| /* File: x86-atom/binopS.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopS.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%edx = %edx op %cl" |
| * |
| * For: shl-int, shr-int, ushr-int |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_CC 1, %ecx # %ecx<- CC |
| FETCH_BB 1, %edx # %edx<- BB |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| addl $4, rPC # update PC |
| GET_VREG %ecx # %ecx<- vCC |
| GET_VREG %edx # %edx<- vBB |
| shr %cl, %edx # %edx<- vBB op +CC |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_LONG: /* 0x9b */ |
| /* File: x86-atom/OP_ADD_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_LONG.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| paddq %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_LONG: /* 0x9c */ |
| /* File: x86-atom/OP_SUB_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_LONG.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| psubq %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_LONG: /* 0x9d */ |
| /* File: x86-atom/OP_MUL_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_LONG.S |
| * |
| * Code: 64-bit integer multiply |
| * |
| * For: mul-long |
| * |
| * Description: Multiply two source registers and store the |
| * result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| /* |
| * Signed 64-bit integer multiply. |
| * |
| * Consider WXxYZ (r1r0 x r3r2) with a long multiply: |
| * WX |
| * x YZ |
| * -------- |
| * ZW ZX |
| * YW YX |
| * |
| * The low word of the result holds ZX, the high word holds |
| * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because |
| * it doesn't fit in the low 64 bits. |
| */ |
| |
| movl rINST, -4(%esp) # -4(%esp)<- AA+ |
| FETCH_BB 1, rINST # rINST<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| jmp .LOP_MUL_LONG_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_LONG: /* 0x9e */ |
| /* File: x86-atom/OP_DIV_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_LONG.S |
| */ |
| |
| /* File: x86-atom/binopDivRemLong.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDivRemLong.S |
| * |
| * Code: 64-bit long divide operation. Variable |
| * "func" defines the function called to do the operation. |
| * |
| * For: div-long, rem-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_CC 1, %edx # %edx<- CC |
| movl (rFP, %edx, 4), %eax # %eax<- vCC |
| movl 4(rFP, %edx, 4), %ecx # %ecx<- vCC+1 |
| movl %eax, -8(%esp) # push arg vCC |
| or %ecx, %eax # check for divide by zero |
| je common_errDivideByZero # handle divide by zero |
| FETCH_BB 1, %edx # %edx<- BB |
| movl %ecx, -4(%esp) # push arg vCC+1 |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vBB,vBB+1 |
| jmp .LOP_DIV_LONG_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_LONG: /* 0x9f */ |
| /* File: x86-atom/OP_REM_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_LONG.S |
| */ |
| |
| /* File: x86-atom/binopDivRemLong.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDivRemLong.S |
| * |
| * Code: 64-bit long divide operation. Variable |
| * "func" defines the function called to do the operation. |
| * |
| * For: div-long, rem-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| |
| FETCH_CC 1, %edx # %edx<- CC |
| movl (rFP, %edx, 4), %eax # %eax<- vCC |
| movl 4(rFP, %edx, 4), %ecx # %ecx<- vCC+1 |
| movl %eax, -8(%esp) # push arg vCC |
| or %ecx, %eax # check for divide by zero |
| je common_errDivideByZero # handle divide by zero |
| FETCH_BB 1, %edx # %edx<- BB |
| movl %ecx, -4(%esp) # push arg vCC+1 |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vBB,vBB+1 |
| jmp .LOP_REM_LONG_finish |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AND_LONG: /* 0xa0 */ |
| /* File: x86-atom/OP_AND_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AND_LONG.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| pand %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_OR_LONG: /* 0xa1 */ |
| /* File: x86-atom/OP_OR_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_OR_LONG.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| por %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_XOR_LONG: /* 0xa2 */ |
| /* File: x86-atom/OP_XOR_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_XOR_LONG.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| pxor %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHL_LONG: /* 0xa3 */ |
| /* File: x86-atom/OP_SHL_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHL_LONG.S |
| * |
| * Code: Performs a shift left long. Uses no substitutions. |
| * |
| * For: shl-long |
| * |
| * Description: Perform a binary shift operation using two source registers |
| * where one is the shift amount and the other is the value to shift. |
| * Store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_CC 1, %eax # %eax<- CC |
| FETCH_BB 1, %edx # %edx<- BB |
| movq .LshiftMask, %xmm2 # %xmm2<- mask for the shift bits |
| movss (rFP, %eax, 4), %xmm0 # %xmm0<- vCC |
| pand %xmm2, %xmm0 # %xmm0<- masked shift bits |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vBB |
| psllq %xmm0, %xmm1 # %xmm1<- shifted vBB |
| movq %xmm1, (rFP, rINST, 4) # vAA<- shifted vBB |
| FINISH 2 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHR_LONG: /* 0xa4 */ |
| /* File: x86-atom/OP_SHR_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHR_LONG.S |
| * |
| * Code: Performs a shift right long |
| * |
| * For: shl-long |
| * |
| * Description: Perform a binary shift operation using two source registers |
| * where one is the shift amount and the other is the value to shift. |
| * Store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %edx # %edx<- BB |
| FETCH_CC 1, %eax # %eax<- CC |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vBB |
| movss (rFP, %eax, 4), %xmm0 # %xmm0<- vCC |
| movq .LshiftMask, %xmm2 |
| pand %xmm2, %xmm0 # %xmm0<- masked for the shift bits |
| psrlq %xmm0, %xmm1 # %xmm1<- shifted vBB |
| cmpl $0, 4(rFP, %edx, 4) # check if we need to consider sign |
| jl .LOP_SHR_LONG_finish # consider sign |
| jmp .LOP_SHR_LONG_final # sign is fine, finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_USHR_LONG: /* 0xa5 */ |
| /* File: x86-atom/OP_USHR_LONG.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_USHR_LONG.S |
| * |
| * Code: Performs an unsigned shift right long operation. Uses no substitutions. |
| * |
| * For: ushr-long |
| * |
| * Description: Perform a binary shift operation using two source registers |
| * where one is the shift amount and the other is the value to shift. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_CC 1, %eax # %eax<- CC |
| FETCH_BB 1, %edx # %edx<- BB |
| movsd .LshiftMask, %xmm2 # %xmm2<- mask for the shift bits |
| movss (rFP, %eax, 4), %xmm0 # %xmm0<- vCC |
| pand %xmm2, %xmm0 # %xmm0<- masked shift bits |
| movsd (rFP, %edx, 4), %xmm1 # %xmm1<- vBB |
| psrlq %xmm0, %xmm1 # %xmm1<- shifted vBB |
| movsd %xmm1, (rFP, rINST, 4) # vAA<- shifted vBB |
| FINISH 2 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_FLOAT: /* 0xa6 */ |
| /* File: x86-atom/OP_ADD_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_FLOAT.S |
| */ |
| |
| /* File: x86-atom/binopF.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopF.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-float, mul-float, sub-float |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movss (rFP, %ecx, 4), %xmm0 # %xmm0<-vBB |
| movss (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| addss %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movss %xmm0, (rFP, rINST, 4) # vAA<- %xmm0; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_FLOAT: /* 0xa7 */ |
| /* File: x86-atom/OP_SUB_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_FLOAT.S |
| */ |
| |
| /* File: x86-atom/binopF.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopF.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-float, mul-float, sub-float |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movss (rFP, %ecx, 4), %xmm0 # %xmm0<-vBB |
| movss (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| subss %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movss %xmm0, (rFP, rINST, 4) # vAA<- %xmm0; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_FLOAT: /* 0xa8 */ |
| /* File: x86-atom/OP_MUL_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_FLOAT.S |
| */ |
| |
| /* File: x86-atom/binopF.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopF.S |
| * |
| * Code: Generic 32-bit binary operation. Provides an "instr" line to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-float, mul-float, sub-float |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movss (rFP, %ecx, 4), %xmm0 # %xmm0<-vBB |
| movss (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| mulss %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movss %xmm0, (rFP, rINST, 4) # vAA<- %xmm0; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_FLOAT: /* 0xa9 */ |
| /* File: x86-atom/OP_DIV_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_FLOAT.S |
| * |
| * Code: Divides floats. Uses no substitutions. |
| * |
| * For: div-float |
| * |
| * Description: Divide operation on two source registers, storing |
| * the result in a destiniation register |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %eax # %eax<- BB |
| FETCH_CC 1, %ecx # %ecx<- CC |
| flds (rFP, %eax, 4) # floating point stack vBB |
| fdivs (rFP, %ecx, 4) # divide double; vBB/vCC |
| fstps (rFP, rINST, 4) # vAA<- result |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_FLOAT: /* 0xaa */ |
| /* File: x86-atom/OP_REM_FLOAT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_FLOAT.S |
| * |
| * Code: Computes the remainder of a division. Performs no substitutions. |
| * |
| * For: rem-float |
| * |
| * Description: Calls fmod to compute the remainder of the result of dividing a |
| * source register by a second, and stores the result in a |
| * destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| GET_VREG %ecx # %ecx<- vBB |
| GET_VREG %edx # %edx<- vCC |
| movl %ecx, -8(%esp) # push parameter float |
| movl %edx, -4(%esp) # push parameter float |
| lea -8(%esp), %esp |
| call fmodf # call: (float x, float y) |
| # return: float |
| lea 8(%esp), %esp |
| fstps (rFP, rINST, 4) # vAA<- remainder; return of fmod |
| FINISH 2 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_DOUBLE: /* 0xab */ |
| /* File: x86-atom/OP_ADD_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_DOUBLE.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| addsd %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_DOUBLE: /* 0xac */ |
| /* File: x86-atom/OP_SUB_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_DOUBLE.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| subsd %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_DOUBLE: /* 0xad */ |
| /* File: x86-atom/OP_MUL_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_DOUBLE.S |
| */ |
| |
| /* File: x86-atom/binopWide.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide.S |
| * |
| * Code: Generic 64-bit binary operation. Provides an "instr" variable to |
| * specify an instruction that performs "%xmm0 = %xmm0 op %xmm1" |
| * |
| * For: add-double, add-long, and-long, mul-double, or-long, |
| * sub-double, sub-long, xor-long |
| * |
| * Description: Perform a binary operation on two source registers |
| * and store the result in a destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, %ecx, 4), %xmm0 # %xmm0<- vBB |
| movq (rFP, %edx, 4), %xmm1 # %xmm1<- vCC |
| mulsd %xmm1, %xmm0 # %xmm0<- vBB op vCC |
| movq %xmm0, (rFP, rINST, 4) # vAA<- %ecx |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_DOUBLE: /* 0xae */ |
| /* File: x86-atom/OP_DIV_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_DOUBLE.S |
| * |
| * Code: Divides doubles. Uses no substitutions. |
| * |
| * For: div-double |
| * |
| * Description: Divide operation on two source registers, storing |
| * the result in a destination register |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| fldl (rFP, %ecx, 4) # floating point stack vBB |
| fdivl (rFP, %edx, 4) # divide double; vBB/vCC |
| fstpl (rFP, rINST, 4) # vAA<- result |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_DOUBLE: /* 0xaf */ |
| /* File: x86-atom/OP_REM_DOUBLE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_DOUBLE.S |
| * |
| * Code: Computes the remainder of a division. Performs no substitutions. |
| * |
| * For: rem-double |
| * |
| * Description: Calls fmod to compute the remainder of the result of dividing a |
| * source register by a second, and stores the result in a |
| * destination register. |
| * |
| * Format: AA|op CC|BB (23x) |
| * |
| * Syntax: op vAA, vBB, vCC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CC 1, %edx # %edx<- CC |
| movl (rFP, %ecx, 4), %eax # %eax<- vBBlo |
| movl %eax, -16(%esp) # push parameter double lo |
| movl 4(rFP, %ecx, 4), %eax # %eax<- vBBhi |
| movl %eax, -12(%esp) # push parameter double hi |
| movl (rFP, %edx, 4), %eax # %eax<- vCClo |
| movl %eax, -8(%esp) # push parameter double lo |
| movl 4(rFP, %edx, 4), %eax # %eax<- vCChi |
| movl %eax, -4(%esp) # push parameter double hi |
| lea -16(%esp), %esp |
| jmp .LOP_REM_DOUBLE_break |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_INT_2ADDR: /* 0xb0 */ |
| /* File: x86-atom/OP_ADD_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binop2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%ecx = %ecx op %edx". |
| * |
| * For: add-int/2addr, and-int/2addr, mul-int/2addr, or-int/2addr, |
| * sub-int/2addr, xor-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| #FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| OLD_JMP_1 1, %eax |
| andl $15, rINST # rINST<- A |
| OLD_JMP_2 %eax |
| GET_VREG %edx # %edx<- vB |
| OLD_JMP_3 1 |
| addl %edx, (rFP, rINST, 4) # %ecx<- vA op vB |
| #FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_INT_2ADDR: /* 0xb1 */ |
| /* File: x86-atom/OP_SUB_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binop2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%ecx = %ecx op %edx". |
| * |
| * For: add-int/2addr, and-int/2addr, mul-int/2addr, or-int/2addr, |
| * sub-int/2addr, xor-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| #FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| OLD_JMP_1 1, %eax |
| andl $15, rINST # rINST<- A |
| OLD_JMP_2 %eax |
| GET_VREG %edx # %edx<- vB |
| OLD_JMP_3 1 |
| subl %edx, (rFP, rINST, 4) # %ecx<- vA op vB |
| #FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_INT_2ADDR: /* 0xb2 */ |
| /* File: x86-atom/OP_MUL_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_INT_2ADDR.S |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| movl rINST, %ecx # %ecx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vA |
| imul (rFP, %edx, 4), %ecx # %ecx<- vA * vB |
| addl $2, rPC # update PC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_INT_2ADDR: /* 0xb3 */ |
| /* File: x86-atom/OP_DIV_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopD2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopD2addr.S |
| * |
| * Code: 32-bit "/2addr" integer divde operation. If "div" |
| * is set, the code returns the quotient, else it returns |
| * the remainder. Also, a divide-by-zero check is done. |
| * |
| * For: div-int/2addr, rem-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A, to be used as dest |
| movl rINST, %eax # %eax<- A |
| GET_VREG %ecx # %edx<- vB |
| testl %ecx, %ecx # check for divide by zero |
| GET_VREG %eax # %eax<- vA |
| jz common_errDivideByZero # handle divide by zero |
| cmpl $-1, %ecx # handle -1 special case divide error |
| jnz .LOP_DIV_INT_2ADDR_continue |
| cmpl $0x80000000, %eax # handle min int special case divide error |
| je .LOP_DIV_INT_2ADDR_break |
| |
| .LOP_DIV_INT_2ADDR_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 1 |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| SET_VREG %eax rINST # vAA<- %eax (quotient) |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| .else |
| FFETCH_ADV 1, %eax # %ecx<- next instruction hi; fetch, advance |
| SET_VREG %edx rINST # vAA<- %edx (remainder) |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| .endif |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_INT_2ADDR: /* 0xb4 */ |
| /* File: x86-atom/OP_REM_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopD2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopD2addr.S |
| * |
| * Code: 32-bit "/2addr" integer divde operation. If "div" |
| * is set, the code returns the quotient, else it returns |
| * the remainder. Also, a divide-by-zero check is done. |
| * |
| * For: div-int/2addr, rem-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A, to be used as dest |
| movl rINST, %eax # %eax<- A |
| GET_VREG %ecx # %edx<- vB |
| testl %ecx, %ecx # check for divide by zero |
| GET_VREG %eax # %eax<- vA |
| jz common_errDivideByZero # handle divide by zero |
| cmpl $-1, %ecx # handle -1 special case divide error |
| jnz .LOP_REM_INT_2ADDR_continue |
| cmpl $0x80000000, %eax # handle min int special case divide error |
| je .LOP_REM_INT_2ADDR_break |
| |
| .LOP_REM_INT_2ADDR_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 0 |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| SET_VREG %eax rINST # vAA<- %eax (quotient) |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| .else |
| FFETCH_ADV 1, %eax # %ecx<- next instruction hi; fetch, advance |
| SET_VREG %edx rINST # vAA<- %edx (remainder) |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| .endif |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AND_INT_2ADDR: /* 0xb5 */ |
| /* File: x86-atom/OP_AND_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AND_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binop2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%ecx = %ecx op %edx". |
| * |
| * For: add-int/2addr, and-int/2addr, mul-int/2addr, or-int/2addr, |
| * sub-int/2addr, xor-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| #FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| OLD_JMP_1 1, %eax |
| andl $15, rINST # rINST<- A |
| OLD_JMP_2 %eax |
| GET_VREG %edx # %edx<- vB |
| OLD_JMP_3 1 |
| andl %edx, (rFP, rINST, 4) # %ecx<- vA op vB |
| #FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_OR_INT_2ADDR: /* 0xb6 */ |
| /* File: x86-atom/OP_OR_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_OR_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binop2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%ecx = %ecx op %edx". |
| * |
| * For: add-int/2addr, and-int/2addr, mul-int/2addr, or-int/2addr, |
| * sub-int/2addr, xor-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| #FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| OLD_JMP_1 1, %eax |
| andl $15, rINST # rINST<- A |
| OLD_JMP_2 %eax |
| GET_VREG %edx # %edx<- vB |
| OLD_JMP_3 1 |
| or %edx, (rFP, rINST, 4) # %ecx<- vA op vB |
| #FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_XOR_INT_2ADDR: /* 0xb7 */ |
| /* File: x86-atom/OP_XOR_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_XOR_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binop2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binop2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%ecx = %ecx op %edx". |
| * |
| * For: add-int/2addr, and-int/2addr, mul-int/2addr, or-int/2addr, |
| * sub-int/2addr, xor-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| #FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| OLD_JMP_1 1, %eax |
| andl $15, rINST # rINST<- A |
| OLD_JMP_2 %eax |
| GET_VREG %edx # %edx<- vB |
| OLD_JMP_3 1 |
| xor %edx, (rFP, rINST, 4) # %ecx<- vA op vB |
| #FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| OLD_JMP_4 %eax |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHL_INT_2ADDR: /* 0xb8 */ |
| /* File: x86-atom/OP_SHL_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHL_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopS2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopS2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%edx = %edx op %cl". |
| * |
| * For: shl-int/2addr, shr-int/2addr, ushr-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| FFETCH_ADV 1, %eax # %ecx<- next i nstruction hi; fetch, advance |
| andl $15, rINST # rINST<- A |
| addl $2, rPC # update PC |
| movl rINST, %edx # %edx<- A |
| GET_VREG %ecx # %ecx<- vB |
| GET_VREG %edx # %edx<- vA |
| sal %cl, %edx # %edx<- vA op vB |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHR_INT_2ADDR: /* 0xb9 */ |
| /* File: x86-atom/OP_SHR_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHR_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopS2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopS2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%edx = %edx op %cl". |
| * |
| * For: shl-int/2addr, shr-int/2addr, ushr-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| FFETCH_ADV 1, %eax # %ecx<- next i nstruction hi; fetch, advance |
| andl $15, rINST # rINST<- A |
| addl $2, rPC # update PC |
| movl rINST, %edx # %edx<- A |
| GET_VREG %ecx # %ecx<- vB |
| GET_VREG %edx # %edx<- vA |
| sar %cl, %edx # %edx<- vA op vB |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_USHR_INT_2ADDR: /* 0xba */ |
| /* File: x86-atom/OP_USHR_INT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_USHR_INT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopS2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopS2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%edx = %edx op %cl". |
| * |
| * For: shl-int/2addr, shr-int/2addr, ushr-int/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| FFETCH_ADV 1, %eax # %ecx<- next i nstruction hi; fetch, advance |
| andl $15, rINST # rINST<- A |
| addl $2, rPC # update PC |
| movl rINST, %edx # %edx<- A |
| GET_VREG %ecx # %ecx<- vB |
| GET_VREG %edx # %edx<- vA |
| shr %cl, %edx # %edx<- vA op vB |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP2 %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_LONG_2ADDR: /* 0xbb */ |
| /* File: x86-atom/OP_ADD_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| paddq %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_LONG_2ADDR: /* 0xbc */ |
| /* File: x86-atom/OP_SUB_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| psubq %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_LONG_2ADDR: /* 0xbd */ |
| /* File: x86-atom/OP_MUL_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_LONG_2ADDR.S |
| * |
| * Code: 64-bit integer multiply |
| * |
| * For: mul-long/2addr |
| * |
| * Description: Multiply two sources registers and store the result |
| * in the first source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| /* |
| * Signed 64-bit integer multiply. |
| * |
| * Consider WXxYZ (r1r0 x r3r2) with a long multiply: |
| * WX |
| * x YZ |
| * -------- |
| * ZW ZX |
| * YW YX |
| * |
| * The low word of the result holds ZX, the high word holds |
| * (ZW+YX) + (the high overflow from ZX). YW doesn't matter because |
| * it doesn't fit in the low 64 bits. |
| */ |
| |
| movl rINST, %edx # %edx<- BA+ |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| movl %edx, sReg0 # sReg0<- A |
| jmp .LOP_MUL_LONG_2ADDR_finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_LONG_2ADDR: /* 0xbe */ |
| /* File: x86-atom/OP_DIV_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopDivRemLong2Addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDivRemLong2Addr.S |
| * |
| * Code: 64-bit "/2addr" long divide operation. Variable |
| * "func" defines the function called to do the operation. |
| * |
| * For: div-long/2addr, rem-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| and $15, rINST # rINST<- A |
| movl (rFP, %edx, 4), %eax # %eax<- vB |
| movl %eax, -12(%esp) # push arg vB |
| movl 4(rFP, %edx, 4), %ecx # %ecx<- vB+1 |
| or %ecx, %eax # check for divide by zero |
| je common_errDivideByZero # handle divide by zero |
| movl %ecx, -8(%esp) # push arg vB+1 |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vA,vA+1 |
| jmp .LOP_DIV_LONG_2ADDR_break |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_LONG_2ADDR: /* 0xbf */ |
| /* File: x86-atom/OP_REM_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopDivRemLong2Addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDivRemLong2Addr.S |
| * |
| * Code: 64-bit "/2addr" long divide operation. Variable |
| * "func" defines the function called to do the operation. |
| * |
| * For: div-long/2addr, rem-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| and $15, rINST # rINST<- A |
| movl (rFP, %edx, 4), %eax # %eax<- vB |
| movl %eax, -12(%esp) # push arg vB |
| movl 4(rFP, %edx, 4), %ecx # %ecx<- vB+1 |
| or %ecx, %eax # check for divide by zero |
| je common_errDivideByZero # handle divide by zero |
| movl %ecx, -8(%esp) # push arg vB+1 |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vA,vA+1 |
| jmp .LOP_REM_LONG_2ADDR_break |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AND_LONG_2ADDR: /* 0xc0 */ |
| /* File: x86-atom/OP_AND_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AND_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| pand %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_OR_LONG_2ADDR: /* 0xc1 */ |
| /* File: x86-atom/OP_OR_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_OR_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| por %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_XOR_LONG_2ADDR: /* 0xc2 */ |
| /* File: x86-atom/OP_XOR_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_XOR_LONG_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| pxor %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHL_LONG_2ADDR: /* 0xc3 */ |
| /* File: x86-atom/OP_SHL_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHL_LONG_2ADDR.S |
| * |
| * Code: Performs a shift left long. Uses no substitutions. |
| * |
| * For: shl-long/2addr |
| * |
| * Description: Perform a binary shift operation using two source registers |
| * where the fist is the value to shift and the second is the |
| * shift amount. Store the result in the first source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| movss (rFP, %edx, 4), %xmm0 # %xmm0<- vB |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vA |
| movq .LshiftMask, %xmm2 # %xmm2<- mask for the shift bits |
| pand %xmm2, %xmm0 # %xmm0<- masked shift bits |
| psllq %xmm0, %xmm1 # %xmm1<- shifted vA |
| movq %xmm1, (rFP, rINST, 4) # vA<- shifted vA |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHR_LONG_2ADDR: /* 0xc4 */ |
| /* File: x86-atom/OP_SHR_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHR_LONG_2ADDR.S |
| * |
| * Code: Performs a shift left long |
| * |
| * For: shl-long/2addr |
| * |
| * Description: Perform a binary shift operation using two source registers |
| * where the fist is the value to shift and the second is the |
| * shift amount. Store the result in the first source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- BA |
| movss (rFP, %edx, 4), %xmm0 # %xmm0<- vB |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vA |
| movq .LshiftMask, %xmm2 |
| pand %xmm2, %xmm0 # %xmm0<- masked for the shift bits |
| psrlq %xmm0, %xmm1 # %xmm1<- shifted vBB |
| cmpl $0, 4(rFP, rINST, 4) # check if we need to consider sign |
| jl .LOP_SHR_LONG_2ADDR_finish # consider sign |
| jmp .LOP_SHR_LONG_2ADDR_final # sign is fine, finish |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_USHR_LONG_2ADDR: /* 0xc5 */ |
| /* File: x86-atom/OP_USHR_LONG_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_USHR_LONG_2ADDR.S |
| * |
| * Code: Performs an unsigned shift right long operation. Uses no substiutions. |
| * |
| * For: ushr-long/2addr |
| * |
| * Description: Perform a binary shift operation using two source registers |
| * where the fist is the value to shift and the second is the |
| * shift amount. Store the result in the first source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| movq .LshiftMask, %xmm2 # %xmm2<- mask for the shift bits |
| movss (rFP, %edx, 4), %xmm0 # %xmm0<- vB |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vA |
| pand %xmm2, %xmm0 # %xmm0<- masked shift bits |
| psrlq %xmm0, %xmm1 # %xmm1<- shifted vA |
| movq %xmm1, (rFP, rINST, 4) # vA<- shifted vA |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_FLOAT_2ADDR: /* 0xc6 */ |
| /* File: x86-atom/OP_ADD_FLOAT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_FLOAT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopF2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopF2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0 = %xmm0 op %xmm1". |
| * |
| * For: add-float/2addr, mul-float/2addr, sub-float/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| andl $15, %ecx # %ecx<- A |
| shr $4, rINST # rINST<- B |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| movss (rFP, %ecx, 4), %xmm0 # %xmm0<- vA |
| movss (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| addss %xmm1, %xmm0 # %xmm0<- vA op vB |
| movss %xmm0, (rFP, %ecx, 4) # vA<- %xmm0; result |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_FLOAT_2ADDR: /* 0xc7 */ |
| /* File: x86-atom/OP_SUB_FLOAT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_FLOAT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopF2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopF2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0 = %xmm0 op %xmm1". |
| * |
| * For: add-float/2addr, mul-float/2addr, sub-float/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| andl $15, %ecx # %ecx<- A |
| shr $4, rINST # rINST<- B |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| movss (rFP, %ecx, 4), %xmm0 # %xmm0<- vA |
| movss (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| subss %xmm1, %xmm0 # %xmm0<- vA op vB |
| movss %xmm0, (rFP, %ecx, 4) # vA<- %xmm0; result |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_FLOAT_2ADDR: /* 0xc8 */ |
| /* File: x86-atom/OP_MUL_FLOAT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_FLOAT_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopF2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopF2addr.S |
| * |
| * Code: Generic 32-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0 = %xmm0 op %xmm1". |
| * |
| * For: add-float/2addr, mul-float/2addr, sub-float/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| andl $15, %ecx # %ecx<- A |
| shr $4, rINST # rINST<- B |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| movss (rFP, %ecx, 4), %xmm0 # %xmm0<- vA |
| movss (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| mulss %xmm1, %xmm0 # %xmm0<- vA op vB |
| movss %xmm0, (rFP, %ecx, 4) # vA<- %xmm0; result |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_FLOAT_2ADDR: /* 0xc9 */ |
| /* File: x86-atom/OP_DIV_FLOAT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_FLOAT_2ADDR.S |
| * |
| * Code: Divides floats. Uses no substitutions. |
| * |
| * For: div-float/2addr |
| * |
| * Description: Divide operation on two source registers, storing |
| * the result in the first source reigster |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| andl $15, %ecx # %ecx<- A |
| shr $4, rINST # rINST<- B |
| flds (rFP, %ecx, 4) # %xmm0<- vA |
| fdivs (rFP, rINST, 4) # divide double; vA/vB |
| fstps (rFP, %ecx, 4) # vAA<- result |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_FLOAT_2ADDR: /* 0xca */ |
| /* File: x86-atom/OP_REM_FLOAT_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_FLOAT_2ADDR.S |
| * |
| * Code: Computes the remainder of a division. Performs no substitutions. |
| * |
| * For: rem-float/2addr |
| * |
| * Description: Calls fmod to compute the remainder of the result of dividing a |
| * source register by a second, and stores the result in the first |
| * source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| GET_VREG %edx # %edx<- vB |
| movl (rFP, rINST, 4), %ecx # %ecx<- vA |
| movl %ecx, -8(%esp) # push parameter vA |
| movl %edx, -4(%esp) # push parameter vB |
| lea -8(%esp), %esp |
| call fmodf # call: (float x, float y) |
| # return: float |
| lea 8(%esp), %esp |
| fstps (rFP, rINST, 4) |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_DOUBLE_2ADDR: /* 0xcb */ |
| /* File: x86-atom/OP_ADD_DOUBLE_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_DOUBLE_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| addsd %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SUB_DOUBLE_2ADDR: /* 0xcc */ |
| /* File: x86-atom/OP_SUB_DOUBLE_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SUB_DOUBLE_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| subsd %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_DOUBLE_2ADDR: /* 0xcd */ |
| /* File: x86-atom/OP_MUL_DOUBLE_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_DOUBLE_2ADDR.S |
| */ |
| |
| /* File: x86-atom/binopWide2addr.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopWide2addr.S |
| * |
| * Code: Generic 64-bit "/2addr" binary operation. Provides an |
| * "instr" line to specify an instruction that performs |
| * "%xmm0= %xmm0 op %xmm1". |
| * |
| * For: add-double/2addr, add-long/2addr, and-long/2addr, mul-long/2addr, |
| * or-long/2addr, sub-double/2addr, sub-long/2addr, xor-long/2addr |
| * |
| * Description: Perform a binary operation on two sources registers |
| * and store the result in the first source register |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, rINST # rINST<- B |
| andl $15, %edx # %edx<- A |
| FFETCH_ADV 1, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm1 # %xmm1<- vB |
| movq (rFP, %edx, 4), %xmm0 # %xmm0<- vA |
| mulsd %xmm1, %xmm0 # %xmm0<- vA op vB |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; result |
| #FINISH 1 # jump to next instruction |
| FGETOP_JMP 1, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_DOUBLE_2ADDR: /* 0xce */ |
| /* File: x86-atom/OP_DIV_DOUBLE_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_DOUBLE_2ADDR.S |
| * |
| * Code: Divides doubles. Uses no substitutions. |
| * |
| * For: div-double/2addr |
| * |
| * Description: Divide operation on two source registers, storing |
| * the result in the first source reigster |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| andl $15, %edx # %edx<- A |
| shr $4, rINST # rINST<- B |
| fldl (rFP, %edx, 4) # %xmm0<- vA |
| fdivl (rFP, rINST, 4) # divide double; vA/vB |
| fstpl (rFP, %edx, 4) # vAA<- result |
| FINISH 1 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_DOUBLE_2ADDR: /* 0xcf */ |
| /* File: x86-atom/OP_REM_DOUBLE_2ADDR.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_DOUBLE_2ADDR.S |
| * |
| * Code: Computes the remainder of a division. Performs no substitutions. |
| * |
| * For: rem-double/2addr |
| * |
| * Description: Calls fmod to compute the remainder of the result of dividing a |
| * source register by a second, and stores the result in the first |
| * source register. |
| * |
| * Format: B|A|op (12x) |
| * |
| * Syntax: op vA, vB |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| and $15, rINST # rINST<- A |
| shr $4, %edx # %edx<- B |
| movl (rFP, rINST, 4), %eax # %eax<- vAlo |
| movl %eax, -20(%esp) # push parameter vAAlo |
| movl 4(rFP, rINST, 4), %eax # %eax<- vAhi |
| movl %eax, -16(%esp) # push parameter vAAhi |
| movl (rFP, %edx, 4), %eax # %eax<- vBlo |
| movl %eax, -12(%esp) # push parameter vBBlo |
| movl 4(rFP, %edx, 4), %eax # %eax<- vBhi |
| movl %eax, -8(%esp) # push parameter vBBhi |
| lea -20(%esp), %esp |
| jmp .LOP_REM_DOUBLE_2ADDR_break |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_INT_LIT16: /* 0xd0 */ |
| /* File: x86-atom/OP_ADD_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit16.S |
| * |
| * Code: 32-bit "lit16" operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit16, and-int/lit16, mul-int/lit16, or-int/lit16 |
| * xor-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value and store the |
| * result in a destination register. |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A |
| FETCHs 1, %edx # %edx<- +CCCC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| addl %edx, %ecx # %ecx<- vA op vB |
| SET_VREG %ecx, rINST # vA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RSUB_INT: /* 0xd1 */ |
| /* File: x86-atom/OP_RSUB_INT.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RSUB_INT.S |
| * |
| * Code: 32-bit reverse-subtraction. Uses no substitutions. |
| * |
| * For: rsub-int |
| * |
| * Description: Perform a reverse subtraction on a register and a |
| * signed extended 16-bit literal value and store the |
| * result in a destination register. |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A |
| FETCHs 1, %edx # %edx<- +CCCC, sign-extended literal |
| GET_VREG %ecx # %ecx<- vB |
| subl %ecx, %edx # %edx<- +CCCC sub vB |
| SET_VREG %edx, rINST # vA<- %edx; result |
| FINISH 2 # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_INT_LIT16: /* 0xd2 */ |
| /* File: x86-atom/OP_MUL_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit16.S |
| * |
| * Code: 32-bit "lit16" operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit16, and-int/lit16, mul-int/lit16, or-int/lit16 |
| * xor-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value and store the |
| * result in a destination register. |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A |
| FETCHs 1, %edx # %edx<- +CCCC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| imul %edx, %ecx # %ecx<- vA op vB |
| SET_VREG %ecx, rINST # vA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_INT_LIT16: /* 0xd3 */ |
| /* File: x86-atom/OP_DIV_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopDLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDLit16.S |
| * |
| * Code: 32-bit "lit16" divide operation. If "div" is set, the code |
| * returns the quotient, else it returns the remainder. |
| * Also, a divide-by-zero check is done. |
| * |
| * For: div-int/lit16, rem-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| FETCHs 1, %ecx # %ecx<- +CCCC, sign-extended literal |
| testl %ecx, %ecx # check for divide by zero |
| GET_VREG %eax # %eax<- vB |
| je common_errDivideByZero # handle divide by zero |
| addl $4, rPC # update PC |
| andl $15, rINST # rINST<- A |
| cmpl $-1, %ecx # handle -1 special case divide error |
| jnz .LOP_DIV_INT_LIT16_continue |
| cmpl $0x80000000,%eax # handle min int special case divide error |
| je .LOP_DIV_INT_LIT16_break |
| .LOP_DIV_INT_LIT16_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 1 |
| movzbl (rPC), %edx |
| SET_VREG %eax, rINST # vA<- %eax (quotient) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| .else |
| movzbl (rPC), %eax |
| SET_VREG %edx, rINST # vA<- %edx (remainder) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %eax, 4) |
| .endif |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_INT_LIT16: /* 0xd4 */ |
| /* File: x86-atom/OP_REM_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopDLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDLit16.S |
| * |
| * Code: 32-bit "lit16" divide operation. If "div" is set, the code |
| * returns the quotient, else it returns the remainder. |
| * Also, a divide-by-zero check is done. |
| * |
| * For: div-int/lit16, rem-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| FETCHs 1, %ecx # %ecx<- +CCCC, sign-extended literal |
| testl %ecx, %ecx # check for divide by zero |
| GET_VREG %eax # %eax<- vB |
| je common_errDivideByZero # handle divide by zero |
| addl $4, rPC # update PC |
| andl $15, rINST # rINST<- A |
| cmpl $-1, %ecx # handle -1 special case divide error |
| jnz .LOP_REM_INT_LIT16_continue |
| cmpl $0x80000000,%eax # handle min int special case divide error |
| je .LOP_REM_INT_LIT16_break |
| .LOP_REM_INT_LIT16_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 0 |
| movzbl (rPC), %edx |
| SET_VREG %eax, rINST # vA<- %eax (quotient) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| .else |
| movzbl (rPC), %eax |
| SET_VREG %edx, rINST # vA<- %edx (remainder) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %eax, 4) |
| .endif |
| |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AND_INT_LIT16: /* 0xd5 */ |
| /* File: x86-atom/OP_AND_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AND_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit16.S |
| * |
| * Code: 32-bit "lit16" operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit16, and-int/lit16, mul-int/lit16, or-int/lit16 |
| * xor-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value and store the |
| * result in a destination register. |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A |
| FETCHs 1, %edx # %edx<- +CCCC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| andl %edx, %ecx # %ecx<- vA op vB |
| SET_VREG %ecx, rINST # vA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_OR_INT_LIT16: /* 0xd6 */ |
| /* File: x86-atom/OP_OR_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_OR_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit16.S |
| * |
| * Code: 32-bit "lit16" operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit16, and-int/lit16, mul-int/lit16, or-int/lit16 |
| * xor-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value and store the |
| * result in a destination register. |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A |
| FETCHs 1, %edx # %edx<- +CCCC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| or %edx, %ecx # %ecx<- vA op vB |
| SET_VREG %ecx, rINST # vA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_XOR_INT_LIT16: /* 0xd7 */ |
| /* File: x86-atom/OP_XOR_INT_LIT16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_XOR_INT_LIT16.S |
| */ |
| |
| /* File: x86-atom/binopLit16.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit16.S |
| * |
| * Code: 32-bit "lit16" operation. Provides an "instr" line to |
| * specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit16, and-int/lit16, mul-int/lit16, or-int/lit16 |
| * xor-int/lit16 |
| * |
| * Description: Perform a binary operation on a register and a |
| * sign extended 16-bit literal value and store the |
| * result in a destination register. |
| * |
| * Format: B|A|op CCCC (22s) |
| * |
| * Syntax: op vA, vB, #+CCCC |
| */ |
| |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| andl $15, rINST # rINST<- A |
| FETCHs 1, %edx # %edx<- +CCCC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vB |
| xor %edx, %ecx # %ecx<- vA op vB |
| SET_VREG %ecx, rINST # vA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_ADD_INT_LIT8: /* 0xd8 */ |
| /* File: x86-atom/OP_ADD_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_ADD_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit8, and-int/lit8, mul-int/lit8, or-int/lit8 |
| * xor-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CCs 1, %edx # %edx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vBB |
| addl %edx, %ecx # %ecx<- vBB op +CC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RSUB_INT_LIT8: /* 0xd9 */ |
| /* File: x86-atom/OP_RSUB_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_RSUB_INT_LIT8.S |
| * |
| * Code: 32-bit reverse-subtraction. Uses no substitutions. |
| * |
| * For: rsub-int/lit8 |
| * |
| * Description: Perform a reverse subtraction on a register and a |
| * signed extended 8-bit literal value. |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CCs 1, %edx # %edx<- +CC, sign-extended literal |
| GET_VREG %ecx # %ecx<- vBB |
| sub %ecx, %edx # %edx<- +CC sub vBB |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FINISH 2 # jump to next instruction |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_MUL_INT_LIT8: /* 0xda */ |
| /* File: x86-atom/OP_MUL_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_MUL_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit8, and-int/lit8, mul-int/lit8, or-int/lit8 |
| * xor-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CCs 1, %edx # %edx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vBB |
| imul %edx, %ecx # %ecx<- vBB op +CC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DIV_INT_LIT8: /* 0xdb */ |
| /* File: x86-atom/OP_DIV_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DIV_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopDLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. If "div" is set, the code |
| * returns the quotient, else it returns the remainder. |
| * Also, a divide-by-zero check is done. |
| * |
| * For: div-int/lit8, rem-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signe extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| |
| FETCH_CCs 1, %ecx # %ecx<- +CC, sign-extended literal |
| testl %ecx, %ecx # handle -1 special case divide error |
| FETCH_BB 1, %eax # %eax<- BB |
| jz common_errDivideByZero # handle divide by zero |
| addl $4, rPC # update PC |
| cmpl $-1, %ecx |
| GET_VREG %eax # %eax<- vBB |
| jnz .LOP_DIV_INT_LIT8_continue |
| cmpl $0x80000000,%eax # handle min int special case divide error |
| je .LOP_DIV_INT_LIT8_break |
| .LOP_DIV_INT_LIT8_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 1 |
| movzbl (rPC), %edx |
| SET_VREG %eax, rINST # vA<- %eax (quotient) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| .else |
| movzbl (rPC), %eax |
| SET_VREG %edx, rINST # vA<- %edx (remainder) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %eax, 4) |
| .endif |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_REM_INT_LIT8: /* 0xdc */ |
| /* File: x86-atom/OP_REM_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_REM_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopDLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopDLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. If "div" is set, the code |
| * returns the quotient, else it returns the remainder. |
| * Also, a divide-by-zero check is done. |
| * |
| * For: div-int/lit8, rem-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signe extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| |
| FETCH_CCs 1, %ecx # %ecx<- +CC, sign-extended literal |
| testl %ecx, %ecx # handle -1 special case divide error |
| FETCH_BB 1, %eax # %eax<- BB |
| jz common_errDivideByZero # handle divide by zero |
| addl $4, rPC # update PC |
| cmpl $-1, %ecx |
| GET_VREG %eax # %eax<- vBB |
| jnz .LOP_REM_INT_LIT8_continue |
| cmpl $0x80000000,%eax # handle min int special case divide error |
| je .LOP_REM_INT_LIT8_break |
| .LOP_REM_INT_LIT8_continue: |
| cdq # sign-extend %eax to %edx |
| idiv %ecx # divide %edx:%eax by %ecx |
| .if 0 |
| movzbl (rPC), %edx |
| SET_VREG %eax, rINST # vA<- %eax (quotient) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| .else |
| movzbl (rPC), %eax |
| SET_VREG %edx, rINST # vA<- %edx (remainder) |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %eax, 4) |
| .endif |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_AND_INT_LIT8: /* 0xdd */ |
| /* File: x86-atom/OP_AND_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_AND_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit8, and-int/lit8, mul-int/lit8, or-int/lit8 |
| * xor-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CCs 1, %edx # %edx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vBB |
| andl %edx, %ecx # %ecx<- vBB op +CC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_OR_INT_LIT8: /* 0xde */ |
| /* File: x86-atom/OP_OR_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_OR_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit8, and-int/lit8, mul-int/lit8, or-int/lit8 |
| * xor-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CCs 1, %edx # %edx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vBB |
| or %edx, %ecx # %ecx<- vBB op +CC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_XOR_INT_LIT8: /* 0xdf */ |
| /* File: x86-atom/OP_XOR_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_XOR_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%ecx = %ecx op %edx" |
| * |
| * |
| * For: add-int/lit8, and-int/lit8, mul-int/lit8, or-int/lit8 |
| * xor-int/lit8 |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %ecx # %ecx<- BB |
| FETCH_CCs 1, %edx # %edx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %ecx # %ecx<- vBB |
| xor %edx, %ecx # %ecx<- vBB op +CC |
| SET_VREG %ecx, rINST # vAA<- %ecx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHL_INT_LIT8: /* 0xe0 */ |
| /* File: x86-atom/OP_SHL_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHL_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8S.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8S.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%edx = %edx op %cl" |
| * |
| * |
| * For: shl-int/lit8, shr-int/lit8, ushr-int/lit8 |
| * |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %edx # %edx<- BB |
| FETCH_CCs 1, %ecx # %ecx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vBB |
| sal %cl, %edx # %edx<- vBB op +CC |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SHR_INT_LIT8: /* 0xe1 */ |
| /* File: x86-atom/OP_SHR_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_SHR_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8S.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8S.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%edx = %edx op %cl" |
| * |
| * |
| * For: shl-int/lit8, shr-int/lit8, ushr-int/lit8 |
| * |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %edx # %edx<- BB |
| FETCH_CCs 1, %ecx # %ecx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vBB |
| sar %cl, %edx # %edx<- vBB op +CC |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_USHR_INT_LIT8: /* 0xe2 */ |
| /* File: x86-atom/OP_USHR_INT_LIT8.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_USHR_INT_LIT8.S |
| */ |
| |
| /* File: x86-atom/binopLit8S.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: binopLit8S.S |
| * |
| * Code: 32-bit "lit8" divide operation. Provides an "instr" line |
| * to specify an instruction that performs "%edx = %edx op %cl" |
| * |
| * |
| * For: shl-int/lit8, shr-int/lit8, ushr-int/lit8 |
| * |
| * |
| * Description: Perform a binary operation on a register and a |
| * signed extended 8-bit literal value |
| * |
| * Format: AA|op CC|BB (22b) |
| * |
| * Syntax: op vAA, vBB, #+CC |
| */ |
| |
| FETCH_BB 1, %edx # %edx<- BB |
| FETCH_CCs 1, %ecx # %ecx<- +CC, sign-extended literal |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG %edx # %edx<- vBB |
| shr %cl, %edx # %edx<- vBB op +CC |
| SET_VREG %edx, rINST # vAA<- %edx; result |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_VOLATILE: /* 0xe3 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_IGET_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_VOLATILE: /* 0xe4 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_IPUT_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_VOLATILE: /* 0xe5 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_SGET_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_VOLATILE: /* 0xe6 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_SPUT_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_IGET_OBJECT_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_WIDE_VOLATILE: /* 0xe8 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_IGET_WIDE_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_WIDE_VOLATILE: /* 0xe9 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_IPUT_WIDE_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_WIDE_VOLATILE: /* 0xea */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_SGET_WIDE_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_WIDE_VOLATILE: /* 0xeb */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_SPUT_WIDE_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_BREAKPOINT: /* 0xec */ |
| /* File: x86-atom/OP_BREAKPOINT.S */ |
| /* File: x86/unused.S */ |
| jmp common_abort |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_THROW_VERIFICATION_ERROR: /* 0xed */ |
| /* File: x86-atom/OP_THROW_VERIFICATION_ERROR.S */ |
| /* Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_THROW_VERIFICATION_ERROR.S |
| * |
| * Code: |
| * |
| * For: throw-verification-error |
| * |
| * Description: Throws an exception for an error discovered during verification. |
| * The exception is indicated by AA with details provided by BBBB. |
| * |
| * Format: AA|op BBBB (21c) |
| * |
| * Syntax: op vAA, ref@BBBB |
| */ |
| |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl offGlue_method(%edx), %ecx # %ecx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| FETCH 1, %eax # %eax<- BBBB |
| movl %eax, -4(%esp) # push parameter BBBB; ref |
| movl rINST, -8(%esp) # push parameter AA |
| movl %ecx, -12(%esp) # push parameter glue->method |
| lea -12(%esp), %esp |
| call dvmThrowVerificationError # call: (const Method* method, int kind, int ref) |
| jmp common_exceptionThrown # failed; handle exception |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_EXECUTE_INLINE: /* 0xee */ |
| /* File: x86-atom/OP_EXECUTE_INLINE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_EXECUTE_INLINE.S |
| * |
| * Code: Executes a "native inline" instruction. Uses no substitutions. |
| * |
| * For: execute-inline |
| * |
| * Description: Executes a "native inline" instruction. This instruction |
| * is generated by the optimizer. |
| * |
| * Format: |
| * |
| * Syntax: A, {vC, vD, vE, vF}, inline@BBBB |
| */ |
| |
| FETCH 1, %ecx # %ecx<- BBBB |
| movl rGLUE, %eax # %eax<- MterpGlue pointer |
| addl $offGlue_retval, %eax # %eax<- &glue->retval |
| EXPORT_PC |
| shr $4, rINST # rINST<- A |
| movl %eax, -8(%esp) # push parameter glue->retval |
| lea -24(%esp), %esp |
| jmp .LOP_EXECUTE_INLINE_continue |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_EXECUTE_INLINE_RANGE: /* 0xef */ |
| /* File: x86-atom/OP_EXECUTE_INLINE_RANGE.S */ |
| /* Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_EXECUTE_INLINE_RANGE.S |
| * |
| * Code: Executes a "native inline" instruction. Uses no substitutions. |
| * |
| * For: execute-inline |
| * |
| * Description: Executes a "native inline" instruction. This instruction |
| * is generated by the optimizer. |
| * |
| * Format: |
| * |
| * Syntax: AA, {vCCCC..v(CCCC+AA-1)}, inline@BBBB |
| */ |
| |
| FETCH 1, %ecx # %ecx<- BBBB |
| movl rGLUE, %eax # %eax<- MterpGlue pointer |
| addl $offGlue_retval, %eax # %eax<- &glue->retval |
| EXPORT_PC |
| movl %eax, -8(%esp) # push parameter glue->retval |
| lea -24(%esp), %esp |
| jmp .LOP_EXECUTE_INLINE_RANGE_continue |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_DIRECT_EMPTY: /* 0xf0 */ |
| /* File: x86-atom/OP_INVOKE_DIRECT_EMPTY.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_DIRECT_EMPTY.S |
| * |
| * Code: Used as a no-op. Uses no substitutions. |
| * |
| * For: invoke-direct-empty |
| * |
| * Format: B|A|op CCCC G|F|E|D (35c) |
| */ |
| |
| FINISH 3 |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_RETURN_VOID_BARRIER: /* 0xf1 */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_RETURN_VOID_BARRIER # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_QUICK: /* 0xf2 */ |
| /* File: x86-atom/OP_IGET_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_QUICK.S |
| * |
| * Code: Optimization for iget |
| * |
| * For: iget-quick |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, offset@CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %eax # %eax<- vB; object to operate on |
| FETCH 1, %ecx # %ecx<- CCCC; field byte offset |
| cmp $0, %eax # check if object is null |
| je common_errNullObject # handle null object |
| FFETCH_ADV 2, %edx # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %eax), %eax # %eax<- object field |
| SET_VREG %eax, rINST # fp[A]<- %eax |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_WIDE_QUICK: /* 0xf3 */ |
| /* File: x86-atom/OP_IGET_WIDE_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_WIDE_QUICK.S |
| * |
| * Code: Optimization for iget |
| * |
| * For: iget/wide-quick |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, offset@CCCC |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| GET_VREG %edx # %edx<- vB; object to operate on |
| cmp $0, %edx # check if object is null |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| je common_errNullObject # handle null object |
| FETCH 1, %ecx # %ecx<- CCCC; field byte offset |
| movq (%ecx, %edx), %xmm0 # %xmm0<- object field |
| movq %xmm0, (rFP, rINST, 4) # fp[A]<- %xmm0 |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IGET_OBJECT_QUICK: /* 0xf4 */ |
| /* File: x86-atom/OP_IGET_OBJECT_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_OBJECT_QUICK.S |
| */ |
| |
| /* File: x86-atom/OP_IGET_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IGET_QUICK.S |
| * |
| * Code: Optimization for iget |
| * |
| * For: iget-quick |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, offset@CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %eax # %eax<- vB; object to operate on |
| FETCH 1, %ecx # %ecx<- CCCC; field byte offset |
| cmp $0, %eax # check if object is null |
| je common_errNullObject # handle null object |
| FFETCH_ADV 2, %edx # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %eax), %eax # %eax<- object field |
| SET_VREG %eax, rINST # fp[A]<- %eax |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_QUICK: /* 0xf5 */ |
| /* File: x86-atom/OP_IPUT_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_QUICK.S |
| * Code: Optimization for iput |
| * |
| * For: iput-quick |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, offset@CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %eax # %eax<- vB; object to operate on |
| FETCH 1, %ecx # %ecx<- CCCC; field byte offset |
| cmp $0, %eax # check if object is null |
| je common_errNullObject # handle null object |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%eax, %ecx) # object field<- vA |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_WIDE_QUICK: /* 0xf6 */ |
| /* File: x86-atom/OP_IPUT_WIDE_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_WIDE_QUICK.S |
| * |
| * Code: Optimization for iput |
| * |
| * For: iput/wide-quick |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, offset@CCCC |
| */ |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| GET_VREG %edx # %edx<- vB; object to operate on |
| cmp $0, %edx # check if object is null |
| FETCH 1, %ecx # %ecx<- CCCC; field byte offset |
| je common_errNullObject # handle null object |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- fp[A] |
| movq %xmm0, (%edx, %ecx) # object field<- %xmm0; fp[A] |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_OBJECT_QUICK: /* 0xf7 */ |
| /* File: x86-atom/OP_IPUT_OBJECT_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_OBJECT_QUICK.S |
| */ |
| |
| /* File: x86-atom/OP_IPUT_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_IPUT_QUICK.S |
| * Code: Optimization for iput |
| * |
| * For: iput-quick |
| * |
| * Format: B|A|op CCCC (22c) |
| * |
| * Syntax: op vA, vB, offset@CCCC |
| */ |
| |
| movl rINST, %eax # %eax<- BA |
| shr $4, %eax # %eax<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %eax # %eax<- vB; object to operate on |
| FETCH 1, %ecx # %ecx<- CCCC; field byte offset |
| cmp $0, %eax # check if object is null |
| je common_errNullObject # handle null object |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%eax, %ecx) # object field<- vA |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_VIRTUAL_QUICK: /* 0xf8 */ |
| /* File: x86-atom/OP_INVOKE_VIRTUAL_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_VIRTUAL_QUICK.S |
| * |
| * Code: Optimization for invoke-virtual and invoke-virtual/range |
| * |
| * For: invoke-virtual/quick, invoke-virtual/quick-range |
| */ |
| |
| |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| .if (!0) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| FETCH 1, %ecx # %ecx<- method index |
| GET_VREG %edx # %edx<- "this" ptr |
| cmp $0, %edx # %edx<- check for null "this" |
| EXPORT_PC # must export pc for invoke |
| je common_errNullObject |
| movl offObject_clazz(%edx), %edx # %edx<- thisPtr->clazz |
| movl offClassObject_vtable(%edx), %edx # %edx<- thisPtr->clazz->vtable |
| movl (%edx, %ecx, 4), %ecx # %ecx<- vtable[methodIndex] |
| jmp common_invokeMethodNoRange # invoke method common code |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_VIRTUAL_QUICK_RANGE: /* 0xf9 */ |
| /* File: x86-atom/OP_INVOKE_VIRTUAL_QUICK_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_VIRTUAL_QUICK_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_VIRTUAL_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_VIRTUAL_QUICK.S |
| * |
| * Code: Optimization for invoke-virtual and invoke-virtual/range |
| * |
| * For: invoke-virtual/quick, invoke-virtual/quick-range |
| */ |
| |
| |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| .if (!1) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| FETCH 1, %ecx # %ecx<- method index |
| GET_VREG %edx # %edx<- "this" ptr |
| cmp $0, %edx # %edx<- check for null "this" |
| EXPORT_PC # must export pc for invoke |
| je common_errNullObject |
| movl offObject_clazz(%edx), %edx # %edx<- thisPtr->clazz |
| movl offClassObject_vtable(%edx), %edx # %edx<- thisPtr->clazz->vtable |
| movl (%edx, %ecx, 4), %ecx # %ecx<- vtable[methodIndex] |
| jmp common_invokeMethodRange # invoke method common code |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_SUPER_QUICK: /* 0xfa */ |
| /* File: x86-atom/OP_INVOKE_SUPER_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_SUPER_QUICK.S |
| * |
| * Code: Optimization for invoke-super and invoke-super/range |
| * |
| * For: invoke-super/quick, invoke-super/quick-range |
| */ |
| |
| |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_method(%ecx), %eax # %eax<- glue->method |
| .if (!0) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| FETCH 1, %ecx # %ecx<- method index |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| movl offClassObject_super(%eax), %eax # %eax<- glue->method->clazz->super |
| EXPORT_PC # must export for invoke |
| movl offClassObject_vtable(%eax), %eax # %edx<- glue->method->clazz->super->vtable |
| cmp $0, (rFP, %edx, 4) # check for null object |
| movl (%eax, %ecx, 4), %ecx # %ecx<- vtable[methodIndex] |
| je common_errNullObject # handle null object |
| jmp common_invokeMethodNoRange # invoke method common code |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_INVOKE_SUPER_QUICK_RANGE: /* 0xfb */ |
| /* File: x86-atom/OP_INVOKE_SUPER_QUICK_RANGE.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_SUPER_QUICK_RANGE.S |
| */ |
| |
| /* File: x86-atom/OP_INVOKE_SUPER_QUICK.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_INVOKE_SUPER_QUICK.S |
| * |
| * Code: Optimization for invoke-super and invoke-super/range |
| * |
| * For: invoke-super/quick, invoke-super/quick-range |
| */ |
| |
| |
| FETCH 2, %edx # %edx<- GFED or CCCC |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_method(%ecx), %eax # %eax<- glue->method |
| .if (!1) |
| and $15, %edx # %edx<- D if not range |
| .endif |
| FETCH 1, %ecx # %ecx<- method index |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| movl offClassObject_super(%eax), %eax # %eax<- glue->method->clazz->super |
| EXPORT_PC # must export for invoke |
| movl offClassObject_vtable(%eax), %eax # %edx<- glue->method->clazz->super->vtable |
| cmp $0, (rFP, %edx, 4) # check for null object |
| movl (%eax, %ecx, 4), %ecx # %ecx<- vtable[methodIndex] |
| je common_errNullObject # handle null object |
| jmp common_invokeMethodRange # invoke method common code |
| |
| |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_IPUT_OBJECT_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_SGET_OBJECT_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: stub.S |
| */ |
| |
| SAVE_PC_FP_TO_GLUE %edx # save program counter and frame pointer |
| pushl rGLUE # push parameter glue |
| call dvmMterp_OP_SPUT_OBJECT_VOLATILE # call c-based implementation |
| lea 4(%esp), %esp |
| LOAD_PC_FP_FROM_GLUE # restore program counter and frame pointer |
| FINISH_A # jump to next instruction |
| /* ------------------------------ */ |
| .balign 64 |
| .L_OP_DISPATCH_FF: /* 0xff */ |
| /* File: x86-atom/OP_DISPATCH_FF.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: OP_DISPATCH_FF.S |
| */ |
| |
| /* File: x86-atom/unused.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: unused.S |
| * |
| * Code: Common code for unused bytecodes. Uses no subtitutions. |
| * |
| * For: all unused bytecodes |
| * |
| * Description: aborts if executed. |
| * |
| * Format: ØØ|op (10x) |
| * |
| * Syntax: op |
| */ |
| |
| call common_abort |
| |
| |
| |
| .balign 64 |
| .size dvmAsmInstructionStart, .-dvmAsmInstructionStart |
| .global dvmAsmInstructionEnd |
| dvmAsmInstructionEnd: |
| |
| /* |
| * =========================================================================== |
| * Sister implementations |
| * =========================================================================== |
| */ |
| .global dvmAsmSisterStart |
| .type dvmAsmSisterStart, %function |
| .text |
| .balign 4 |
| dvmAsmSisterStart: |
| |
| /* continuation for OP_CONST_STRING */ |
| |
| |
| /* |
| * Continuation if the Class has not yet been resolved. |
| * %ecx: BBBB (Class ref) |
| * need: target register |
| */ |
| |
| .LOP_CONST_STRING_resolve: |
| EXPORT_PC |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %ecx, -4(%esp) # push parameter class ref |
| movl %edx, -8(%esp) # push parameter glue->method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveString # resolve string reference |
| # call: (const ClassObject* referrer, u4 stringIdx) |
| # return: StringObject* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved string failed |
| je common_exceptionThrown # resolve failed; exception thrown |
| SET_VREG %eax, rINST # vAA<- %eax; pResString[BBBB] |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_CONST_STRING_JUMBO */ |
| |
| |
| /* |
| * Continuation if the Class has not yet been resolved. |
| * %ecx: BBBB (Class ref) |
| * need: target register |
| */ |
| .LOP_CONST_STRING_JUMBO_resolve: |
| EXPORT_PC |
| movl rGLUE, %edx # get MterpGlue pointer |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl offMethod_clazz(%edx), %edx # %edx <- glue->method->clazz |
| movl %ecx, -4(%esp) # push parameter class ref |
| movl %edx, -8(%esp) # push parameter glue->method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveString # resolve string reference |
| # call: (const ClassObject* referrer, u4 stringIdx) |
| # return: StringObject* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved string failed |
| je common_exceptionThrown # resolve failed; exception thrown |
| SET_VREG %eax, rINST # vAA<- %eax; pResString[BBBB] |
| FINISH 3 # jump to next instruction |
| /* continuation for OP_CONST_CLASS */ |
| |
| /* |
| * Continuation if the Class has not yet been resolved. |
| * %ecx: BBBB (Class ref) |
| * need: target register |
| */ |
| |
| .LOP_CONST_CLASS_resolve: |
| EXPORT_PC |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl $1, -4(%esp) # push parameter true |
| movl %ecx, -8(%esp) # push parameter |
| movl %edx, -12(%esp) # push parameter glue->method->clazz |
| lea -12(%esp), %esp |
| call dvmResolveClass # resolve ClassObject pointer |
| # class: (const ClassObject* referrer, u4 classIdx, |
| # bool fromUnverifiedConstant) |
| # return: ClassObject* |
| lea 12(%esp), %esp |
| cmp $0, %eax # check for null pointer |
| je common_exceptionThrown # handle exception |
| SET_VREG %eax, rINST # vAA<- resolved class |
| FINISH 2 # jump to next instruction |
| /* continuation for OP_CHECK_CAST */ |
| |
| .LOP_CHECK_CAST_resolved: |
| cmp %ecx, offObject_clazz(rINST) # check for same class |
| jne .LOP_CHECK_CAST_fullcheck # not same class; do full check |
| |
| .LOP_CHECK_CAST_okay: |
| FINISH 2 # jump to next instruction |
| |
| /* |
| * Trivial test failed, need to perform full check. |
| * offObject_clazz(rINST) holds obj->clazz |
| * %ecx holds class resolved from BBBB |
| * rINST holds object |
| */ |
| |
| .LOP_CHECK_CAST_fullcheck: |
| movl offObject_clazz(rINST), %eax # %eax<- obj->clazz |
| movl %eax, -12(%esp) # push parameter obj->clazz |
| movl %ecx, -8(%esp) # push parameter # push parameter resolved class |
| lea -12(%esp), %esp |
| call dvmInstanceofNonTrivial # call: (ClassObject* instance, ClassObject* clazz) |
| # return: int |
| lea 12(%esp), %esp |
| cmp $0, %eax # failed? |
| jne .LOP_CHECK_CAST_okay # success |
| |
| /* |
| * A cast has failed. We need to throw a ClassCastException with the |
| * class of the object that failed to be cast. |
| */ |
| |
| EXPORT_PC # we will throw an exception |
| movl $.LstrClassCastExceptionPtr, -8(%esp) # push parameter message |
| movl offObject_clazz(rINST), rINST # rINST<- obj->clazz |
| movl offClassObject_descriptor(rINST), rINST # rINST<- obj->clazz->descriptor |
| movl rINST, -4(%esp) # push parameter obj->clazz->descriptor |
| lea -8(%esp), %esp |
| call dvmThrowExceptionWithClassMessage # call: (const char* exceptionDescriptor, |
| # const char* messageDescriptor, Object* cause) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown |
| |
| /* |
| * Resolution required. This is the least-likely path. |
| * |
| * rINST holds object |
| */ |
| |
| .LOP_CHECK_CAST_resolve: |
| movl offGlue_method(%edx), %eax # %eax<- glue->method |
| FETCH 1, %ecx # %ecx holds BBBB |
| EXPORT_PC # in case we throw an exception |
| movl $0, -8(%esp) # push parameter false |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| movl %ecx, -12(%esp) # push parameter BBBB |
| movl %eax, -16(%esp) # push parameter glue->method>clazz |
| lea -16(%esp), %esp |
| call dvmResolveClass # resolve ClassObject pointer |
| # call: (const ClassObject* referrer, u4 classIdx, |
| # bool fromUnverifiedConstant) |
| # return ClassObject* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null pointer |
| je common_exceptionThrown # handle excpetion |
| movl %eax, %ecx # %ecx<- resolved class |
| jmp .LOP_CHECK_CAST_resolved |
| |
| .LstrClassCastExceptionPtr: |
| .asciz "Ljava/lang/ClassCastException;" |
| |
| /* continuation for OP_INSTANCE_OF */ |
| |
| .LOP_INSTANCE_OF_break: |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_methodClassDex(%ecx), %ecx # %ecx<- pDvmDex |
| FETCH 1, %eax # %eax<- CCCC |
| movl offDvmDex_pResClasses(%ecx), %ecx # %ecx<- pDvmDex->pResClasses |
| movl (%ecx, %eax, 4), %ecx # %ecx<- resolved class |
| movl offObject_clazz(%edx), %edx # %edx<- obj->clazz |
| cmp $0, %ecx # check if already resovled |
| je .LOP_INSTANCE_OF_resolve # not resolved before, so resolve now |
| |
| .LOP_INSTANCE_OF_resolved: |
| cmp %ecx, %edx # check if same class |
| je .LOP_INSTANCE_OF_trivial # yes, finish |
| jmp .LOP_INSTANCE_OF_fullcheck # no, do full check |
| |
| /* |
| * The trivial test failed, we need to perform a full check. |
| * %edx holds obj->clazz |
| * %ecx holds class resolved from BBBB |
| */ |
| |
| .LOP_INSTANCE_OF_fullcheck: |
| movl %edx, -8(%esp) # push parameter obj->clazz |
| movl %ecx, -4(%esp) # push parameter resolved class |
| lea -8(%esp), %esp |
| call dvmInstanceofNonTrivial # perform full check |
| # call: (ClassObject* instance, ClassObject* clazz) |
| # return: int |
| andl $15, rINST # rINST<- A |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| lea 8(%esp), %esp |
| SET_VREG %eax, rINST # vA<- r0 |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* |
| * %edx holds boolean result |
| */ |
| |
| .LOP_INSTANCE_OF_store: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| andl $15, rINST # rINST<- A |
| SET_VREG %edx, rINST # vA<- r0 |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* |
| * Trivial test succeeded, save and bail. |
| */ |
| |
| .LOP_INSTANCE_OF_trivial: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| andl $15, rINST # rINST<- A |
| SET_VREG $1, rINST # vA<- r0 |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* |
| * Resolution required. This is the least-likely path. |
| * %eax holds BBBB |
| */ |
| |
| .LOP_INSTANCE_OF_resolve: |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| EXPORT_PC |
| movl offGlue_method(%ecx), %ecx # %ecx<- glue->method |
| movl offMethod_clazz(%ecx), %ecx # %ecx<- glue->method->clazz |
| movl %ecx, -12(%esp) # push parameter glue->method->clazz |
| movl %eax, -8(%esp) # push parameter CCCC; type index |
| movl $1, -4(%esp) # push parameter true |
| lea -12(%esp), %esp |
| call dvmResolveClass # call: (const ClassObject* referrer, u4 classIdx, |
| # bool fromUnverifiedConstant) |
| # return: ClassObject* |
| lea 12(%esp), %esp |
| cmp $0, %eax # check for null |
| je common_exceptionThrown # handle exception |
| movl rINST, %edx # %edx<- BA+ |
| shr $4, %edx # %edx<- B |
| movl %eax, %ecx # need class in %ecx |
| GET_VREG %edx # %edx<- vB |
| movl offObject_clazz(%edx), %edx # %edx<- obj->clazz |
| jmp .LOP_INSTANCE_OF_resolved # clazz resolved, continue |
| |
| /* continuation for OP_NEW_INSTANCE */ |
| .balign 32 |
| .LOP_NEW_INSTANCE_finish: |
| movl %edx, -8(%esp) # push parameter object |
| movl %eax, -4(%esp) # push parameter flags |
| lea -8(%esp), %esp |
| call dvmAllocObject # call: (ClassObject* clazz, int flags) |
| # return: Object* |
| cmp $0, %eax # check for failure |
| lea 8(%esp), %esp |
| je common_exceptionThrown # handle exception |
| SET_VREG %eax, rINST # vAA<- pObject |
| FINISH 2 # jump to next instruction |
| |
| /* |
| * Class initialization required. |
| * |
| * %edx holds class object |
| */ |
| |
| .LOP_NEW_INSTANCE_needinit: |
| movl %edx, -4(%esp) # push parameter object |
| lea -4(%esp), %esp |
| call dvmInitClass # call: (ClassObject* clazz) |
| # return: bool |
| lea 4(%esp), %esp |
| cmp $0, %eax # check for failure |
| movl -4(%esp), %edx # %edx<- object |
| je common_exceptionThrown # handle exception |
| testl $(ACC_INTERFACE|ACC_ABSTRACT), offClassObject_accessFlags(%edx) |
| mov $ALLOC_DONT_TRACK, %eax # %eax<- flag for alloc call |
| je .LOP_NEW_INSTANCE_finish # continue |
| jmp .LOP_NEW_INSTANCE_abstract # handle abstract or interface |
| |
| /* |
| * Resolution required. This is the least-likely path. |
| * |
| * BBBB in %eax |
| */ |
| |
| .LOP_NEW_INSTANCE_resolve: |
| |
| |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| FETCH 1, %eax # %eax<- BBBB |
| movl offGlue_method(%ecx), %ecx # %ecx<- glue->method |
| movl offMethod_clazz(%ecx), %ecx # %ecx<- glue->method->clazz |
| movl %ecx, -12(%esp) # push parameter clazz |
| movl $0, -4(%esp) # push parameter false |
| movl %eax, -8(%esp) # push parameter BBBB |
| lea -12(%esp), %esp |
| call dvmResolveClass # call: (const ClassObject* referrer, |
| # u4 classIdx, bool fromUnverifiedConstant) |
| # return: ClassObject* |
| lea 12(%esp), %esp |
| movl %eax, %edx # %edx<- pObject |
| cmp $0, %edx # check for failure |
| jne .LOP_NEW_INSTANCE_resolved # continue |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * We can't instantiate an abstract class or interface, so throw an |
| * InstantiationError with the class descriptor as the message. |
| * |
| * %edx holds class object |
| */ |
| |
| .LOP_NEW_INSTANCE_abstract: |
| movl offClassObject_descriptor(%edx), %ecx # %ecx<- descriptor |
| movl %ecx, -4(%esp) # push parameter descriptor |
| movl $.LstrInstantiationErrorPtr, -8(%esp) # push parameter message |
| lea -8(%esp), %esp |
| call dvmThrowExceptionWithClassMessage # call: (const char* exceptionDescriptor, |
| # const char* messageDescriptor) |
| # return: void |
| jmp common_exceptionThrown # handle exception |
| |
| .LstrInstantiationErrorPtr: |
| .asciz "Ljava/lang/InstantiationError;" |
| |
| /* continuation for OP_NEW_ARRAY */ |
| |
| /* |
| * Resolve class. (This is an uncommon case.) |
| * |
| * %edx holds array length |
| * %ecx holds class ref CCCC |
| */ |
| |
| .LOP_NEW_ARRAY_resolve: |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_method(%eax), %eax # %eax<- glue->method |
| movl %edx, -4(%esp) # save length |
| movl $0, -8(%esp) # push parameter false |
| movl %ecx, -12(%esp) # push parameter class ref |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| movl %eax, -16(%esp) # push parameter clazz |
| lea -16(%esp), %esp |
| call dvmResolveClass # call: (const ClassObject* referrer, |
| # u4 classIdx, bool fromUnverifiedConstant) |
| # return: ClassObject* |
| cmp $0, %eax # check for failure |
| lea 16(%esp), %esp |
| je common_exceptionThrown # handle exception |
| movl -4(%esp), %edx # %edx<- length |
| |
| /* |
| * Finish allocation. |
| * |
| * %eax holds class |
| * %edx holds array length |
| */ |
| |
| .LOP_NEW_ARRAY_finish: |
| movl %eax, -12(%esp) # push parameter class |
| movl %edx, -8(%esp) # push parameter length |
| movl $ALLOC_DONT_TRACK, -4(%esp) |
| lea -12(%esp), %esp |
| call dvmAllocArrayByClass # call: (ClassObject* arrayClass, |
| # size_t length, int allocFlags) |
| # return: ArrayObject* |
| and $15, rINST # rINST<- A |
| cmp $0, %eax # check for allocation failure |
| lea 12(%esp), %esp |
| je common_exceptionThrown # handle exception |
| SET_VREG %eax, rINST # vA<- pArray |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_FILLED_NEW_ARRAY */ |
| |
| .LOP_FILLED_NEW_ARRAY_break: |
| movl $0, -8(%esp) # push parameter false |
| movl %ecx, -12(%esp) # push parameter BBBB |
| movl rGLUE, %edx # %edx<- MterpGlue pointer |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, -16(%esp) # push parameter glue->method->clazz |
| lea -16(%esp), %esp |
| call dvmResolveClass # call: (const ClassObject* referrer, u4 classIdx, |
| # bool fromUnverifiedConstant) |
| # return: ClassObject* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null return |
| je common_exceptionThrown # handle exception |
| |
| /* |
| * On entry: |
| * %eax holds array class |
| * rINST holds BA or AA |
| */ |
| |
| .LOP_FILLED_NEW_ARRAY_continue: |
| movl offClassObject_descriptor(%eax), %eax # %eax<- arrayClass->descriptor |
| movzbl 1(%eax), %eax # %eax<- descriptor[1] |
| cmp $'I', %eax # check if array of ints |
| jne .LOP_FILLED_NEW_ARRAY_notimpl # jump to not implemented |
| movl rINST, -12(%esp) # push parameter length |
| movl %eax, -16(%esp) # push parameter descriptor[1] |
| movl $ALLOC_DONT_TRACK, -8(%esp) # push parameter to allocate flags |
| .if (!0) |
| shrl $4, -12(%esp) # parameter length is B |
| .endif |
| lea -16(%esp), %esp |
| call dvmAllocPrimitiveArray # call: (char type, size_t length, int allocFlags) |
| # return: ArrayObject* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null return |
| je common_exceptionThrown # handle exception |
| |
| FETCH 2, %edx # %edx<- FEDC or CCCC |
| movl rGLUE, %ecx # %ecx<- MterpGlue pointer |
| movl %eax, offGlue_retval(%ecx) # retval<- new array |
| lea offArrayObject_contents(%eax), %eax # %eax<- newArray->contents |
| subl $1, -12(%esp) # length--; check for negative |
| js 2f # if length was zero, finish |
| |
| /* |
| * copy values from registers into the array |
| * %eax=array, %edx=CCCC/FEDC, -12(%esp)=length (from AA or B), rINST=AA/BA |
| */ |
| |
| .if 0 |
| lea (rFP, %edx, 4), %ecx # %ecx<- &fpp[CCCC] |
| 1: |
| movl (%ecx), %edx # %edx<- %ecx++ |
| lea 4(%ecx), %ecx # %ecx++ |
| movl %edx, (%eax) # *contents<- vX |
| lea 4(%eax), %eax # %eax++; contents++ |
| subl $1, -12(%esp) # length-- |
| jns 1b # or continue at 2 |
| .else |
| cmp $4, -12(%esp) # check length |
| jne 1f # has four args |
| and $15, rINST # rINST<- A |
| GET_VREG rINST # rINST<- vA |
| subl $1, -12(%esp) # count-- |
| movl rINST, 16(%eax) # contents[4]<- vA |
| 1: |
| movl %edx, %ecx # %ecx<- %edx; ecx for temp |
| andl $15, %ecx # %ecx<- G/F/E/D |
| GET_VREG %ecx # %ecx<- vG/vF/vE/vD |
| shr $4, %edx # %edx<- put next reg in low 4 |
| subl $1, -12(%esp) # count-- |
| movl %ecx, (%eax) # *contents<- vX |
| lea 4(%eax), %eax # %eax++; contents++ |
| jns 1b # or continue at 2 |
| .endif |
| 2: |
| FINISH 3 # jump to next instruction |
| |
| /* |
| * Throw an exception to indicate this mode of filled-new-array |
| * has not been implemented. |
| */ |
| |
| .LOP_FILLED_NEW_ARRAY_notimpl: |
| movl $.LstrInternalError, -8(%esp) |
| movl $.LstrFilledNewArrayNotImpl, -4(%esp) |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, |
| # const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown |
| |
| .if (!0) # define in one or the other, not both |
| .LstrFilledNewArrayNotImpl: |
| .asciz "filled-new-array only implemented for 'int'" |
| .LstrInternalError: |
| .asciz "Ljava/lang/InternalError;" |
| .endif |
| |
| /* continuation for OP_FILLED_NEW_ARRAY_RANGE */ |
| |
| .LOP_FILLED_NEW_ARRAY_RANGE_break: |
| movl $0, -8(%esp) # push parameter false |
| movl %ecx, -12(%esp) # push parameter BBBB |
| movl rGLUE, %edx # %edx<- MterpGlue pointer |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, -16(%esp) # push parameter glue->method->clazz |
| lea -16(%esp), %esp |
| call dvmResolveClass # call: (const ClassObject* referrer, u4 classIdx, |
| # bool fromUnverifiedConstant) |
| # return: ClassObject* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null return |
| je common_exceptionThrown # handle exception |
| |
| /* |
| * On entry: |
| * %eax holds array class |
| * rINST holds BA or AA |
| */ |
| |
| .LOP_FILLED_NEW_ARRAY_RANGE_continue: |
| movl offClassObject_descriptor(%eax), %eax # %eax<- arrayClass->descriptor |
| movzbl 1(%eax), %eax # %eax<- descriptor[1] |
| cmp $'I', %eax # check if array of ints |
| jne .LOP_FILLED_NEW_ARRAY_RANGE_notimpl # jump to not implemented |
| movl rINST, -12(%esp) # push parameter length |
| movl %eax, -16(%esp) # push parameter descriptor[1] |
| movl $ALLOC_DONT_TRACK, -8(%esp) # push parameter to allocate flags |
| .if (!1) |
| shrl $4, -12(%esp) # parameter length is B |
| .endif |
| lea -16(%esp), %esp |
| call dvmAllocPrimitiveArray # call: (char type, size_t length, int allocFlags) |
| # return: ArrayObject* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null return |
| je common_exceptionThrown # handle exception |
| |
| FETCH 2, %edx # %edx<- FEDC or CCCC |
| movl rGLUE, %ecx # %ecx<- MterpGlue pointer |
| movl %eax, offGlue_retval(%ecx) # retval<- new array |
| lea offArrayObject_contents(%eax), %eax # %eax<- newArray->contents |
| subl $1, -12(%esp) # length--; check for negative |
| js 2f # if length was zero, finish |
| |
| /* |
| * copy values from registers into the array |
| * %eax=array, %edx=CCCC/FEDC, -12(%esp)=length (from AA or B), rINST=AA/BA |
| */ |
| |
| .if 1 |
| lea (rFP, %edx, 4), %ecx # %ecx<- &fpp[CCCC] |
| 1: |
| movl (%ecx), %edx # %edx<- %ecx++ |
| lea 4(%ecx), %ecx # %ecx++ |
| movl %edx, (%eax) # *contents<- vX |
| lea 4(%eax), %eax # %eax++; contents++ |
| subl $1, -12(%esp) # length-- |
| jns 1b # or continue at 2 |
| .else |
| cmp $4, -12(%esp) # check length |
| jne 1f # has four args |
| and $15, rINST # rINST<- A |
| GET_VREG rINST # rINST<- vA |
| subl $1, -12(%esp) # count-- |
| movl rINST, 16(%eax) # contents[4]<- vA |
| 1: |
| movl %edx, %ecx # %ecx<- %edx; ecx for temp |
| andl $15, %ecx # %ecx<- G/F/E/D |
| GET_VREG %ecx # %ecx<- vG/vF/vE/vD |
| shr $4, %edx # %edx<- put next reg in low 4 |
| subl $1, -12(%esp) # count-- |
| movl %ecx, (%eax) # *contents<- vX |
| lea 4(%eax), %eax # %eax++; contents++ |
| jns 1b # or continue at 2 |
| .endif |
| 2: |
| FINISH 3 # jump to next instruction |
| |
| /* |
| * Throw an exception to indicate this mode of filled-new-array |
| * has not been implemented. |
| */ |
| |
| .LOP_FILLED_NEW_ARRAY_RANGE_notimpl: |
| movl $.LstrInternalError, -8(%esp) |
| movl $.LstrFilledNewArrayNotImpl, -4(%esp) |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, |
| # const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown |
| |
| .if (!1) # define in one or the other, not both |
| .LstrFilledNewArrayNotImpl: |
| .asciz "filled-new-array only implemented for 'int'" |
| .LstrInternalError: |
| .asciz "Ljava/lang/InternalError;" |
| .endif |
| |
| /* continuation for OP_PACKED_SWITCH */ |
| .LOP_PACKED_SWITCH_finish: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* continuation for OP_SPARSE_SWITCH */ |
| .LOP_SPARSE_SWITCH_finish: |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| /* continuation for OP_CMPL_FLOAT */ |
| .LOP_CMPL_FLOAT_greater: |
| movl $0x1, (rFP, rINST, 4) # vAA<- greater than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPL_FLOAT_final: |
| movl $0x0, (rFP, rINST, 4) # vAA<- equal |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPL_FLOAT_finalNan: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- NaN |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_CMPG_FLOAT */ |
| .LOP_CMPG_FLOAT_greater: |
| movl $0x1, (rFP, rINST, 4) # vAA<- greater than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPG_FLOAT_final: |
| movl $0x0, (rFP, rINST, 4) # vAA<- equal |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPG_FLOAT_finalNan: |
| movl $0x1, (rFP, rINST, 4) # vAA<- NaN |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_CMPL_DOUBLE */ |
| .LOP_CMPL_DOUBLE_greater: |
| movl $0x1, (rFP, rINST, 4) # vAA<- greater than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPL_DOUBLE_final: |
| movl $0x0, (rFP, rINST, 4) # vAA<- equal |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPL_DOUBLE_finalNan: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- NaN |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_CMPG_DOUBLE */ |
| .LOP_CMPG_DOUBLE_greater: |
| movl $0x1, (rFP, rINST, 4) # vAA<- greater than |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPG_DOUBLE_final: |
| movl $0x0, (rFP, rINST, 4) # vAA<- equal |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| .LOP_CMPG_DOUBLE_finalNan: |
| movl $0x1, (rFP, rINST, 4) # vAA<- NaN |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_CMP_LONG */ |
| |
| .LOP_CMP_LONG_final: |
| movl $0x0, (rFP, rINST, 4) # vAA<- equal |
| FINISH 2 # jump to next instruction |
| |
| .LOP_CMP_LONG_less: |
| movl $0xFFFFFFFF, (rFP, rINST, 4) # vAA<- less than |
| FINISH 2 # jump to next instruction |
| |
| .LOP_CMP_LONG_greater: |
| movl $0x1, (rFP, rINST, 4) # vAA<- greater than |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_APUT_OBJECT */ |
| |
| .LOP_APUT_OBJECT_finish: |
| movl %edx, sReg0 # save &vBB[vCC] |
| movl offObject_clazz(rINST), %edx # %edx<- obj->clazz |
| movl %edx, -8(%esp) # push parameter obj->clazz |
| movl offObject_clazz(%eax), %eax # %eax<- arrayObj->clazz |
| movl %eax, -4(%esp) # push parameter arrayObj->clazz |
| lea -8(%esp), %esp |
| call dvmCanPutArrayElement # test object type vs. array type |
| # call: ClassObject* elemClass, ClassObject* arrayClass) |
| # return: bool |
| lea 8(%esp), %esp |
| cmp $0, %eax # check for invalid array value |
| je common_errArrayStore # handle invalid array value |
| movl sReg0, %edx # restore &vBB[vCC] |
| |
| .LOP_APUT_OBJECT_skip_check: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl rINST, offArrayObject_contents(%edx) |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET */ |
| |
| .LOP_IGET_finish: |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| je common_exceptionThrown # not resolved; handle exception |
| |
| /* |
| * %eax holds resolved field |
| */ |
| |
| .LOP_IGET_finish2: |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %edx), %edx # %edx<- object field |
| SET_VREG %edx, rINST # vA<- %edx; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET_WIDE */ |
| |
| .LOP_IGET_WIDE_finish2: |
| lea -8(%esp), %esp |
| call dvmResolveInstField # resolve InstField ptr |
| # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| movl %eax, %ecx # %ecx<- %eax; %ecx expected to hold field |
| je common_exceptionThrown |
| |
| /* |
| * %ecx holds resolved field |
| */ |
| |
| .LOP_IGET_WIDE_finish: |
| |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| GET_VREG %edx # %edx<- vB |
| cmp $0, %edx # check for null object |
| je common_errNullObject |
| movl offInstField_byteOffset(%ecx), %ecx # %ecx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (%ecx, %edx), %xmm0 # %xmm0<- object field |
| movq %xmm0, (rFP, rINST, 4) # vA<- %xmm0; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET_OBJECT */ |
| |
| .LOP_IGET_OBJECT_finish: |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| je common_exceptionThrown # not resolved; handle exception |
| |
| /* |
| * %eax holds resolved field |
| */ |
| |
| .LOP_IGET_OBJECT_finish2: |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %edx), %edx # %edx<- object field |
| SET_VREG %edx, rINST # vA<- %edx; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET_BOOLEAN */ |
| |
| .LOP_IGET_BOOLEAN_finish: |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| je common_exceptionThrown # not resolved; handle exception |
| |
| /* |
| * %eax holds resolved field |
| */ |
| |
| .LOP_IGET_BOOLEAN_finish2: |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %edx), %edx # %edx<- object field |
| SET_VREG %edx, rINST # vA<- %edx; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET_BYTE */ |
| |
| .LOP_IGET_BYTE_finish: |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| je common_exceptionThrown # not resolved; handle exception |
| |
| /* |
| * %eax holds resolved field |
| */ |
| |
| .LOP_IGET_BYTE_finish2: |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %edx), %edx # %edx<- object field |
| SET_VREG %edx, rINST # vA<- %edx; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET_CHAR */ |
| |
| .LOP_IGET_CHAR_finish: |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| je common_exceptionThrown # not resolved; handle exception |
| |
| /* |
| * %eax holds resolved field |
| */ |
| |
| .LOP_IGET_CHAR_finish2: |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %edx), %edx # %edx<- object field |
| SET_VREG %edx, rINST # vA<- %edx; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IGET_SHORT */ |
| |
| .LOP_IGET_SHORT_finish: |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| je common_exceptionThrown # not resolved; handle exception |
| |
| /* |
| * %eax holds resolved field |
| */ |
| |
| .LOP_IGET_SHORT_finish2: |
| movl rINST, %ecx # %ecx<- BA |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movl (%ecx, %edx), %edx # %edx<- object field |
| SET_VREG %edx, rINST # vA<- %edx; object field |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT */ |
| |
| .LOP_IPUT_finish: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| lea -8(%esp), %esp |
| movl %edx, (%esp) # push parameter method->clazz |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved |
| jne .LOP_IPUT_finish2 |
| jmp common_exceptionThrown # not resolved; handle exception |
| |
| .LOP_IPUT_finish2: |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%edx, %ecx) # object field<- vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT_WIDE */ |
| |
| .LOP_IPUT_WIDE_finish2: |
| lea -8(%esp), %esp |
| call dvmResolveInstField # resolve InstField ptr |
| cmp $0, %eax # check if resolved |
| lea 8(%esp), %esp |
| movl %eax, %ecx # %ecx<- %eax; %ecx expected to hold field |
| jne .LOP_IPUT_WIDE_finish |
| jmp common_exceptionThrown |
| |
| /* |
| * Currently: |
| * %ecx holds resolved field |
| * %edx does not hold object yet |
| */ |
| |
| .LOP_IPUT_WIDE_finish: |
| movl rINST, %edx # %edx<- BA |
| shr $4, %edx # %edx<- B |
| andl $15, rINST # rINST<- A |
| GET_VREG %edx # %edx<- vB |
| cmp $0, %edx # check for null object |
| je common_errNullObject |
| movl offInstField_byteOffset(%ecx), %ecx # %ecx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| movq (rFP, rINST, 4), %xmm0 # %xmm0<- vA |
| movq %xmm0, (%ecx, %edx) # object field<- %xmm0; vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT_OBJECT */ |
| |
| .LOP_IPUT_OBJECT_finish: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| lea -8(%esp), %esp |
| movl %edx, (%esp) # push parameter method->clazz |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved |
| jne .LOP_IPUT_OBJECT_finish2 |
| jmp common_exceptionThrown # not resolved; handle exception |
| |
| .LOP_IPUT_OBJECT_finish2: |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%edx, %ecx) # object field<- vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT_BOOLEAN */ |
| |
| .LOP_IPUT_BOOLEAN_finish: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| lea -8(%esp), %esp |
| movl %edx, (%esp) # push parameter method->clazz |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved |
| jne .LOP_IPUT_BOOLEAN_finish2 |
| jmp common_exceptionThrown # not resolved; handle exception |
| |
| .LOP_IPUT_BOOLEAN_finish2: |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%edx, %ecx) # object field<- vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT_BYTE */ |
| |
| .LOP_IPUT_BYTE_finish: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| lea -8(%esp), %esp |
| movl %edx, (%esp) # push parameter method->clazz |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved |
| jne .LOP_IPUT_BYTE_finish2 |
| jmp common_exceptionThrown # not resolved; handle exception |
| |
| .LOP_IPUT_BYTE_finish2: |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%edx, %ecx) # object field<- vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT_CHAR */ |
| |
| .LOP_IPUT_CHAR_finish: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| lea -8(%esp), %esp |
| movl %edx, (%esp) # push parameter method->clazz |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved |
| jne .LOP_IPUT_CHAR_finish2 |
| jmp common_exceptionThrown # not resolved; handle exception |
| |
| .LOP_IPUT_CHAR_finish2: |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%edx, %ecx) # object field<- vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_IPUT_SHORT */ |
| |
| .LOP_IPUT_SHORT_finish: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %ecx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| lea -8(%esp), %esp |
| movl %edx, (%esp) # push parameter method->clazz |
| call dvmResolveInstField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: InstField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if resolved |
| jne .LOP_IPUT_SHORT_finish2 |
| jmp common_exceptionThrown # not resolved; handle exception |
| |
| .LOP_IPUT_SHORT_finish2: |
| movl rINST, %ecx # %ecx<- BA+ |
| shr $4, %ecx # %ecx<- B |
| and $15, rINST # rINST<- A |
| GET_VREG %ecx # %ecx<- vB |
| cmp $0, %ecx # check for null object |
| je common_errNullObject # handle null object |
| movl offInstField_byteOffset(%eax), %edx # %edx<- field offset |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vA |
| movl rINST, (%edx, %ecx) # object field<- vA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SGET */ |
| |
| .LOP_SGET_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| mov %eax, %ecx # %ecx<- result |
| |
| .LOP_SGET_finish: |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| movl offStaticField_value(%ecx), %eax # %eax<- field value |
| SET_VREG %eax, rINST # vAA<- field value |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SGET_WIDE */ |
| |
| /* |
| * Continuation if the field has not yet been resolved. |
| * %edx: BBBB field ref |
| */ |
| |
| .LOP_SGET_WIDE_resolve: |
| movl offGlue_method(%eax), %eax # %eax <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %edx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%eax), %eax # %eax<- method->clazz |
| movl %eax, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if initalization failed |
| movl %eax, %ecx # %ecx<- result |
| jne .LOP_SGET_WIDE_finish # success, continue |
| jmp common_exceptionThrown # failed; handle exception |
| |
| /* continuation for OP_SGET_OBJECT */ |
| |
| .LOP_SGET_OBJECT_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| mov %eax, %ecx # %ecx<- result |
| |
| .LOP_SGET_OBJECT_finish: |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| movl offStaticField_value(%ecx), %eax # %eax<- field value |
| SET_VREG %eax, rINST # vAA<- field value |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SGET_BOOLEAN */ |
| |
| .LOP_SGET_BOOLEAN_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| mov %eax, %ecx # %ecx<- result |
| |
| .LOP_SGET_BOOLEAN_finish: |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| movl offStaticField_value(%ecx), %eax # %eax<- field value |
| SET_VREG %eax, rINST # vAA<- field value |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SGET_BYTE */ |
| |
| .LOP_SGET_BYTE_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| mov %eax, %ecx # %ecx<- result |
| |
| .LOP_SGET_BYTE_finish: |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| movl offStaticField_value(%ecx), %eax # %eax<- field value |
| SET_VREG %eax, rINST # vAA<- field value |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SGET_CHAR */ |
| |
| .LOP_SGET_CHAR_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| mov %eax, %ecx # %ecx<- result |
| |
| .LOP_SGET_CHAR_finish: |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| movl offStaticField_value(%ecx), %eax # %eax<- field value |
| SET_VREG %eax, rINST # vAA<- field value |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SGET_SHORT */ |
| |
| .LOP_SGET_SHORT_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| mov %eax, %ecx # %ecx<- result |
| |
| .LOP_SGET_SHORT_finish: |
| FFETCH_ADV 2, %edx # %edx<- next instruction hi; fetch, advance |
| movl offStaticField_value(%ecx), %eax # %eax<- field value |
| SET_VREG %eax, rINST # vAA<- field value |
| FGETOP_JMP 2, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SPUT */ |
| |
| .LOP_SPUT_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| movl %eax, %ecx # %ecx<- result |
| |
| .LOP_SPUT_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offStaticField_value(%ecx) # field value<- vAA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SPUT_WIDE */ |
| |
| /* |
| * Continuation if the field has not yet been resolved. |
| * %edx: BBBB field ref |
| */ |
| |
| .LOP_SPUT_WIDE_resolve: |
| movl offGlue_method(%eax), %eax # %eax <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %edx, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%eax), %eax # %eax<- method->clazz |
| movl %eax, -8(%esp) |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| lea 8(%esp), %esp |
| cmp $0, %eax # check if initalization failed |
| movl %eax, %ecx # %ecx<- result |
| jne .LOP_SPUT_WIDE_finish # success, continue |
| jmp common_exceptionThrown # failed; handle exception |
| |
| /* continuation for OP_SPUT_OBJECT */ |
| |
| .LOP_SPUT_OBJECT_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| movl %eax, %ecx # %ecx<- result |
| |
| .LOP_SPUT_OBJECT_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offStaticField_value(%ecx) # field value<- vAA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SPUT_BOOLEAN */ |
| |
| .LOP_SPUT_BOOLEAN_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| movl %eax, %ecx # %ecx<- result |
| |
| .LOP_SPUT_BOOLEAN_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offStaticField_value(%ecx) # field value<- vAA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SPUT_BYTE */ |
| |
| .LOP_SPUT_BYTE_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| movl %eax, %ecx # %ecx<- result |
| |
| .LOP_SPUT_BYTE_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offStaticField_value(%ecx) # field value<- vAA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SPUT_CHAR */ |
| |
| .LOP_SPUT_CHAR_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| movl %eax, %ecx # %ecx<- result |
| |
| .LOP_SPUT_CHAR_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offStaticField_value(%ecx) # field value<- vAA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_SPUT_SHORT */ |
| |
| .LOP_SPUT_SHORT_resolve: |
| movl offGlue_method(%edx), %edx # %edx <- glue->method |
| EXPORT_PC # in case an exception is thrown |
| movl %eax, -4(%esp) # push parameter CCCC; field ref |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| movl %edx, -8(%esp) # push parameter method->clazz |
| lea -8(%esp), %esp |
| call dvmResolveStaticField # call: (const ClassObject* referrer, u4 ifieldIdx) |
| # return: StaticField* |
| cmp $0, %eax # check if initalization failed |
| lea 8(%esp), %esp |
| je common_exceptionThrown # failed; handle exception |
| movl %eax, %ecx # %ecx<- result |
| |
| .LOP_SPUT_SHORT_finish: |
| FFETCH_ADV 2, %eax # %eax<- next instruction hi; fetch, advance |
| GET_VREG rINST # rINST<- vAA |
| movl rINST, offStaticField_value(%ecx) # field value<- vAA |
| FGETOP_JMP 2, %eax # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_INVOKE_VIRTUAL */ |
| |
| .LOP_INVOKE_VIRTUAL_break: |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl %edx, -4(%esp) # save "this" pointer register |
| movl offGlue_method(%eax), %eax # %eax<- glue->method |
| movl $METHOD_VIRTUAL, -8(%esp) # push parameter method type |
| movl %ecx, -12(%esp) # push paramter method index |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| lea -16(%esp), %esp |
| movl %eax, (%esp) # push parameter clazz |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null method return |
| movl -4(%esp), %edx # get "this" pointer register |
| jne .LOP_INVOKE_VIRTUAL_continue |
| jmp common_exceptionThrown # null pointer; handle exception |
| |
| /* |
| * At this point: |
| * %eax = resolved base method |
| * %edx = D or CCCC (index of first arg, which is the "this" ptr) |
| */ |
| |
| .LOP_INVOKE_VIRTUAL_continue: |
| GET_VREG %edx # %edx<- "this" ptr |
| movzwl offMethod_methodIndex(%eax), %eax # %eax<- baseMethod->methodIndex |
| cmp $0, %edx # %edx<- check for null "this" |
| je common_errNullObject # handle null object |
| movl offObject_clazz(%edx), %edx # %edx<- thisPtr->clazz |
| movl offClassObject_vtable(%edx), %edx # %edx<- thisPtr->clazz->vtable |
| movl (%edx, %eax, 4), %ecx # %ecx<- vtable[methodIndex] |
| jmp common_invokeMethodNoRange # invoke method common code |
| |
| /* continuation for OP_INVOKE_SUPER */ |
| |
| .LOP_INVOKE_SUPER_continue2: |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_method(%eax), %eax # %eax<- glue->method |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| EXPORT_PC # must export for invoke |
| cmp $0, %ecx # check if already resolved |
| jne .LOP_INVOKE_SUPER_continue |
| jmp .LOP_INVOKE_SUPER_resolve # handle resolve |
| |
| /* |
| * %ecx = resolved base method |
| * %eax = method->clazz |
| */ |
| |
| .LOP_INVOKE_SUPER_continue: |
| movl offClassObject_super(%eax), %edx # %edx<- glue->method->clazz->super |
| movzwl offMethod_methodIndex(%ecx), %ecx # %ecx<- baseMethod->methodIndex |
| cmp offClassObject_vtableCount(%edx), %ecx # compare vtableCount with methodIndex |
| EXPORT_PC # must export for invoke |
| jnc .LOP_INVOKE_SUPER_nsm # handle method not present |
| movl offClassObject_vtable(%edx), %edx # %edx<- glue->method->clazz->super->vtable |
| movl (%edx, %ecx, 4), %ecx # %ecx<- vtable[methodIndex] |
| jmp common_invokeMethodNoRange # invoke method common code |
| |
| .LOP_INVOKE_SUPER_resolve: |
| movl %eax, -12(%esp) # push parameter clazz |
| movl %edx, -8(%esp) # push parameter method index |
| movl $METHOD_VIRTUAL, -4(%esp) # push parameter method type |
| lea -12(%esp), %esp |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 12(%esp), %esp |
| movl %eax, %ecx # %ecx<- method |
| cmp $0, %ecx # check for null method return |
| movl -12(%esp), %eax # %eax<- glue->method->clazz |
| jne .LOP_INVOKE_SUPER_continue |
| jmp common_exceptionThrown # null pointer; handle exception |
| |
| /* |
| * Throw a NoSuchMethodError with the method name as the message. |
| * %ecx = resolved base method |
| */ |
| |
| .LOP_INVOKE_SUPER_nsm: |
| movl offMethod_name(%ecx), %edx # %edx<- method name |
| jmp common_errNoSuchMethod |
| |
| /* continuation for OP_INVOKE_DIRECT */ |
| |
| /* |
| * %eax = reference (BBBB or CCCC) |
| * -4(%esp) = "this" register |
| */ |
| |
| .LOP_INVOKE_DIRECT_resolve: |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl $METHOD_DIRECT, -8(%esp) # push parameter method type |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl %eax, -12(%esp) # push parameter reference |
| lea -16(%esp), %esp |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, (%esp) # push parameter clazz |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null method return |
| movl -4(%esp), %edx # get "this" pointer register |
| GET_VREG %edx # get "this" pointer |
| je common_exceptionThrown # null pointer; handle exception |
| cmp $0, %edx # check for null "this" |
| movl %eax, %ecx # %ecx<- method |
| jne common_invokeMethodNoRange # invoke method common code |
| jmp common_errNullObject # handle null object |
| /* continuation for OP_INVOKE_STATIC */ |
| |
| .LOP_INVOKE_STATIC_break: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl $METHOD_STATIC, -4(%esp) # resolver method type |
| movl %eax, -8(%esp) # push parameter method index |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, -12(%esp) # push parameter method |
| lea -12(%esp), %esp |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 12(%esp), %esp |
| cmp $0, %eax # check for null method |
| je common_exceptionThrown |
| movl %eax, %ecx # %ecx<- method |
| jmp common_invokeMethodNoRange # invoke method common code |
| |
| /* continuation for OP_INVOKE_INTERFACE */ |
| .LOP_INVOKE_INTERFACE_break: |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_method(%ecx), %ecx # %ecx<- glue->method |
| movl %ecx, -8(%esp) # push parameter method |
| movl offObject_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, -16(%esp) # push parameter |
| lea -16(%esp), %esp |
| call dvmFindInterfaceMethodInCache # call: (ClassObject* thisClass, u4 methodIdx, |
| # const Method* method, DvmDex* methodClassDex) |
| # return: Method* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check if find failed |
| je common_exceptionThrown # handle exception |
| movl %eax, %ecx # %ecx<- method |
| jmp common_invokeMethodNoRange # invoke method common code |
| |
| /* continuation for OP_INVOKE_VIRTUAL_RANGE */ |
| |
| .LOP_INVOKE_VIRTUAL_RANGE_break: |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl %edx, -4(%esp) # save "this" pointer register |
| movl offGlue_method(%eax), %eax # %eax<- glue->method |
| movl $METHOD_VIRTUAL, -8(%esp) # push parameter method type |
| movl %ecx, -12(%esp) # push paramter method index |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| lea -16(%esp), %esp |
| movl %eax, (%esp) # push parameter clazz |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null method return |
| movl -4(%esp), %edx # get "this" pointer register |
| jne .LOP_INVOKE_VIRTUAL_RANGE_continue |
| jmp common_exceptionThrown # null pointer; handle exception |
| |
| /* |
| * At this point: |
| * %eax = resolved base method |
| * %edx = D or CCCC (index of first arg, which is the "this" ptr) |
| */ |
| |
| .LOP_INVOKE_VIRTUAL_RANGE_continue: |
| GET_VREG %edx # %edx<- "this" ptr |
| movzwl offMethod_methodIndex(%eax), %eax # %eax<- baseMethod->methodIndex |
| cmp $0, %edx # %edx<- check for null "this" |
| je common_errNullObject # handle null object |
| movl offObject_clazz(%edx), %edx # %edx<- thisPtr->clazz |
| movl offClassObject_vtable(%edx), %edx # %edx<- thisPtr->clazz->vtable |
| movl (%edx, %eax, 4), %ecx # %ecx<- vtable[methodIndex] |
| jmp common_invokeMethodRange # invoke method common code |
| |
| /* continuation for OP_INVOKE_SUPER_RANGE */ |
| |
| .LOP_INVOKE_SUPER_RANGE_continue2: |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_method(%eax), %eax # %eax<- glue->method |
| movl offMethod_clazz(%eax), %eax # %eax<- glue->method->clazz |
| EXPORT_PC # must export for invoke |
| cmp $0, %ecx # check if already resolved |
| jne .LOP_INVOKE_SUPER_RANGE_continue |
| jmp .LOP_INVOKE_SUPER_RANGE_resolve # handle resolve |
| |
| /* |
| * %ecx = resolved base method |
| * %eax = method->clazz |
| */ |
| |
| .LOP_INVOKE_SUPER_RANGE_continue: |
| movl offClassObject_super(%eax), %edx # %edx<- glue->method->clazz->super |
| movzwl offMethod_methodIndex(%ecx), %ecx # %ecx<- baseMethod->methodIndex |
| cmp offClassObject_vtableCount(%edx), %ecx # compare vtableCount with methodIndex |
| EXPORT_PC # must export for invoke |
| jnc .LOP_INVOKE_SUPER_RANGE_nsm # handle method not present |
| movl offClassObject_vtable(%edx), %edx # %edx<- glue->method->clazz->super->vtable |
| movl (%edx, %ecx, 4), %ecx # %ecx<- vtable[methodIndex] |
| jmp common_invokeMethodRange # invoke method common code |
| |
| .LOP_INVOKE_SUPER_RANGE_resolve: |
| movl %eax, -12(%esp) # push parameter clazz |
| movl %edx, -8(%esp) # push parameter method index |
| movl $METHOD_VIRTUAL, -4(%esp) # push parameter method type |
| lea -12(%esp), %esp |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 12(%esp), %esp |
| movl %eax, %ecx # %ecx<- method |
| cmp $0, %ecx # check for null method return |
| movl -12(%esp), %eax # %eax<- glue->method->clazz |
| jne .LOP_INVOKE_SUPER_RANGE_continue |
| jmp common_exceptionThrown # null pointer; handle exception |
| |
| /* |
| * Throw a NoSuchMethodError with the method name as the message. |
| * %ecx = resolved base method |
| */ |
| |
| .LOP_INVOKE_SUPER_RANGE_nsm: |
| movl offMethod_name(%ecx), %edx # %edx<- method name |
| jmp common_errNoSuchMethod |
| |
| /* continuation for OP_INVOKE_DIRECT_RANGE */ |
| |
| /* |
| * %eax = reference (BBBB or CCCC) |
| * -4(%esp) = "this" register |
| */ |
| |
| .LOP_INVOKE_DIRECT_RANGE_resolve: |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl $METHOD_DIRECT, -8(%esp) # push parameter method type |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl %eax, -12(%esp) # push parameter reference |
| lea -16(%esp), %esp |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, (%esp) # push parameter clazz |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check for null method return |
| movl -4(%esp), %edx # get "this" pointer register |
| GET_VREG %edx # get "this" pointer |
| je common_exceptionThrown # null pointer; handle exception |
| cmp $0, %edx # check for null "this" |
| movl %eax, %ecx # %ecx<- method |
| jne common_invokeMethodRange # invoke method common code |
| jmp common_errNullObject # handle null object |
| /* continuation for OP_INVOKE_STATIC_RANGE */ |
| |
| .LOP_INVOKE_STATIC_RANGE_break: |
| movl offGlue_method(%edx), %edx # %edx<- glue->method |
| movl $METHOD_STATIC, -4(%esp) # resolver method type |
| movl %eax, -8(%esp) # push parameter method index |
| movl offMethod_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, -12(%esp) # push parameter method |
| lea -12(%esp), %esp |
| call dvmResolveMethod # call: (const ClassObject* referrer, |
| # u4 methodIdx, MethodType methodType) |
| # return: Method* |
| lea 12(%esp), %esp |
| cmp $0, %eax # check for null method |
| je common_exceptionThrown |
| movl %eax, %ecx # %ecx<- method |
| jmp common_invokeMethodRange # invoke method common code |
| |
| /* continuation for OP_INVOKE_INTERFACE_RANGE */ |
| .LOP_INVOKE_INTERFACE_RANGE_break: |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_method(%ecx), %ecx # %ecx<- glue->method |
| movl %ecx, -8(%esp) # push parameter method |
| movl offObject_clazz(%edx), %edx # %edx<- glue->method->clazz |
| movl %edx, -16(%esp) # push parameter |
| lea -16(%esp), %esp |
| call dvmFindInterfaceMethodInCache # call: (ClassObject* thisClass, u4 methodIdx, |
| # const Method* method, DvmDex* methodClassDex) |
| # return: Method* |
| lea 16(%esp), %esp |
| cmp $0, %eax # check if find failed |
| je common_exceptionThrown # handle exception |
| movl %eax, %ecx # %ecx<- method |
| jmp common_invokeMethodRange # invoke method common code |
| |
| /* continuation for OP_FLOAT_TO_INT */ |
| |
| .LOP_FLOAT_TO_INT_break: |
| fnstcw -2(%esp) # save control word |
| orl $0xc00, -2(%esp) # reset control |
| fldcw -2(%esp) # load control word |
| xorl $0xc00, -2(%esp) # reset control |
| fistpl (rFP, %edx, 4) # move converted int |
| fldcw -2(%esp) # load saved control word |
| FINISH 1 # jump to next instruction |
| |
| .LOP_FLOAT_TO_INT_nanInf: |
| jnp .LOP_FLOAT_TO_INT_posInf # handle posInf |
| fstps (rFP, %edx, 4) # pop floating point stack |
| movl $0x00000000, (rFP, %edx, 4) # vA<- NaN |
| FINISH 1 # jump to next instruction |
| |
| .LOP_FLOAT_TO_INT_posInf: |
| fstps (rFP, %edx, 4) # pop floating point stack |
| movl $0x7FFFFFFF, (rFP, %edx, 4) # vA<- posInf |
| FINISH 1 # jump to next instruction |
| |
| .LOP_FLOAT_TO_INT_negInf: |
| fstps (rFP, %edx, 4) # pop floating point stack |
| fstps (rFP, %edx, 4) # pop floating point stack |
| movl $0x80000000, (rFP, %edx, 4) # vA<- negInf |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_FLOAT_TO_LONG */ |
| |
| .LOP_FLOAT_TO_LONG_break: |
| fnstcw -2(%esp) # save control word |
| orl $0xc00, -2(%esp) # update control |
| fldcw -2(%esp) # load control word |
| xorl $0xc00, -2(%esp) # reset control |
| fistpll (rFP, %edx, 4) # move converted int |
| fldcw -2(%esp) # load saved control word |
| FINISH 1 # jump to next instruction |
| |
| .LOP_FLOAT_TO_LONG_nanInf: |
| jnp .LOP_FLOAT_TO_LONG_posInf |
| fstpl (rFP, %edx, 4) # move converted int |
| movq .LvalueNanLong, %xmm0 # %xmm0<- NaN |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; NaN |
| FINISH 1 # jump to next instruction |
| |
| .LOP_FLOAT_TO_LONG_posInf: |
| fstpl (rFP, %edx, 4) # move converted int |
| movq .LvaluePosInfLong, %xmm0 # %xmm0<- posInf |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; posInf |
| FINISH 1 # jump to next instruction |
| |
| .LOP_FLOAT_TO_LONG_negInf: |
| fstpl (rFP, %edx, 4) # move converted int |
| movq .LvalueNegInfLong, %xmm0 # %xmm0<- negInf |
| fstpl (rFP, %edx, 4) # move converted int |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; negInf |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_DOUBLE_TO_INT */ |
| |
| .LOP_DOUBLE_TO_INT_break: |
| fnstcw -2(%esp) # save control word |
| orl $0xc00, -2(%esp) # reset control |
| fldcw -2(%esp) # load control word |
| xorl $0xc00, -2(%esp) # reset control |
| fistpl (rFP, %edx, 4) # move converted int |
| fldcw -2(%esp) # load saved control word |
| FINISH 1 # jump to next instruction |
| |
| .LOP_DOUBLE_TO_INT_nanInf: |
| jnp .LOP_DOUBLE_TO_INT_posInf |
| fstps (rFP, %edx, 4) |
| movl $0x00000000, (rFP, %edx, 4) # vA<- NaN |
| FINISH 1 # jump to next instruction |
| |
| .LOP_DOUBLE_TO_INT_posInf: |
| fstps (rFP, %edx, 4) |
| movl $0x7FFFFFFF, (rFP, %edx, 4) # vA<- posInf |
| FINISH 1 # jump to next instruction |
| |
| .LOP_DOUBLE_TO_INT_negInf: |
| fstps (rFP, %edx, 4) |
| fstps (rFP, %edx, 4) |
| movl $0x80000000, (rFP, %edx, 4) # vA<- negInf |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_DOUBLE_TO_LONG */ |
| |
| .LOP_DOUBLE_TO_LONG_break: |
| fnstcw -2(%esp) # save control word |
| orl $0xc00, -2(%esp) # reset control |
| fldcw -2(%esp) # load control word |
| xorl $0xc00, -2(%esp) # reset control |
| fistpll (rFP, %edx, 4) # move converted int |
| fldcw -2(%esp) # load saved control word |
| FINISH 1 # jump to next instruction |
| |
| .LOP_DOUBLE_TO_LONG_nanInf: |
| jnp .LOP_DOUBLE_TO_LONG_posInf |
| fstpl (rFP, %edx, 4) # move converted int |
| movq .LvalueNanLong, %xmm0 # %xmm0<- NaN |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; NaN |
| FINISH 1 # jump to next instruction |
| |
| .LOP_DOUBLE_TO_LONG_posInf: |
| fstpl (rFP, %edx, 4) # move converted int |
| movq .LvaluePosInfLong, %xmm0 # %xmm0<- posInf |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; posInf |
| FINISH 1 # jump to next instruction |
| |
| .LOP_DOUBLE_TO_LONG_negInf: |
| fstpl (rFP, %edx, 4) # move converted int |
| movq .LvalueNegInfLong, %xmm0 # %xmm0<- negInf |
| fstpl (rFP, %edx, 4) # move converted int |
| movq %xmm0, (rFP, %edx, 4) # vA<- %xmm0; negInf |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_DIV_INT */ |
| .LOP_DIV_INT_break: |
| FFETCH_ADV 2 %eax |
| .if 1 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| FGETOP_JMP 2 %eax |
| /* continuation for OP_REM_INT */ |
| .LOP_REM_INT_break: |
| FFETCH_ADV 2 %eax |
| .if 0 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| FGETOP_JMP 2 %eax |
| /* continuation for OP_MUL_LONG */ |
| |
| /* |
| * X = (rFP, rINST, 4) |
| * W = 4(rFP, rINST, 4) |
| * Z = (rFP, %edx, 4) |
| * Y = 4(rFP, %edx, 4) |
| */ |
| |
| .LOP_MUL_LONG_finish: |
| movl 4(rFP, rINST, 4), %ecx # %ecx<- W |
| imull (rFP, %edx, 4), %ecx # %ecx<- WxZ |
| mov 4(rFP, %edx, 4), %eax # %ecx<- Y |
| imull (rFP, rINST, 4), %eax # %eax<- XxY |
| addl %eax, %ecx # %ecx<- (WZ + XY) |
| movl (rFP, %edx, 4), %eax # %eax<- Z |
| mull (rFP, rINST, 4) # %edx:eax<- XZ |
| movzbl -4(%esp), rINST # rINST<- AA |
| addl %edx, %ecx # %ecx<- carry + (WZ + XY) |
| movl %ecx, 4(rFP, rINST, 4) # vAA+1<- results hi |
| movl %eax, (rFP, rINST, 4) # vAA<- results lo |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_DIV_LONG */ |
| .LOP_DIV_LONG_finish: |
| movq %xmm0, -16(%esp) # push arg vBB,vBB+1 |
| lea -16(%esp), %esp |
| call __divdi3 # call func |
| lea 16(%esp), %esp |
| movl %eax, (rFP, rINST, 4) # vAA<- return low |
| movl %edx, 4(rFP, rINST, 4) # vAA+1<- return high |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_REM_LONG */ |
| .LOP_REM_LONG_finish: |
| movq %xmm0, -16(%esp) # push arg vBB,vBB+1 |
| lea -16(%esp), %esp |
| call __moddi3 # call func |
| lea 16(%esp), %esp |
| movl %eax, (rFP, rINST, 4) # vAA<- return low |
| movl %edx, 4(rFP, rINST, 4) # vAA+1<- return high |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_SHR_LONG */ |
| |
| .LOP_SHR_LONG_finish: |
| movq .Lvalue64, %xmm3 # %xmm3<- 64 |
| psubq %xmm0, %xmm3 # %xmm3<- 64 - shift amount |
| movq .L64bits, %xmm4 # %xmm4<- lower 64 bits set |
| psllq %xmm3, %xmm4 # %xmm4<- correct mask for sign bits |
| por %xmm4, %xmm1 # %xmm1<- signed and shifted vBB |
| |
| .LOP_SHR_LONG_final: |
| movq %xmm1, (rFP, rINST, 4) # vAA<- shifted vBB |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_REM_DOUBLE */ |
| |
| .LOP_REM_DOUBLE_break: |
| call fmod # call: (long double x, long double y) |
| # return: double |
| lea 16(%esp), %esp |
| fstpl (rFP, rINST, 4) # vAA<- remainder; return of fmod |
| FINISH 2 # jump to next instruction |
| |
| /* continuation for OP_DIV_INT_2ADDR */ |
| .LOP_DIV_INT_2ADDR_break: |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| .if 1 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_REM_INT_2ADDR */ |
| .LOP_REM_INT_2ADDR_break: |
| FFETCH_ADV 1, %edx # %ecx<- next instruction hi; fetch, advance |
| .if 0 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| FGETOP_JMP 1, %edx # jump to next instruction; getop, jmp |
| |
| /* continuation for OP_MUL_LONG_2ADDR */ |
| |
| /* |
| * X = (rFP, rINST, 4) |
| * W = 4(rFP, rINST, 4) |
| * Z = (rFP, %edx, 4) |
| * Y = 4(rFP, %edx, 4) |
| */ |
| |
| .LOP_MUL_LONG_2ADDR_finish: |
| movl 4(rFP, rINST, 4), %ecx # %ecx<- W |
| imull (rFP, %edx, 4), %ecx # %ecx<- WxZ |
| movl 4(rFP, %edx, 4), %eax # %eax<- Y |
| imull (rFP, rINST, 4), %eax # %eax<- X*Y |
| addl %eax, %ecx # %ecx<- (WZ + XY) |
| movl (rFP, %edx, 4), %eax # %eax<- Z |
| mull (rFP, rINST, 4) # %edx:eax<- XZ |
| addl %edx, %ecx # %ecx<- carry + (WZ + XY) |
| movl sReg0, %edx # %edx<- A |
| movl %ecx, 4(rFP, %edx, 4) # vA+1<- results hi |
| movl %eax, (rFP, %edx, 4) # vA<- results lo |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_DIV_LONG_2ADDR */ |
| .LOP_DIV_LONG_2ADDR_break: |
| movq %xmm0, -20(%esp) # push arg vA, vA+1 |
| lea -20(%esp), %esp |
| call __divdi3 # call func |
| lea 20(%esp), %esp |
| movl %eax, (rFP, rINST, 4) # vA<- return low |
| movl %edx, 4(rFP, rINST, 4) # vA<- return high |
| FFETCH_ADV 1, %ecx # %ecx<- next instruction hi; fetch, advance |
| FGETOP_JMP 1, %ecx # jump to next instruction; getop, jmp |
| /* continuation for OP_REM_LONG_2ADDR */ |
| .LOP_REM_LONG_2ADDR_break: |
| movq %xmm0, -20(%esp) # push arg vA, vA+1 |
| lea -20(%esp), %esp |
| call __moddi3 # call func |
| lea 20(%esp), %esp |
| movl %eax, (rFP, rINST, 4) # vA<- return low |
| movl %edx, 4(rFP, rINST, 4) # vA<- return high |
| FFETCH_ADV 1, %ecx # %ecx<- next instruction hi; fetch, advance |
| FGETOP_JMP 1, %ecx # jump to next instruction; getop, jmp |
| /* continuation for OP_SHR_LONG_2ADDR */ |
| |
| .LOP_SHR_LONG_2ADDR_finish: |
| movq .Lvalue64, %xmm3 # %xmm3<- 64 |
| psubq %xmm0, %xmm3 # %xmm3<- 64 - shift amount |
| movq .L64bits, %xmm4 # %xmm4<- lower 64 bits set |
| psllq %xmm3, %xmm4 # %xmm4<- correct mask for sign bits |
| por %xmm4, %xmm1 # %xmm1<- signed and shifted vBB |
| |
| .LOP_SHR_LONG_2ADDR_final: |
| movq %xmm1, (rFP, rINST, 4) # vAA<- shifted vBB |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_REM_DOUBLE_2ADDR */ |
| |
| .LOP_REM_DOUBLE_2ADDR_break: |
| call fmod # call: (long double x, long double y) |
| # return: double |
| lea 20(%esp), %esp |
| fstpl (rFP, rINST, 4) # vAA<- remainder; return of fmod |
| FINISH 1 # jump to next instruction |
| |
| /* continuation for OP_DIV_INT_LIT16 */ |
| .LOP_DIV_INT_LIT16_break: |
| movzbl (rPC), %edx |
| .if 1 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| |
| /* continuation for OP_REM_INT_LIT16 */ |
| .LOP_REM_INT_LIT16_break: |
| movzbl (rPC), %edx |
| .if 0 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| |
| /* continuation for OP_DIV_INT_LIT8 */ |
| .LOP_DIV_INT_LIT8_break: |
| movzbl (rPC), %edx |
| .if 1 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| |
| /* continuation for OP_REM_INT_LIT8 */ |
| .LOP_REM_INT_LIT8_break: |
| movzbl (rPC), %edx |
| .if 0 |
| movl $0x80000000, (rFP, rINST, 4) # vAA<- min int |
| .else |
| movl $0, (rFP, rINST, 4) # vAA<- 0 |
| .endif |
| movzbl 1(rPC), rINST |
| jmp *dvmAsmInstructionJmpTable(, %edx, 4) |
| |
| /* continuation for OP_EXECUTE_INLINE */ |
| |
| /* |
| * Extract args, call function. |
| * rINST = #of args (0-4) |
| * %ecx = call index |
| */ |
| |
| .LOP_EXECUTE_INLINE_continue: |
| FETCH 2, %edx # %edx<- FEDC |
| cmp $1, rINST # determine number of arguments |
| jl 0f # handle zero args |
| je 1f # handle one arg |
| cmp $3, rINST |
| jl 2f # handle two args |
| je 3f # handle three args |
| 4: |
| movl %edx, rINST # rINST<- FEDC |
| and $0xf000, rINST # isolate F |
| shr $10, rINST |
| movl (rFP, rINST), rINST # rINST<- vF |
| movl rINST, 12(%esp) # push parameter vF |
| 3: |
| movl %edx, rINST # rINST<- FEDC |
| and $0x0f00, rINST # isolate E |
| shr $6, rINST |
| movl (rFP, rINST), rINST # rINST<- vE |
| movl rINST, 8(%esp) # push parameter E |
| 2: |
| movl %edx, rINST # rINST<- FEDC |
| and $0x00f0, rINST # isolate D |
| shr $2, rINST |
| movl (rFP, rINST), rINST # rINST<- vD |
| movl rINST, 4(%esp) # push parameter D |
| 1: |
| and $0x000f, %edx # isolate C |
| movl (rFP, %edx, 4), %edx # rINST<- vC |
| movl %edx, (%esp) # push parameter C |
| 0: |
| shl $4, %ecx |
| movl $gDvmInlineOpsTable, %eax # %eax<- address for table of inline operations |
| call *(%eax, %ecx) # call function |
| |
| cmp $0, %eax # check boolean result of inline |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| lea 24(%esp), %esp # update stack pointer |
| je common_exceptionThrown # handle exception |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| /* continuation for OP_EXECUTE_INLINE_RANGE */ |
| |
| /* |
| * Extract args, call function. |
| * rINST = #of args (0-4) |
| * %ecx = call index |
| */ |
| |
| .LOP_EXECUTE_INLINE_RANGE_continue: |
| FETCH 2, %edx # %edx<- FEDC |
| cmp $1, rINST # determine number of arguments |
| jl 0f # handle zero args |
| je 1f # handle one arg |
| cmp $3, rINST |
| jl 2f # handle two args |
| je 3f # handle three args |
| 4: |
| movl 12(rFP, %edx, 4), rINST # rINST<- vF |
| movl rINST, 12(%esp) # push parameter vF |
| 3: |
| movl 8(rFP, %edx, 4), rINST # rINST<- vE |
| movl rINST, 8(%esp) # push parameter E |
| 2: |
| movl 4(rFP, %edx, 4), rINST # rINST<- vD |
| movl rINST, 4(%esp) # push parameter D |
| 1: |
| movl (rFP, %edx, 4), %edx # rINST<- vC |
| movl %edx, (%esp) # push parameter C |
| 0: |
| shl $4, %ecx |
| movl $gDvmInlineOpsTable, %eax # %eax<- address for table of inline operations |
| call *(%eax, %ecx) # call function |
| |
| cmp $0, %eax # check boolean result of inline |
| FFETCH_ADV 3, %eax # %eax<- next instruction hi; fetch, advance |
| lea 24(%esp), %esp # update stack pointer |
| je common_exceptionThrown # handle exception |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| |
| .size dvmAsmSisterStart, .-dvmAsmSisterStart |
| .global dvmAsmSisterEnd |
| dvmAsmSisterEnd: |
| |
| /* File: x86-atom/entry.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: entry.S |
| */ |
| |
| #define ASSIST_DEBUGGER 1 |
| .text |
| .align 2 |
| .global dvmMterpStdRun |
| .type dvmMterpStdRun, %function |
| |
| /* |
| * Save registers, initialize sp and fp. |
| * On entry: |
| * bool MterpGlue(glue *) |
| */ |
| |
| .macro MTERP_ENTRY |
| movl 4(%esp), %ecx # get first argument |
| movl %ebp, -4(%esp) # save caller base pointer |
| movl %ebx, -8(%esp) # save %ebx |
| movl %esi, -12(%esp) # save %esi |
| movl %edi, -16(%esp) # save %edi |
| lea -40(%esp), %ebp # set callee base pointer |
| lea -40(%esp), %esp # set callee stack pointer |
| .endm |
| |
| /* |
| * Restore registers. |
| * This function returns a boolean "changeInterp" value. |
| * The return value is from dvmMterpStdBail(). |
| */ |
| |
| .macro MTERP_EXIT |
| #lea 40(%ebp), %esp # correct stack pointer |
| #movl 24(%ebp), %edi # restore %edi |
| #movl 28(%ebp), %esi # restore %esi |
| #movl 32(%ebp), %ebx # restore %ebx |
| #movl 36(%ebp), %ebp # restore caller base pointer |
| #ret # return |
| |
| lea 40(%esp), %esp # correct stack pointer |
| movl -16(%esp), %edi # restore %edi |
| movl -12(%esp), %esi # restore %esi |
| movl -8(%esp), %ebx # restore %ebx |
| movl -4(%esp), %ebp # restore caller base pointer |
| ret # return |
| .endm |
| |
| /* |
| * DvmMterpStdRun entry point: save stack pointer, setup memory locations, get |
| * entry point, start executing instructions. |
| */ |
| |
| dvmMterpStdRun: |
| MTERP_ENTRY |
| movl %ecx, rGLUE # save value for pMterpGlue |
| movl offGlue_pc(%ecx), rPC # get program counter |
| cmp $kInterpEntryInstr, offGlue_entryPoint(%ecx) # check instruction |
| movl offGlue_fp(%ecx), rFP # get frame pointer |
| movl %esp, offGlue_bailPtr(%ecx) # save SP for eventual return |
| FFETCH %edx # %edx<- opcode |
| jne .Lnot_instr # no, handle it |
| FGETOP_JMPa %edx # start executing the instruction at rPC |
| |
| /* |
| * Not an instruction. Are we returning from a method? |
| */ |
| |
| .Lnot_instr: |
| cmpl $kInterpEntryReturn, offGlue_entryPoint(%ecx) |
| je common_returnFromMethod |
| |
| /* |
| * No, are we throwing an exception? |
| */ |
| |
| .Lnot_return: |
| cmpl $kInterpEntryThrow, offGlue_entryPoint(%ecx) |
| je common_exceptionThrown |
| |
| /* |
| * No, then we must abort. |
| */ |
| |
| .Lbad_arg: |
| pushl offGlue_entryPoint(%ecx) |
| movl $.LstrBadEntryPoint, -4(%esp) |
| lea -4(%esp), %esp |
| call printf |
| lea 8(%esp), %esp |
| call dvmAbort # call (void) |
| |
| /* |
| * Restore the stack pointer and PC from the save point established on entry and |
| * return to whoever called dvmMterpStdRun. |
| * |
| * On entry: |
| * 4(%esp) MterpGlue* glue |
| * 8(%esp) bool changeInterp |
| */ |
| |
| .global dvmMterpStdBail |
| .type dvmMterpStdBail, %function |
| |
| dvmMterpStdBail: |
| movl 4(%esp), %ecx # get first argument |
| movl 8(%esp), %eax # get second argument |
| movl offGlue_bailPtr(%ecx), %esp # sp <- saved SP |
| MTERP_EXIT |
| |
| /* |
| * String references. |
| */ |
| |
| .LstrBadEntryPoint: |
| .asciz "Bad entry point %d\n" |
| |
| |
| dvmAsmInstructionJmpTable = .LdvmAsmInstructionJmpTable |
| .LdvmAsmInstructionJmpTable: |
| .long .L_OP_NOP |
| .long .L_OP_MOVE |
| .long .L_OP_MOVE_FROM16 |
| .long .L_OP_MOVE_16 |
| .long .L_OP_MOVE_WIDE |
| .long .L_OP_MOVE_WIDE_FROM16 |
| .long .L_OP_MOVE_WIDE_16 |
| .long .L_OP_MOVE_OBJECT |
| .long .L_OP_MOVE_OBJECT_FROM16 |
| .long .L_OP_MOVE_OBJECT_16 |
| .long .L_OP_MOVE_RESULT |
| .long .L_OP_MOVE_RESULT_WIDE |
| .long .L_OP_MOVE_RESULT_OBJECT |
| .long .L_OP_MOVE_EXCEPTION |
| .long .L_OP_RETURN_VOID |
| .long .L_OP_RETURN |
| .long .L_OP_RETURN_WIDE |
| .long .L_OP_RETURN_OBJECT |
| .long .L_OP_CONST_4 |
| .long .L_OP_CONST_16 |
| .long .L_OP_CONST |
| .long .L_OP_CONST_HIGH16 |
| .long .L_OP_CONST_WIDE_16 |
| .long .L_OP_CONST_WIDE_32 |
| .long .L_OP_CONST_WIDE |
| .long .L_OP_CONST_WIDE_HIGH16 |
| .long .L_OP_CONST_STRING |
| .long .L_OP_CONST_STRING_JUMBO |
| .long .L_OP_CONST_CLASS |
| .long .L_OP_MONITOR_ENTER |
| .long .L_OP_MONITOR_EXIT |
| .long .L_OP_CHECK_CAST |
| .long .L_OP_INSTANCE_OF |
| .long .L_OP_ARRAY_LENGTH |
| .long .L_OP_NEW_INSTANCE |
| .long .L_OP_NEW_ARRAY |
| .long .L_OP_FILLED_NEW_ARRAY |
| .long .L_OP_FILLED_NEW_ARRAY_RANGE |
| .long .L_OP_FILL_ARRAY_DATA |
| .long .L_OP_THROW |
| .long .L_OP_GOTO |
| .long .L_OP_GOTO_16 |
| .long .L_OP_GOTO_32 |
| .long .L_OP_PACKED_SWITCH |
| .long .L_OP_SPARSE_SWITCH |
| .long .L_OP_CMPL_FLOAT |
| .long .L_OP_CMPG_FLOAT |
| .long .L_OP_CMPL_DOUBLE |
| .long .L_OP_CMPG_DOUBLE |
| .long .L_OP_CMP_LONG |
| .long .L_OP_IF_EQ |
| .long .L_OP_IF_NE |
| .long .L_OP_IF_LT |
| .long .L_OP_IF_GE |
| .long .L_OP_IF_GT |
| .long .L_OP_IF_LE |
| .long .L_OP_IF_EQZ |
| .long .L_OP_IF_NEZ |
| .long .L_OP_IF_LTZ |
| .long .L_OP_IF_GEZ |
| .long .L_OP_IF_GTZ |
| .long .L_OP_IF_LEZ |
| .long .L_OP_UNUSED_3E |
| .long .L_OP_UNUSED_3F |
| .long .L_OP_UNUSED_40 |
| .long .L_OP_UNUSED_41 |
| .long .L_OP_UNUSED_42 |
| .long .L_OP_UNUSED_43 |
| .long .L_OP_AGET |
| .long .L_OP_AGET_WIDE |
| .long .L_OP_AGET_OBJECT |
| .long .L_OP_AGET_BOOLEAN |
| .long .L_OP_AGET_BYTE |
| .long .L_OP_AGET_CHAR |
| .long .L_OP_AGET_SHORT |
| .long .L_OP_APUT |
| .long .L_OP_APUT_WIDE |
| .long .L_OP_APUT_OBJECT |
| .long .L_OP_APUT_BOOLEAN |
| .long .L_OP_APUT_BYTE |
| .long .L_OP_APUT_CHAR |
| .long .L_OP_APUT_SHORT |
| .long .L_OP_IGET |
| .long .L_OP_IGET_WIDE |
| .long .L_OP_IGET_OBJECT |
| .long .L_OP_IGET_BOOLEAN |
| .long .L_OP_IGET_BYTE |
| .long .L_OP_IGET_CHAR |
| .long .L_OP_IGET_SHORT |
| .long .L_OP_IPUT |
| .long .L_OP_IPUT_WIDE |
| .long .L_OP_IPUT_OBJECT |
| .long .L_OP_IPUT_BOOLEAN |
| .long .L_OP_IPUT_BYTE |
| .long .L_OP_IPUT_CHAR |
| .long .L_OP_IPUT_SHORT |
| .long .L_OP_SGET |
| .long .L_OP_SGET_WIDE |
| .long .L_OP_SGET_OBJECT |
| .long .L_OP_SGET_BOOLEAN |
| .long .L_OP_SGET_BYTE |
| .long .L_OP_SGET_CHAR |
| .long .L_OP_SGET_SHORT |
| .long .L_OP_SPUT |
| .long .L_OP_SPUT_WIDE |
| .long .L_OP_SPUT_OBJECT |
| .long .L_OP_SPUT_BOOLEAN |
| .long .L_OP_SPUT_BYTE |
| .long .L_OP_SPUT_CHAR |
| .long .L_OP_SPUT_SHORT |
| .long .L_OP_INVOKE_VIRTUAL |
| .long .L_OP_INVOKE_SUPER |
| .long .L_OP_INVOKE_DIRECT |
| .long .L_OP_INVOKE_STATIC |
| .long .L_OP_INVOKE_INTERFACE |
| .long .L_OP_UNUSED_73 |
| .long .L_OP_INVOKE_VIRTUAL_RANGE |
| .long .L_OP_INVOKE_SUPER_RANGE |
| .long .L_OP_INVOKE_DIRECT_RANGE |
| .long .L_OP_INVOKE_STATIC_RANGE |
| .long .L_OP_INVOKE_INTERFACE_RANGE |
| .long .L_OP_UNUSED_79 |
| .long .L_OP_UNUSED_7A |
| .long .L_OP_NEG_INT |
| .long .L_OP_NOT_INT |
| .long .L_OP_NEG_LONG |
| .long .L_OP_NOT_LONG |
| .long .L_OP_NEG_FLOAT |
| .long .L_OP_NEG_DOUBLE |
| .long .L_OP_INT_TO_LONG |
| .long .L_OP_INT_TO_FLOAT |
| .long .L_OP_INT_TO_DOUBLE |
| .long .L_OP_LONG_TO_INT |
| .long .L_OP_LONG_TO_FLOAT |
| .long .L_OP_LONG_TO_DOUBLE |
| .long .L_OP_FLOAT_TO_INT |
| .long .L_OP_FLOAT_TO_LONG |
| .long .L_OP_FLOAT_TO_DOUBLE |
| .long .L_OP_DOUBLE_TO_INT |
| .long .L_OP_DOUBLE_TO_LONG |
| .long .L_OP_DOUBLE_TO_FLOAT |
| .long .L_OP_INT_TO_BYTE |
| .long .L_OP_INT_TO_CHAR |
| .long .L_OP_INT_TO_SHORT |
| .long .L_OP_ADD_INT |
| .long .L_OP_SUB_INT |
| .long .L_OP_MUL_INT |
| .long .L_OP_DIV_INT |
| .long .L_OP_REM_INT |
| .long .L_OP_AND_INT |
| .long .L_OP_OR_INT |
| .long .L_OP_XOR_INT |
| .long .L_OP_SHL_INT |
| .long .L_OP_SHR_INT |
| .long .L_OP_USHR_INT |
| .long .L_OP_ADD_LONG |
| .long .L_OP_SUB_LONG |
| .long .L_OP_MUL_LONG |
| .long .L_OP_DIV_LONG |
| .long .L_OP_REM_LONG |
| .long .L_OP_AND_LONG |
| .long .L_OP_OR_LONG |
| .long .L_OP_XOR_LONG |
| .long .L_OP_SHL_LONG |
| .long .L_OP_SHR_LONG |
| .long .L_OP_USHR_LONG |
| .long .L_OP_ADD_FLOAT |
| .long .L_OP_SUB_FLOAT |
| .long .L_OP_MUL_FLOAT |
| .long .L_OP_DIV_FLOAT |
| .long .L_OP_REM_FLOAT |
| .long .L_OP_ADD_DOUBLE |
| .long .L_OP_SUB_DOUBLE |
| .long .L_OP_MUL_DOUBLE |
| .long .L_OP_DIV_DOUBLE |
| .long .L_OP_REM_DOUBLE |
| .long .L_OP_ADD_INT_2ADDR |
| .long .L_OP_SUB_INT_2ADDR |
| .long .L_OP_MUL_INT_2ADDR |
| .long .L_OP_DIV_INT_2ADDR |
| .long .L_OP_REM_INT_2ADDR |
| .long .L_OP_AND_INT_2ADDR |
| .long .L_OP_OR_INT_2ADDR |
| .long .L_OP_XOR_INT_2ADDR |
| .long .L_OP_SHL_INT_2ADDR |
| .long .L_OP_SHR_INT_2ADDR |
| .long .L_OP_USHR_INT_2ADDR |
| .long .L_OP_ADD_LONG_2ADDR |
| .long .L_OP_SUB_LONG_2ADDR |
| .long .L_OP_MUL_LONG_2ADDR |
| .long .L_OP_DIV_LONG_2ADDR |
| .long .L_OP_REM_LONG_2ADDR |
| .long .L_OP_AND_LONG_2ADDR |
| .long .L_OP_OR_LONG_2ADDR |
| .long .L_OP_XOR_LONG_2ADDR |
| .long .L_OP_SHL_LONG_2ADDR |
| .long .L_OP_SHR_LONG_2ADDR |
| .long .L_OP_USHR_LONG_2ADDR |
| .long .L_OP_ADD_FLOAT_2ADDR |
| .long .L_OP_SUB_FLOAT_2ADDR |
| .long .L_OP_MUL_FLOAT_2ADDR |
| .long .L_OP_DIV_FLOAT_2ADDR |
| .long .L_OP_REM_FLOAT_2ADDR |
| .long .L_OP_ADD_DOUBLE_2ADDR |
| .long .L_OP_SUB_DOUBLE_2ADDR |
| .long .L_OP_MUL_DOUBLE_2ADDR |
| .long .L_OP_DIV_DOUBLE_2ADDR |
| .long .L_OP_REM_DOUBLE_2ADDR |
| .long .L_OP_ADD_INT_LIT16 |
| .long .L_OP_RSUB_INT |
| .long .L_OP_MUL_INT_LIT16 |
| .long .L_OP_DIV_INT_LIT16 |
| .long .L_OP_REM_INT_LIT16 |
| .long .L_OP_AND_INT_LIT16 |
| .long .L_OP_OR_INT_LIT16 |
| .long .L_OP_XOR_INT_LIT16 |
| .long .L_OP_ADD_INT_LIT8 |
| .long .L_OP_RSUB_INT_LIT8 |
| .long .L_OP_MUL_INT_LIT8 |
| .long .L_OP_DIV_INT_LIT8 |
| .long .L_OP_REM_INT_LIT8 |
| .long .L_OP_AND_INT_LIT8 |
| .long .L_OP_OR_INT_LIT8 |
| .long .L_OP_XOR_INT_LIT8 |
| .long .L_OP_SHL_INT_LIT8 |
| .long .L_OP_SHR_INT_LIT8 |
| .long .L_OP_USHR_INT_LIT8 |
| .long .L_OP_UNUSED_E3 |
| .long .L_OP_UNUSED_E4 |
| .long .L_OP_UNUSED_E5 |
| .long .L_OP_UNUSED_E6 |
| .long .L_OP_UNUSED_E7 |
| .long .L_OP_IGET_WIDE_VOLATILE |
| .long .L_OP_IPUT_WIDE_VOLATILE |
| .long .L_OP_SGET_WIDE_VOLATILE |
| .long .L_OP_SPUT_WIDE_VOLATILE |
| .long .L_OP_BREAKPOINT |
| .long .L_OP_THROW_VERIFICATION_ERROR |
| .long .L_OP_EXECUTE_INLINE |
| .long .L_OP_EXECUTE_INLINE_RANGE |
| .long .L_OP_INVOKE_DIRECT_EMPTY |
| .long .L_OP_UNUSED_F1 |
| .long .L_OP_IGET_QUICK |
| .long .L_OP_IGET_WIDE_QUICK |
| .long .L_OP_IGET_OBJECT_QUICK |
| .long .L_OP_IPUT_QUICK |
| .long .L_OP_IPUT_WIDE_QUICK |
| .long .L_OP_IPUT_OBJECT_QUICK |
| .long .L_OP_INVOKE_VIRTUAL_QUICK |
| .long .L_OP_INVOKE_VIRTUAL_QUICK_RANGE |
| .long .L_OP_INVOKE_SUPER_QUICK |
| .long .L_OP_INVOKE_SUPER_QUICK_RANGE |
| .long .L_OP_UNUSED_FC |
| .long .L_OP_UNUSED_FD |
| .long .L_OP_UNUSED_FE |
| .long .L_OP_DISPATCH_FF |
| |
| /* File: x86-atom/footer.S */ |
| /* Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* |
| * File: footer.S |
| */ |
| |
| .text |
| .align 2 |
| |
| /* |
| * Check to see if the thread needs to be suspended or debugger/profiler |
| * activity has begun. |
| * |
| * On entry: |
| * %ecx is reentry type, e.g. kInterpEntryInstr |
| * %edx is PC adjustment in bytes |
| */ |
| |
| common_periodicChecks: |
| movl %edx, -8(%esp) # save pc adjustments |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl %ebx, -4(%esp) # save %ebx to the stack |
| movl offGlue_pSelfSuspendCount(%edx), %ebx # %ebx<- pSuspendCount (int) |
| #if defined(WITH_DEBUGGER) |
| movl offGlue_pDebuggerActive(%edx), %eax # %eax<- pDebuggerActive |
| movl (%eax), %eax # %eax<- get debuggerActive (boolean) |
| and $7, %eax # %eax<- mask for boolean (just how many bits does it take?) |
| #endif |
| cmp $0, (%ebx) # check if suspend is pending |
| jne 2f # handle suspend |
| #if defined(WITH_DEBUGGER) || defined(WITH_PROFILER) |
| #if defined(WITH_PROFILER) |
| movl offGlue_pActiveProfilers(%edx), %ebx # %ebx<- activeProfilers (int) |
| or (%ebx), %eax # %eax<- merge activeProfilers and debuggerActive |
| #else |
| cmp $0, %eax # check for debuggerActive |
| #endif |
| jne 3f # debugger or profiler active; switch interp |
| #endif |
| movl -8(%esp), %edx # %edx<- restore %edx |
| movl -4(%esp), %ebx # %ebx<- restore %ebx |
| ret # return |
| 2: # check suspended |
| movl offGlue_self(%edx), %eax # %eax<- glue->self |
| movl %eax, -12(%esp) # push parameter boolean |
| lea -12(%esp), %esp |
| call dvmCheckSuspendPending # call: (Thread* self) |
| # return: bool |
| movl 4(%esp), %edx # %edx<- restore %edx |
| movl 8(%esp), %ebx # %ebx<- restore %ebx |
| lea 12(%esp), %esp |
| ret # return |
| 3: # debugger/profiler enabled, bail out |
| add -8(%esp), rPC # rPC<- pc adjustments |
| movl %ecx, offGlue_entryPoint(%edx) # glue->entryPoint<- reentry type |
| movl $1, %edx # switch to interp == true |
| jmp common_gotoBail # bail |
| |
| /* |
| * Check to see if the thread needs to be suspended or debugger/profiler |
| * activity has begun. With this variant, the reentry type is hard coded |
| * as kInterpEntryInstr. |
| * |
| * On entry: |
| * %edx is PC adjustment in bytes |
| */ |
| |
| common_periodicChecks2: |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_pSelfSuspendCount(%ecx), rINST # %ebx<- pSuspendCount (int) |
| #if defined(WITH_DEBUGGER) |
| movl offGlue_pDebuggerActive(%ecx), %eax # %eax<- pDebuggerActive |
| movl (%eax), %eax # %eax<- get debuggerActive (boolean) |
| and $7, %eax # %eax<- mask for boolean (just how many bits does it take?) |
| #endif |
| cmp $0, (rINST) # check if suspend is pending |
| jne 2f # handle suspend |
| #if defined(WITH_DEBUGGER) || defined(WITH_PROFILER) |
| #if defined(WITH_PROFILER) |
| movl offGlue_pActiveProfilers(%ecx), rINST # %edx<- activeProfilers (int) |
| or (rINST), %eax # %eax<- merge activeProfilers and debuggerActive |
| #else |
| cmp $0, %eax # check for debuggerActive |
| #endif |
| jne 3f # debugger or profiler active; switch interp |
| #endif |
| FINISH_RB %edx, %ecx # jump to next instruction |
| 2: # check suspended |
| movl offGlue_self(%ecx), %eax# %eax<- glue->self |
| movl %edx, rINST |
| movl %eax, -12(%esp) # push parameter boolean |
| lea -12(%esp), %esp |
| call dvmCheckSuspendPending # call: (Thread* self) |
| # return: bool |
| movl rINST, %edx # %edx<- restore %edx |
| lea 12(%esp), %esp |
| FINISH_RB %edx, %ecx # jump to next instruction |
| |
| 3: # debugger/profiler enabled, bail out |
| add -8(%esp), rPC # rPC<- pc adjustments |
| movl $kInterpEntryInstr, offGlue_entryPoint(%ecx) # glue->entryPoint<- reentry type |
| movl $1, %edx # switch to interp<- true |
| jmp common_gotoBail # bail |
| |
| |
| /* |
| * The equivalent of "goto bail", this calls through the "bail handler". |
| * State registers will be saved to the "glue" area before bailing. |
| * |
| * On entry: |
| * %edx is "bool changeInterp", indicating if we want to switch to the |
| * other interpreter or just bail all the way out |
| */ |
| |
| common_gotoBail: |
| SAVE_PC_FP_TO_GLUE %ecx # save program counter and frame pointer |
| |
| /* |
| * Inlined dvmMterpStdBail |
| */ |
| |
| lea 40(%ebp), %esp |
| movl %edx, %eax |
| movl 24(%ebp), %edi |
| movl 28(%ebp), %esi |
| movl 32(%ebp), %ebx |
| movl 36(%ebp), %ebp |
| ret |
| |
| /* |
| * Common code for method invocation with range. |
| * |
| * On entry: |
| * %ecx is "Method* methodToCall", the method we're trying to call |
| */ |
| |
| common_invokeMethodRange: |
| .LinvokeNewRange: |
| |
| /* |
| * prepare to copy args to "outs" area of current frame |
| */ |
| |
| SAVEAREA_FROM_FP %eax # %eax<- &outs; &StackSaveArea |
| test rINST, rINST # test for no args |
| movl rINST, sReg0 # sReg0<- AA |
| jz .LinvokeArgsDone # no args; jump to args done |
| FETCH 2, %edx # %edx<- CCCC |
| |
| /* |
| * %ecx=methodToCall, %edx=CCCC, sReg0=count, %eax=&outs (&stackSaveArea) |
| * (very few methods have > 10 args; could unroll for common cases) |
| */ |
| |
| movl %ebx, sReg1 # sReg1<- save %ebx |
| lea (rFP, %edx, 4), %edx # %edx<- &vCCCC |
| shll $2, sReg0 # sReg0<- offset |
| subl sReg0, %eax # %eax<- update &outs |
| shrl $2, sReg0 # sReg0<- offset |
| 1: |
| movl (%edx), %ebx # %ebx<- vCCCC |
| lea 4(%edx), %edx # %edx<- &vCCCC++ |
| subl $1, sReg0 # sReg<- sReg-- |
| movl %ebx, (%eax) # *outs<- vCCCC |
| lea 4(%eax), %eax # outs++ |
| jne 1b # loop if count (sReg0) not zero |
| movl sReg1, %ebx # %ebx<- restore %ebx |
| jmp .LinvokeArgsDone # continue |
| |
| /* |
| * %ecx is "Method* methodToCall", the method we're trying to call |
| * prepare to copy args to "outs" area of current frame |
| */ |
| |
| common_invokeMethodNoRange: |
| .LinvokeNewNoRange: |
| movl rINST, sReg0 # sReg0<- BA |
| shrl $4, sReg0 # sReg0<- B |
| je .LinvokeArgsDone # no args; jump to args done |
| SAVEAREA_FROM_FP %eax # %eax<- &outs; &StackSaveArea |
| FETCH 2, %edx # %edx<- GFED |
| |
| /* |
| * %ecx=methodToCall, %edx=GFED, sReg0=count, %eax=outs |
| */ |
| |
| .LinvokeNonRange: |
| cmp $2, sReg0 # compare sReg0 to 2 |
| movl %edx, sReg1 # sReg1<- GFED |
| jl 1f # handle 1 arg |
| je 2f # handle 2 args |
| cmp $4, sReg0 # compare sReg0 to 4 |
| jl 3f # handle 3 args |
| je 4f # handle 4 args |
| 5: |
| andl $15, rINST # rINST<- A |
| lea -4(%eax), %eax # %eax<- update &outs; &outs-- |
| movl (rFP, rINST, 4), %edx # %edx<- vA |
| movl %edx, (%eax) # *outs<- vA |
| movl sReg1, %edx # %edx<- GFED |
| 4: |
| shr $12, %edx # %edx<- G |
| lea -4(%eax), %eax # %eax<- update &outs; &outs-- |
| movl (rFP, %edx, 4), %edx # %edx<- vG |
| movl %edx, (%eax) # *outs<- vG |
| movl sReg1, %edx # %edx<- GFED |
| 3: |
| and $0x0f00, %edx # %edx<- 0F00 |
| shr $6, %edx # %edx<- F at correct offset |
| lea -4(%eax), %eax # %eax<- update &outs; &outs-- |
| movl (rFP, %edx), %edx # %edx<- vF |
| movl %edx, (%eax) # *outs<- vF |
| movl sReg1, %edx # %edx<- GFED |
| 2: |
| and $0x00f0, %edx # %edx<- 00E0 |
| shr $2, %edx # %edx<- E at correct offset |
| lea -4(%eax), %eax # %eax<- update &outs; &outs-- |
| movl (rFP, %edx), %edx # %edx<- vE |
| movl %edx, (%eax) # *outs<- vE |
| movl sReg1, %edx # %edx<- GFED |
| 1: |
| and $0x000f, %edx # %edx<- 000D |
| movl (rFP, %edx, 4), %edx # %edx<- vD |
| movl %edx, -4(%eax) # *--outs<- vD |
| 0: |
| |
| /* |
| * %ecx is "Method* methodToCall", the method we're trying to call |
| * find space for the new stack frame, check for overflow |
| */ |
| |
| .LinvokeArgsDone: |
| movzwl offMethod_registersSize(%ecx), %eax # %eax<- methodToCall->regsSize |
| movzwl offMethod_outsSize(%ecx), %edx # %edx<- methodToCall->outsSize |
| movl %ecx, sReg0 # sReg<- methodToCall |
| shl $2, %eax # %eax<- update offset |
| SAVEAREA_FROM_FP %ecx # %ecx<- &outs; &StackSaveArea |
| subl %eax, %ecx # %ecx<- newFP; (old savearea - regsSize) |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl %ecx, sReg1 # sReg1<- &outs |
| subl $sizeofStackSaveArea, %ecx # %ecx<- newSaveArea (stack save area using newFP) |
| movl offGlue_interpStackEnd(%eax), %eax # %eax<- glue->interpStackEnd |
| movl %eax, sReg2 # sReg2<- glue->interpStackEnd |
| shl $2, %edx # %edx<- update offset for outsSize |
| movl %ecx, %eax # %eax<- newSaveArea |
| sub %edx, %ecx # %ecx<- bottom; (newSaveArea - outsSize) |
| cmp sReg2, %ecx # compare interpStackEnd and bottom |
| movl sReg0, %ecx # %ecx<- restore methodToCall |
| jl .LstackOverflow # handle frame overflow |
| |
| /* |
| * set up newSaveArea |
| */ |
| |
| #ifdef EASY_GDB |
| SAVEAREA_FROM_FP %edx # %edx<- &outs; &StackSaveArea |
| movl %edx, offStackSaveArea_prevSave(%eax) # newSaveArea->prevSave<- &outs |
| #endif |
| movl rFP, offStackSaveArea_prevFrame(%eax) # newSaveArea->prevFrame<- rFP |
| movl rPC, offStackSaveArea_savedPc(%eax) # newSaveArea->savedPc<- rPC |
| testl $ACC_NATIVE, offMethod_accessFlags(%ecx) # check for native call |
| movl %ecx, offStackSaveArea_method(%eax) # newSaveArea->method<- method to call |
| jne .LinvokeNative # handle native call |
| |
| /* |
| * Update "glue" values for the new method |
| * %ecx=methodToCall, sReg1=newFp |
| */ |
| |
| movl offMethod_clazz(%ecx), %edx # %edx<- method->clazz |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl %ecx, offGlue_method(%eax) # glue->method<- methodToCall |
| movl offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex |
| movl offMethod_insns(%ecx), rPC # rPC<- methodToCall->insns |
| movl %edx, offGlue_methodClassDex(%eax) # glue->methodClassDex<- method->clazz->pDvmDex |
| movl offGlue_self(%eax), %ecx # %ecx<- glue->self |
| movl sReg1, rFP # rFP<- newFP |
| movl rFP, offThread_curFrame(%ecx) # glue->self->curFrame<- newFP |
| FINISH_A # jump to methodToCall->insns |
| |
| /* |
| * Prep for the native call |
| * %ecx=methodToCall, sReg1=newFP, %eax=newSaveArea |
| */ |
| |
| .LinvokeNative: |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl %ecx, -20(%esp) # push parameter methodToCall |
| movl offGlue_self(%edx), %edx # %edx<- glue->self |
| movl offThread_jniLocal_topCookie(%edx), %ecx # %ecx<- glue->self->thread->refNext |
| movl %ecx, offStackSaveArea_localRefCookie(%eax) # newSaveArea->localRefCookie<- refNext |
| movl %eax, -4(%esp) # save newSaveArea |
| movl sReg1, %eax # %eax<- newFP |
| movl %eax, offThread_curFrame(%edx) # glue->self->curFrame<- newFP |
| movl %edx, -8(%esp) # save glue->self |
| movl %edx, -16(%esp) # push parameter glue->self |
| movl rGLUE, %edx # %edx<- pMterpGlue |
| movl -20(%esp), %ecx # %ecx<- methodToCall |
| lea offGlue_retval(%edx), %edx # %edx<- &retval |
| movl %edx, -24(%esp) # push parameter pMterpGlue |
| movl %eax, -28(%esp) # push parameter newFP |
| lea -28(%esp), %esp |
| |
| #ifdef ASSIST_DEBUGGER |
| jmp .Lskip |
| .type dalvik_mterp, %function |
| dalvik_mterp: |
| MTERP_ENTRY |
| .Lskip: |
| #endif |
| call *offMethod_nativeFunc(%ecx) # call methodToCall->nativeFunc |
| lea 28(%esp), %esp |
| movl -4(%esp), %edx # %edx<- newSaveArea |
| movl -8(%esp), %ecx # %ecx<- glue->self |
| movl offStackSaveArea_localRefCookie(%edx), %eax # %eax<- newSaveArea->localRefCookie |
| FFETCH_ADV 3, %edx # %edx<- next instruction hi; fetch, advance |
| cmp $0, offThread_exception(%ecx) # check for exception |
| movl rFP, offThread_curFrame(%ecx) # glue->self->curFrame<- rFP |
| movl %eax, offThread_jniLocal_topCookie(%ecx) # glue->self<- newSaveArea->localRefCookie |
| jne common_exceptionThrown # handle exception |
| FGETOP_JMP 3, %edx # jump to next instruction; getop, jmp |
| |
| .LstackOverflow: # %ecx=methodToCall |
| movl %ecx, -4(%esp) # push parameter method to call |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offGlue_self(%ecx), %ecx # %ecx<- glue->self |
| movl %ecx, -8(%esp) # push parameter self |
| lea -8(%esp), %esp |
| call dvmHandleStackOverflow # call: (Thread* self, Method* method) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| #ifdef ASSIST_DEBUGGER |
| #endif |
| |
| /* |
| * Common code for handling a return instruction. |
| * |
| * This does not return. |
| */ |
| |
| common_returnFromMethod: |
| .LreturnNew: |
| |
| /* |
| * Inline common periodic checks |
| */ |
| |
| movl rGLUE, rINST # %ecx<- pMterpGlue |
| movl offGlue_pSelfSuspendCount(rINST), %edx # %ebx<- pSuspendCount (int) |
| #if defined(WITH_DEBUGGER) |
| movl offGlue_pDebuggerActive(rINST), %eax # %eax<- pDebuggerActive |
| movl (%eax), %eax # %eax<- get debuggerActive (boolean) |
| and $7, %eax # %eax<- mask for boolean (just how many bits does it take?) |
| #endif |
| cmp $0, (%edx) # check if suspend is pending |
| jne 2f # handle suspend |
| #if defined(WITH_DEBUGGER) || defined(WITH_PROFILER) |
| #if defined(WITH_PROFILER) |
| movl offGlue_pActiveProfilers(rINST), %edx # %edx<- activeProfilers (int) |
| or (%edx), %eax # %eax<- merge activeProfilers and debuggerActive |
| #else |
| cmp $0, %eax # check for debuggerActive |
| #endif |
| jne 3f # debugger or profiler active; switch interp |
| #endif |
| jmp 4f |
| 2: # check suspended |
| movl offGlue_self(rINST), %eax# %eax<- glue->self |
| movl %eax, -12(%esp) # push parameter boolean |
| lea -12(%esp), %esp |
| call dvmCheckSuspendPending # call: (Thread* self) |
| # return: bool |
| lea 12(%esp), %esp |
| jmp 4f |
| 3: # debugger/profiler enabled, bail out |
| movl $kInterpEntryInstr, offGlue_entryPoint(rINST) # glue->entryPoint<- reentry type |
| movl $1, %edx # switch to interp<- true |
| jmp common_gotoBail # bail |
| |
| |
| /* |
| * Get save area; rGLUE is %ebx, rFP is %eax |
| */ |
| 4: |
| SAVEAREA_FROM_FP %ecx # %ecx<- saveArea(old) |
| movl offStackSaveArea_prevFrame(%ecx), rFP # rFP<- saveArea->PrevFrame |
| movl (offStackSaveArea_method - sizeofStackSaveArea)(rFP), %edx # %edx<- method we are returning to |
| cmpl $0, %edx # check for break frame |
| je common_gotoBail # bail if break frame |
| movl offStackSaveArea_savedPc(%ecx), rPC # rPC<- saveAreaOld->savedPc |
| movl offGlue_self(rINST), %ecx # %eax<- glue->self |
| movl %edx, offGlue_method(rINST) # glue->method<- newSave->method |
| movl offMethod_clazz(%edx), %edx # %edx<- method->clazz |
| FFETCH_ADV 3, %eax # %ecx<- next instruction hi; fetch, advance |
| movl rFP, offThread_curFrame(%ecx) # glue->self->curFrame<- rFP |
| movl offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex |
| movl %edx, offGlue_methodClassDex(rINST) # glue->pDvmDex<- method->clazz->pDvmDex |
| FGETOP_JMP 3, %eax # jump to next instruction; getop, jmp |
| |
| /* |
| * Handle thrown an exception. If the exception processing code |
| * returns to us (instead of falling out of the interpreter), |
| * continue with whatever the next instruction now happens to be. |
| * This does not return. |
| */ |
| |
| common_exceptionThrown: |
| .LexceptionNew: |
| movl $kInterpEntryThrow, %ecx # %ecx<- reentry type |
| movl $0, %edx # %edx<- pc adjustment |
| call common_periodicChecks |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_self(%eax), %edx # %edx<- glue->self |
| movl offThread_exception(%edx), %ecx # %ecx<- pMterpGlue->self->exception |
| movl %edx, -4(%esp) # push parameter self |
| movl %ecx, -8(%esp) # push parameter obj |
| lea -8(%esp), %esp |
| call dvmAddTrackedAlloc # don't allow the exception to be GC'd |
| # call: (Object* obj, Thread* self) |
| # return: void |
| movl 4(%esp), %edx # %edx<- glue->self |
| movl $0, offThread_exception(%edx) # glue->self->exception<- NULL |
| |
| /* |
| * set up args and a local for &fp |
| */ |
| |
| movl rFP, -4(%esp) # move fp to stack |
| lea -4(%esp), %esp # update %esp |
| movl %esp, -4(%esp) # push parameter 4<- &fp |
| movl $0, -8(%esp) # push parameter 3<- false |
| movl 4(%esp), %edx |
| movl %edx, -12(%esp) # push parameter 2<- glue->self->exception |
| movl rGLUE, %eax # %eax<- pMterpGlue |
| movl offGlue_method(%eax), %edx # %edx<- glue->method |
| movl offMethod_insns(%edx), %edx # %edx<- glue->method->insns |
| movl rPC, %ecx # %ecx<- rPC |
| subl %edx, %ecx # %ecx<- pc - glue->method->insns |
| sar $1, %ecx # %ecx<- adjust %ecx for offset |
| movl %ecx, -16(%esp) # push parameter 1<- glue->method->insns |
| movl 8(%esp), %edx |
| movl %edx, -20(%esp) # push parameter 0<- glue->self |
| lea -20(%esp), %esp |
| |
| /* |
| * call dvmFindCatchBlock, %eax gets catchRelPc (a code-unit offset) |
| */ |
| |
| call dvmFindCatchBlock # call: (Thread* self, int relPc, Object* exception, |
| # bool doUnroll, void** newFrame) |
| # return: int |
| lea 32(%esp), %esp |
| movl -12(%esp), rFP # rFP<- updated rFP |
| cmp $0, %eax # check for catchRelPc < 0 |
| jl .LnotCaughtLocally # handle not caught locally |
| |
| /* |
| * fix stack overflow if necessary |
| */ |
| |
| movl -4(%esp), %ecx # %ecx<- glue->self |
| cmp $0, offThread_stackOverflowed(%ecx) |
| je 1f |
| movl %eax, -4(%esp) # save %eax for later |
| movl %ecx, -12(%esp) # push parameter 2 glue->self |
| lea -12(%esp), %esp |
| call dvmCleanupStackOverflow # call: (Thread* self, Object* exception) |
| # return: void |
| lea 12(%esp), %esp |
| movl -4(%esp), %eax # %eax<- restore %eax |
| jmp 2f |
| 1: |
| movl %ecx, -12(%esp) # push parameter 2 glue->self |
| 2: |
| |
| /* |
| * adjust locals to match self->curFrame and updated PC |
| * |
| */ |
| |
| SAVEAREA_FROM_FP %edx # %edx<- get newSaveArea |
| movl rGLUE, %ecx # %ecx<- pMterpGlue |
| movl offStackSaveArea_method(%edx), rPC # rPC<- newMethod |
| movl rPC, offGlue_method(%ecx) # glue->method<- newMethod |
| movl offMethod_clazz(rPC), %edx # %edx<- method->clazz |
| movl offMethod_insns(rPC), rPC # rPC<- method->insns |
| movl offClassObject_pDvmDex(%edx), %edx # %edx<- method->clazz->pDvmDex |
| lea (rPC, %eax, 2), rPC # rPC<- method->insns + catchRelPc |
| movl %edx, offGlue_methodClassDex(%ecx) # glue->pDvmDex<- method->clazz->pDvmDex |
| movl -8(%esp), %eax |
| movl %eax, -16(%esp) # push parameter 1 obj |
| lea -16(%esp), %esp |
| call dvmReleaseTrackedAlloc # call: (Object* obj, Thread* self) |
| # return: void |
| lea 16(%esp), %esp |
| FINISH_FETCH %eax |
| cmp $OP_MOVE_EXCEPTION, %eax # is it a move exception |
| jne 1f |
| movl -12(%esp), %edx # %edx<- glue->self |
| movl -8(%esp), %ecx # %ecx<- exception |
| movl %ecx, offThread_exception(%edx) # restore the exception |
| 1: |
| FINISH_JMP %eax |
| |
| /* |
| * -8(%esp) = exception, -4(%esp) = self |
| */ |
| |
| .LnotCaughtLocally: |
| movl -4(%esp), %edx # %edx<- glue->self |
| movzb offThread_stackOverflowed(%edx), %eax # %eax<- self->stackOverflowed |
| cmp $0, %eax # check for stack overflow; |
| # maybe should use cmpb |
| je 1f # |
| movl %edx, -12(%esp) # push parameter 1 glue->self |
| lea -12(%esp), %esp |
| call dvmCleanupStackOverflow # call: (Thread* self, Object* exception) |
| # return: void |
| lea 12(%esp), %esp |
| |
| /* |
| * Release the exception |
| * -8(%esp) = exception, -4(%esp) = self |
| */ |
| 1: |
| movl -8(%esp), %ecx # %ecx<- exception |
| movl -4(%esp), %edx # %edx<- glue->self |
| movl %ecx, offThread_exception(%edx) # glue->self<- exception |
| lea -8(%esp), %esp |
| call dvmReleaseTrackedAlloc # call: (Object* obj, Thread* self) |
| # return: void |
| lea 8(%esp), %esp |
| movl $0, %edx # switch to interp<- false |
| jmp common_gotoBail # bail |
| |
| /* |
| * After returning from a "glued" function, pull out the updated |
| * values and start executing at the next instruction. |
| */ |
| |
| common_resumeAfterGlueCall: |
| LOAD_PC_FP_FROM_GLUE # pull rPC and rFP out of glue |
| FINISH_A # jump to next instruction |
| |
| /* |
| * For debugging, cause an immediate fault. |
| */ |
| |
| common_abort: |
| jmp .LdeadFood |
| |
| .LdeadFood: |
| .word 0xdeadf00d |
| |
| /* |
| * Invalid array index. |
| */ |
| |
| common_errArrayIndex: |
| EXPORT_PC |
| movl $.LstrArrayIndexException, -8(%esp) # push parameter description |
| movl $0, -4(%esp) # push parameter msg paramter |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * Invalid array value. |
| */ |
| |
| common_errArrayStore: |
| EXPORT_PC |
| movl $.LstrArrayStoreException, -8(%esp) # push parameter description |
| movl $0, -4(%esp) # push parameter msg paramter |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * Integer divide or mod by zero. |
| */ |
| |
| common_errDivideByZero: |
| EXPORT_PC |
| movl $.LstrArithmeticException, -8(%esp) # push parameter description |
| movl $.LstrDivideByZero, -4(%esp) # push parameter msg paramter |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * Attempt to allocate an array with a negative size. |
| */ |
| |
| common_errNegativeArraySize: |
| EXPORT_PC |
| movl $.LstrNegativeArraySizeException, -8(%esp) # push parameter description |
| movl $0, -4(%esp) # push parameter msg paramter |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * Invocation of a non-existent method. |
| */ |
| |
| common_errNoSuchMethod: |
| EXPORT_PC |
| movl $.LstrNoSuchMethodError, -8(%esp) # push parameter description |
| movl $0, -4(%esp) # push parameter msg paramter |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * Unexpected null object. |
| */ |
| |
| common_errNullObject: |
| EXPORT_PC |
| movl $.LstrNullPointerException, -8(%esp) # push parameter description |
| movl $0, -4(%esp) # push parameter msg paramter |
| lea -8(%esp), %esp |
| call dvmThrowException # call: (const char* exceptionDescriptor, const char* msg) |
| # return: void |
| lea 8(%esp), %esp |
| jmp common_exceptionThrown # handle exception |
| |
| /* |
| * String references |
| */ |
| |
| .align 4 |
| .section .rodata |
| .LstrArithmeticException: |
| .asciz "Ljava/lang/ArithmeticException;" |
| .LstrArrayIndexException: |
| .asciz "Ljava/lang/ArrayIndexOutOfBoundsException;" |
| .LstrArrayStoreException: |
| .asciz "Ljava/lang/ArrayStoreException;" |
| .LstrClassCastException: |
| .asciz "Ljava/lang/ClassCastException;" |
| .LstrDivideByZero: |
| .asciz "divide by zero" |
| .LstrInstantiationError: |
| .asciz "Ljava/lang/InstantiationError;" |
| .LstrNegativeArraySizeException: |
| .asciz "Ljava/lang/NegativeArraySizeException;" |
| .LstrNoSuchMethodError: |
| .asciz "Ljava/lang/NoSuchMethodError;" |
| .LstrNullPointerException: |
| .asciz "Ljava/lang/NullPointerException;" |
| .LstrExceptionNotCaughtLocally: |
| .asciz "Exception %s from %s:%d not caught locally\n" |
| |