diff options
Diffstat (limited to 'vm/mterp/out/InterpAsm-armv7-a-neon.S')
-rw-r--r-- | vm/mterp/out/InterpAsm-armv7-a-neon.S | 411 |
1 files changed, 376 insertions, 35 deletions
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S index 3ac09aaf2..a7f7eb0e1 100644 --- a/vm/mterp/out/InterpAsm-armv7-a-neon.S +++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S @@ -20,6 +20,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + /* * ARMv5 definitions and declarations. */ @@ -205,7 +206,7 @@ unspecified registers or condition codes. #include "../common/jit-config.h" #endif -/* File: armv5te/platform.S */ +/* File: armv7-a/platform.S */ /* * =========================================================================== * CPU-version-specific defines @@ -242,6 +243,24 @@ unspecified registers or condition codes. ldmfd sp!, {\regs,pc} .endm +#if !defined(ANDROID_SMP) +# error "Must define ANDROID_SMP" +#endif + +/* + * Macro for data memory barrier; not meaningful pre-ARMv6K. + * If the argument is nonzero, emit barrier; otherwise, emit nothing. + */ +.macro SMP_DMB gen +#if ANDROID_SMP != 0 + .if \gen + dmb + .endif +#else + /* not SMP */ +#endif +.endm + /* File: armv5te/entry.S */ /* * Copyright (C) 2008 The Android Open Source Project @@ -2777,6 +2796,7 @@ dalvik_inst: beq .LOP_SGET_resolve @ yes, do resolve .LOP_SGET_finish: @ field ptr in r0 ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- AA FETCH_ADVANCE_INST(2) @ advance rPC, load rINST SET_VREG(r1, r2) @ fp[AA]<- r1 @@ -2830,6 +2850,7 @@ dalvik_inst: beq .LOP_SGET_OBJECT_resolve @ yes, do resolve .LOP_SGET_OBJECT_finish: @ field ptr in r0 ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- AA FETCH_ADVANCE_INST(2) @ advance rPC, load rINST SET_VREG(r1, r2) @ fp[AA]<- r1 @@ -2856,6 +2877,7 @@ dalvik_inst: beq .LOP_SGET_BOOLEAN_resolve @ yes, do resolve .LOP_SGET_BOOLEAN_finish: @ field ptr in r0 ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- AA FETCH_ADVANCE_INST(2) @ advance rPC, load rINST SET_VREG(r1, r2) @ fp[AA]<- r1 @@ -2882,6 +2904,7 @@ dalvik_inst: beq .LOP_SGET_BYTE_resolve @ yes, do resolve .LOP_SGET_BYTE_finish: @ field ptr in r0 ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- AA FETCH_ADVANCE_INST(2) @ advance rPC, load rINST SET_VREG(r1, r2) @ fp[AA]<- r1 @@ -2908,6 +2931,7 @@ dalvik_inst: beq .LOP_SGET_CHAR_resolve @ yes, do resolve .LOP_SGET_CHAR_finish: @ field ptr in r0 ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- AA FETCH_ADVANCE_INST(2) @ advance rPC, load rINST SET_VREG(r1, r2) @ fp[AA]<- r1 @@ -2934,6 +2958,7 @@ dalvik_inst: beq .LOP_SGET_SHORT_resolve @ yes, do resolve .LOP_SGET_SHORT_finish: @ field ptr in r0 ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- AA FETCH_ADVANCE_INST(2) @ advance rPC, load rINST SET_VREG(r1, r2) @ fp[AA]<- r1 @@ -2962,6 +2987,7 @@ dalvik_inst: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_VREG(r1, r2) @ r1<- fp[AA] GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r1, [r0, #offStaticField_value] @ field<- vAA GOTO_OPCODE(ip) @ jump to next instruction @@ -3015,6 +3041,7 @@ dalvik_inst: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_VREG(r1, r2) @ r1<- fp[AA] GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r1, [r0, #offStaticField_value] @ field<- vAA GOTO_OPCODE(ip) @ jump to next instruction @@ -3041,6 +3068,7 @@ dalvik_inst: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_VREG(r1, r2) @ r1<- fp[AA] GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r1, [r0, #offStaticField_value] @ field<- vAA GOTO_OPCODE(ip) @ jump to next instruction @@ -3067,6 +3095,7 @@ dalvik_inst: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_VREG(r1, r2) @ r1<- fp[AA] GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r1, [r0, #offStaticField_value] @ field<- vAA GOTO_OPCODE(ip) @ jump to next instruction @@ -3093,6 +3122,7 @@ dalvik_inst: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_VREG(r1, r2) @ r1<- fp[AA] GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r1, [r0, #offStaticField_value] @ field<- vAA GOTO_OPCODE(ip) @ jump to next instruction @@ -3119,6 +3149,7 @@ dalvik_inst: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_VREG(r1, r2) @ r1<- fp[AA] GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r1, [r0, #offStaticField_value] @ field<- vAA GOTO_OPCODE(ip) @ jump to next instruction @@ -7026,42 +7057,140 @@ dalvik_inst: /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_E3: /* 0xe3 */ -/* File: armv5te/OP_UNUSED_E3.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_IGET_VOLATILE: /* 0xe3 */ +/* File: armv5te/OP_IGET_VOLATILE.S */ +/* File: armv5te/OP_IGET.S */ + /* + * General 32-bit instance field get. + * + * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short + */ + /* op vA, vB, field@CCCC */ + mov r0, rINST, lsr #12 @ r0<- B + ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex + FETCH(r1, 1) @ r1<- field ref CCCC + ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields + GET_VREG(r9, r0) @ r9<- fp[B], the object pointer + ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr + cmp r0, #0 @ is resolved entry null? + bne .LOP_IGET_VOLATILE_finish @ no, already resolved +8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveInstField @ r0<- resolved InstField ptr + cmp r0, #0 + bne .LOP_IGET_VOLATILE_finish + b common_exceptionThrown /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_E4: /* 0xe4 */ -/* File: armv5te/OP_UNUSED_E4.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_IPUT_VOLATILE: /* 0xe4 */ +/* File: armv5te/OP_IPUT_VOLATILE.S */ +/* File: armv5te/OP_IPUT.S */ + /* + * General 32-bit instance field put. + * + * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short + */ + /* op vA, vB, field@CCCC */ + mov r0, rINST, lsr #12 @ r0<- B + ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex + FETCH(r1, 1) @ r1<- field ref CCCC + ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields + GET_VREG(r9, r0) @ r9<- fp[B], the object pointer + ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr + cmp r0, #0 @ is resolved entry null? + bne .LOP_IPUT_VOLATILE_finish @ no, already resolved +8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveInstField @ r0<- resolved InstField ptr + cmp r0, #0 @ success? + bne .LOP_IPUT_VOLATILE_finish @ yes, finish up + b common_exceptionThrown /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_E5: /* 0xe5 */ -/* File: armv5te/OP_UNUSED_E5.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_SGET_VOLATILE: /* 0xe5 */ +/* File: armv5te/OP_SGET_VOLATILE.S */ +/* File: armv5te/OP_SGET.S */ + /* + * General 32-bit SGET handler. + * + * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short + */ + /* op vAA, field@BBBB */ + ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex + FETCH(r1, 1) @ r1<- field ref BBBB + ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields + ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr + cmp r0, #0 @ is resolved entry null? + beq .LOP_SGET_VOLATILE_resolve @ yes, do resolve +.LOP_SGET_VOLATILE_finish: @ field ptr in r0 + ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 1 @ acquiring load + mov r2, rINST, lsr #8 @ r2<- AA + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + SET_VREG(r1, r2) @ fp[AA]<- r1 + GET_INST_OPCODE(ip) @ extract opcode from rINST + GOTO_OPCODE(ip) @ jump to next instruction /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_E6: /* 0xe6 */ -/* File: armv5te/OP_UNUSED_E6.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_SPUT_VOLATILE: /* 0xe6 */ +/* File: armv5te/OP_SPUT_VOLATILE.S */ +/* File: armv5te/OP_SPUT.S */ + /* + * General 32-bit SPUT handler. + * + * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short + */ + /* op vAA, field@BBBB */ + ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex + FETCH(r1, 1) @ r1<- field ref BBBB + ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields + ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr + cmp r0, #0 @ is resolved entry null? + beq .LOP_SPUT_VOLATILE_resolve @ yes, do resolve +.LOP_SPUT_VOLATILE_finish: @ field ptr in r0 + mov r2, rINST, lsr #8 @ r2<- AA + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + GET_VREG(r1, r2) @ r1<- fp[AA] + GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 1 @ releasing store + str r1, [r0, #offStaticField_value] @ field<- vAA + GOTO_OPCODE(ip) @ jump to next instruction /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_E7: /* 0xe7 */ -/* File: armv5te/OP_UNUSED_E7.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_IGET_OBJECT_VOLATILE: /* 0xe7 */ +/* File: armv5te/OP_IGET_OBJECT_VOLATILE.S */ +/* File: armv5te/OP_IGET.S */ + /* + * General 32-bit instance field get. + * + * for: iget, iget-object, iget-boolean, iget-byte, iget-char, iget-short + */ + /* op vA, vB, field@CCCC */ + mov r0, rINST, lsr #12 @ r0<- B + ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex + FETCH(r1, 1) @ r1<- field ref CCCC + ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields + GET_VREG(r9, r0) @ r9<- fp[B], the object pointer + ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr + cmp r0, #0 @ is resolved entry null? + bne .LOP_IGET_OBJECT_VOLATILE_finish @ no, already resolved +8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveInstField @ r0<- resolved InstField ptr + cmp r0, #0 + bne .LOP_IGET_OBJECT_VOLATILE_finish + b common_exceptionThrown /* ------------------------------ */ @@ -7500,26 +7629,84 @@ dalvik_inst: /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_FC: /* 0xfc */ -/* File: armv5te/OP_UNUSED_FC.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_IPUT_OBJECT_VOLATILE: /* 0xfc */ +/* File: armv5te/OP_IPUT_OBJECT_VOLATILE.S */ +/* File: armv5te/OP_IPUT.S */ + /* + * General 32-bit instance field put. + * + * for: iput, iput-object, iput-boolean, iput-byte, iput-char, iput-short + */ + /* op vA, vB, field@CCCC */ + mov r0, rINST, lsr #12 @ r0<- B + ldr r3, [rGLUE, #offGlue_methodClassDex] @ r3<- DvmDex + FETCH(r1, 1) @ r1<- field ref CCCC + ldr r2, [r3, #offDvmDex_pResFields] @ r2<- pDvmDex->pResFields + GET_VREG(r9, r0) @ r9<- fp[B], the object pointer + ldr r0, [r2, r1, lsl #2] @ r0<- resolved InstField ptr + cmp r0, #0 @ is resolved entry null? + bne .LOP_IPUT_OBJECT_VOLATILE_finish @ no, already resolved +8: ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveInstField @ r0<- resolved InstField ptr + cmp r0, #0 @ success? + bne .LOP_IPUT_OBJECT_VOLATILE_finish @ yes, finish up + b common_exceptionThrown /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_FD: /* 0xfd */ -/* File: armv5te/OP_UNUSED_FD.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_SGET_OBJECT_VOLATILE: /* 0xfd */ +/* File: armv5te/OP_SGET_OBJECT_VOLATILE.S */ +/* File: armv5te/OP_SGET.S */ + /* + * General 32-bit SGET handler. + * + * for: sget, sget-object, sget-boolean, sget-byte, sget-char, sget-short + */ + /* op vAA, field@BBBB */ + ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex + FETCH(r1, 1) @ r1<- field ref BBBB + ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields + ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr + cmp r0, #0 @ is resolved entry null? + beq .LOP_SGET_OBJECT_VOLATILE_resolve @ yes, do resolve +.LOP_SGET_OBJECT_VOLATILE_finish: @ field ptr in r0 + ldr r1, [r0, #offStaticField_value] @ r1<- field value + SMP_DMB 1 @ acquiring load + mov r2, rINST, lsr #8 @ r2<- AA + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + SET_VREG(r1, r2) @ fp[AA]<- r1 + GET_INST_OPCODE(ip) @ extract opcode from rINST + GOTO_OPCODE(ip) @ jump to next instruction /* ------------------------------ */ .balign 64 -.L_OP_UNUSED_FE: /* 0xfe */ -/* File: armv5te/OP_UNUSED_FE.S */ -/* File: armv5te/unused.S */ - bl common_abort +.L_OP_SPUT_OBJECT_VOLATILE: /* 0xfe */ +/* File: armv5te/OP_SPUT_OBJECT_VOLATILE.S */ +/* File: armv5te/OP_SPUT.S */ + /* + * General 32-bit SPUT handler. + * + * for: sput, sput-object, sput-boolean, sput-byte, sput-char, sput-short + */ + /* op vAA, field@BBBB */ + ldr r2, [rGLUE, #offGlue_methodClassDex] @ r2<- DvmDex + FETCH(r1, 1) @ r1<- field ref BBBB + ldr r2, [r2, #offDvmDex_pResFields] @ r2<- dvmDex->pResFields + ldr r0, [r2, r1, lsl #2] @ r0<- resolved StaticField ptr + cmp r0, #0 @ is resolved entry null? + beq .LOP_SPUT_OBJECT_VOLATILE_resolve @ yes, do resolve +.LOP_SPUT_OBJECT_VOLATILE_finish: @ field ptr in r0 + mov r2, rINST, lsr #8 @ r2<- AA + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + GET_VREG(r1, r2) @ r1<- fp[AA] + GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 1 @ releasing store + str r1, [r0, #offStaticField_value] @ field<- vAA + GOTO_OPCODE(ip) @ jump to next instruction /* ------------------------------ */ @@ -8073,6 +8260,7 @@ dvmAsmSisterStart: ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field beq common_errNullObject @ object was null ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- A+ FETCH_ADVANCE_INST(2) @ advance rPC, load rINST and r2, r2, #15 @ r2<- A @@ -8093,6 +8281,7 @@ dvmAsmSisterStart: ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field beq common_errNullObject @ object was null ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- A+ FETCH_ADVANCE_INST(2) @ advance rPC, load rINST and r2, r2, #15 @ r2<- A @@ -8113,6 +8302,7 @@ dvmAsmSisterStart: ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field beq common_errNullObject @ object was null ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- A+ FETCH_ADVANCE_INST(2) @ advance rPC, load rINST and r2, r2, #15 @ r2<- A @@ -8133,6 +8323,7 @@ dvmAsmSisterStart: ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field beq common_errNullObject @ object was null ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- A+ FETCH_ADVANCE_INST(2) @ advance rPC, load rINST and r2, r2, #15 @ r2<- A @@ -8153,6 +8344,7 @@ dvmAsmSisterStart: ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field beq common_errNullObject @ object was null ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 0 @ acquiring load mov r2, rINST, lsr #8 @ r2<- A+ FETCH_ADVANCE_INST(2) @ advance rPC, load rINST and r2, r2, #15 @ r2<- A @@ -8215,6 +8407,7 @@ dvmAsmSisterStart: beq common_errNullObject @ object was null FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 GOTO_OPCODE(ip) @ jump to next instruction @@ -8235,6 +8428,7 @@ dvmAsmSisterStart: beq common_errNullObject @ object was null FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 GOTO_OPCODE(ip) @ jump to next instruction @@ -8255,6 +8449,7 @@ dvmAsmSisterStart: beq common_errNullObject @ object was null FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 GOTO_OPCODE(ip) @ jump to next instruction @@ -8275,6 +8470,7 @@ dvmAsmSisterStart: beq common_errNullObject @ object was null FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 GOTO_OPCODE(ip) @ jump to next instruction @@ -8295,6 +8491,7 @@ dvmAsmSisterStart: beq common_errNullObject @ object was null FETCH_ADVANCE_INST(2) @ advance rPC, load rINST GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 0 @ releasing store str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 GOTO_OPCODE(ip) @ jump to next instruction @@ -8789,6 +8986,99 @@ d2l_doconv: stmia r9, {r0-r1} @ vAA/vAA+1<- r0/r1 GOTO_OPCODE(ip) @ jump to next instruction +/* continuation for OP_IGET_VOLATILE */ + + /* + * Currently: + * r0 holds resolved field + * r9 holds object + */ +.LOP_IGET_VOLATILE_finish: + @bl common_squeak0 + cmp r9, #0 @ check object for null + ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field + beq common_errNullObject @ object was null + ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 1 @ acquiring load + mov r2, rINST, lsr #8 @ r2<- A+ + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + and r2, r2, #15 @ r2<- A + GET_INST_OPCODE(ip) @ extract opcode from rINST + SET_VREG(r0, r2) @ fp[A]<- r0 + GOTO_OPCODE(ip) @ jump to next instruction + +/* continuation for OP_IPUT_VOLATILE */ + + /* + * Currently: + * r0 holds resolved field + * r9 holds object + */ +.LOP_IPUT_VOLATILE_finish: + @bl common_squeak0 + mov r1, rINST, lsr #8 @ r1<- A+ + ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field + and r1, r1, #15 @ r1<- A + cmp r9, #0 @ check object for null + GET_VREG(r0, r1) @ r0<- fp[A] + beq common_errNullObject @ object was null + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 1 @ releasing store + str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 + GOTO_OPCODE(ip) @ jump to next instruction + +/* continuation for OP_SGET_VOLATILE */ + + /* + * Continuation if the field has not yet been resolved. + * r1: BBBB field ref + */ +.LOP_SGET_VOLATILE_resolve: + ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw, so export now + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveStaticField @ r0<- resolved StaticField ptr + cmp r0, #0 @ success? + bne .LOP_SGET_VOLATILE_finish @ yes, finish + b common_exceptionThrown @ no, handle exception + +/* continuation for OP_SPUT_VOLATILE */ + + /* + * Continuation if the field has not yet been resolved. + * r1: BBBB field ref + */ +.LOP_SPUT_VOLATILE_resolve: + ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw, so export now + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveStaticField @ r0<- resolved StaticField ptr + cmp r0, #0 @ success? + bne .LOP_SPUT_VOLATILE_finish @ yes, finish + b common_exceptionThrown @ no, handle exception + +/* continuation for OP_IGET_OBJECT_VOLATILE */ + + /* + * Currently: + * r0 holds resolved field + * r9 holds object + */ +.LOP_IGET_OBJECT_VOLATILE_finish: + @bl common_squeak0 + cmp r9, #0 @ check object for null + ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field + beq common_errNullObject @ object was null + ldr r0, [r9, r3] @ r0<- obj.field (8/16/32 bits) + SMP_DMB 1 @ acquiring load + mov r2, rINST, lsr #8 @ r2<- A+ + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + and r2, r2, #15 @ r2<- A + GET_INST_OPCODE(ip) @ extract opcode from rINST + SET_VREG(r0, r2) @ fp[A]<- r0 + GOTO_OPCODE(ip) @ jump to next instruction + /* continuation for OP_IGET_WIDE_VOLATILE */ /* @@ -8800,7 +9090,7 @@ d2l_doconv: cmp r9, #0 @ check object for null ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field beq common_errNullObject @ object was null - .if 1 + .if 1 add r0, r9, r3 @ r0<- address of field bl dvmQuasiAtomicRead64 @ r0/r1<- contents of field .else @@ -8831,7 +9121,7 @@ d2l_doconv: FETCH_ADVANCE_INST(2) @ advance rPC, load rINST ldmia r2, {r0-r1} @ r0/r1<- fp[A] GET_INST_OPCODE(r10) @ extract opcode from rINST - .if 1 + .if 1 add r2, r9, r3 @ r2<- target address bl dvmQuasiAtomicSwap64 @ stores r0/r1 into addr r2 .else @@ -8939,6 +9229,57 @@ d2l_doconv: .LOP_EXECUTE_INLINE_RANGE_table: .word gDvmInlineOpsTable +/* continuation for OP_IPUT_OBJECT_VOLATILE */ + + /* + * Currently: + * r0 holds resolved field + * r9 holds object + */ +.LOP_IPUT_OBJECT_VOLATILE_finish: + @bl common_squeak0 + mov r1, rINST, lsr #8 @ r1<- A+ + ldr r3, [r0, #offInstField_byteOffset] @ r3<- byte offset of field + and r1, r1, #15 @ r1<- A + cmp r9, #0 @ check object for null + GET_VREG(r0, r1) @ r0<- fp[A] + beq common_errNullObject @ object was null + FETCH_ADVANCE_INST(2) @ advance rPC, load rINST + GET_INST_OPCODE(ip) @ extract opcode from rINST + SMP_DMB 1 @ releasing store + str r0, [r9, r3] @ obj.field (8/16/32 bits)<- r0 + GOTO_OPCODE(ip) @ jump to next instruction + +/* continuation for OP_SGET_OBJECT_VOLATILE */ + + /* + * Continuation if the field has not yet been resolved. + * r1: BBBB field ref + */ +.LOP_SGET_OBJECT_VOLATILE_resolve: + ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw, so export now + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveStaticField @ r0<- resolved StaticField ptr + cmp r0, #0 @ success? + bne .LOP_SGET_OBJECT_VOLATILE_finish @ yes, finish + b common_exceptionThrown @ no, handle exception + +/* continuation for OP_SPUT_OBJECT_VOLATILE */ + + /* + * Continuation if the field has not yet been resolved. + * r1: BBBB field ref + */ +.LOP_SPUT_OBJECT_VOLATILE_resolve: + ldr r2, [rGLUE, #offGlue_method] @ r2<- current method + EXPORT_PC() @ resolve() could throw, so export now + ldr r0, [r2, #offMethod_clazz] @ r0<- method->clazz + bl dvmResolveStaticField @ r0<- resolved StaticField ptr + cmp r0, #0 @ success? + bne .LOP_SPUT_OBJECT_VOLATILE_finish @ yes, finish + b common_exceptionThrown @ no, handle exception + .size dvmAsmSisterStart, .-dvmAsmSisterStart .global dvmAsmSisterEnd dvmAsmSisterEnd: |