OP_EXECUTE_INLINE.S revision 9f601a917c8878204482c37aec7005054b6776fa
1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "executed" 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%verify "exception handled" 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Execute a "native inline" instruction. 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * We need to call an InlineOp4Func: 7b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * bool (func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, JValue* pResult) 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 9b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * The first four args are in r0-r3, pointer to return value storage 10b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * is on the stack. The function's return value is a flag that tells 11b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden * us if an exception was thrown. 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* [opt] execute-inline vAA, {vC, vD, vE, vF}, inline@BBBB */ 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r10, 1) @ r10<- BBBB 159f601a917c8878204482c37aec7005054b6776fabuzbee add r1, rSELF, #offThread_retval @ r1<- &self->retval 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project EXPORT_PC() @ can throw 17b0a0541b59d1126ff77c88de742b4a74579fe296Andy McFadden sub sp, sp, #8 @ make room for arg, +64 bit align 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project mov r0, rINST, lsr #12 @ r0<- B 199f601a917c8878204482c37aec7005054b6776fabuzbee str r1, [sp] @ push &self->retval 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl .L${opcode}_continue @ make call; will return after 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add sp, sp, #8 @ pop stack 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project cmp r0, #0 @ test boolean result of inline 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project beq common_exceptionThrown @ returned false, handle exception 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH_ADVANCE_INST(3) @ advance rPC, load rINST 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GET_INST_OPCODE(ip) @ extract opcode from rINST 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project GOTO_OPCODE(ip) @ jump to next instruction 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project%break 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Extract args, call function. 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r0 = #of args (0-4) 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * r10 = call index 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * lr = return addr, above [DO NOT bl out of here w/o preserving LR] 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Other ideas: 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * - Use a jump table from the main piece to jump directly into the 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * AND/LDR pairs. Costs a data load, saves a branch. 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * - Have five separate pieces that do the loading, so we can work the 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * interleave a little better. Increases code size. 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_continue: 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project rsb r0, r0, #4 @ r0<- 4-r0 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project FETCH(r9, 2) @ r9<- FEDC 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project add pc, pc, r0, lsl #3 @ computed goto, 2 instrs each 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project bl common_abort @ (skipped due to ARM prefetch) 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project4: and ip, r9, #0xf000 @ isolate F 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r3, [rFP, ip, lsr #10] @ r3<- vF (shift right 12, left 2) 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project3: and ip, r9, #0x0f00 @ isolate E 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r2, [rFP, ip, lsr #6] @ r2<- vE 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project2: and ip, r9, #0x00f0 @ isolate D 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r1, [rFP, ip, lsr #2] @ r1<- vD 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project1: and ip, r9, #0x000f @ isolate C 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r0, [rFP, ip, lsl #2] @ r0<- vC 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project0: 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ldr r9, .L${opcode}_table @ table of InlineOperation 56d88756df5b4dbc6fd450afd0019a5f64ebe4432dElliott Hughes ldr pc, [r9, r10, lsl #4] @ sizeof=16, "func" is first entry 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @ (not reached) 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project.L${opcode}_table: 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project .word gDvmInlineOpsTable 61