2013-1-30 9:51:12
handleFmt35c_3rc_5rc
传入的参数有点多余
有CU MIR BB 标签列表
如果mir自己已经被内联优化掉了 就不用处理了
如果fallthrough 存在,那个这个bb对应的标签作为返回的单元
如果调用的是virtual method,那么把taken bB 的标签作为预测单元也没有问题
调用点信息 misPredBranchOver lir
r5 rFP
dvmCompilerEvalLoc
dalvik Reg 和 native reg 之间的map 关系
typedef struct RegisterInfo {
int reg; // Reg number
bool inUse; // Has it been allocated?
bool pair; // Part of a register pair?
int partner; // If pair, other reg of pair
bool live; // Is there an associated SSA name?
bool dirty; // If live, is it dirty?
int sReg; // Name of live value
struct LIR *defStart; // Starting inst in last def sequence
struct LIR *defEnd; // Ending inst in last def sequence
} RegisterInfo
更新之后就有了自己的physical reg
所谓的resource mask 就是说用到了哪些Reg
如果说这个值已经存在于reg中,那么直接生成一个mov 指令就ok了
/*
* vC = this
*
* A predicted inlining target looks like the following, where instructions
* between 0x4858de66 and 0x4858de72 are checking if the predicted class
* matches "this", and the verificaion code is generated by this routine.
*
* (C) means the instruction is inlined from the callee, and (PI) means the
* instruction is the predicted inlined invoke, whose corresponding
* instructions are still generated to handle the mispredicted case.
*
* D/dalvikvm( 86): -------- kMirOpCheckInlinePrediction
* D/dalvikvm( 86): 0x4858de66 (0002): ldr r0, [r5, #68]
* D/dalvikvm( 86): 0x4858de68 (0004): ldr r1, [pc, #140]
* D/dalvikvm( 86): 0x4858de6a (0006): cmp r0, #0
* D/dalvikvm( 86): 0x4858de6c (0008): beq 0x4858deb2
* D/dalvikvm( 86): 0x4858de6e (000a): ldr r2, [r0, #0]
* D/dalvikvm( 86): 0x4858de70 (000c): cmp r1, r2
* D/dalvikvm( 86): 0x4858de72 (000e): bne 0x4858de7a
* D/dalvikvm( 86): -------- dalvik offset: 0x004c @ +iget-object-quick (C)
* v4, v17, (#8)
* D/dalvikvm( 86): 0x4858de74 (0010): ldr r3, [r0, #8]
* D/dalvikvm( 86): 0x4858de76 (0012): str r3, [r5, #16]
* D/dalvikvm( 86): -------- dalvik offset: 0x004c @
* +invoke-virtual-quick/range (PI) v17..v17
* D/dalvikvm( 86): 0x4858de78 (0014): b 0x4858debc
* D/dalvikvm( 86): 0x4858de7a (0016): add r4,r5,#68
* D/dalvikvm( 86): -------- BARRIER
* D/dalvikvm( 86): 0x4858de7e (001a): ldmia r4, <r0>
* D/dalvikvm( 86): -------- BARRIER
* D/dalvikvm( 86): 0x4858de80 (001c): sub r7,r5,#24
* D/dalvikvm( 86): 0x4858de84 (0020): cmp r0, #0
* D/dalvikvm( 86): 0x4858de86 (0022): beq 0x4858deb6
* D/dalvikvm( 86): -------- BARRIER
* D/dalvikvm( 86): 0x4858de88 (0024): stmia r7, <r0>
* D/dalvikvm( 86): -------- BARRIER
* D/dalvikvm( 86): 0x4858de8a (0026): ldr r4, [pc, #104]
* D/dalvikvm( 86): 0x4858de8c (0028): add r1, pc, #28
* D/dalvikvm( 86): 0x4858de8e (002a): add r2, pc, #56
* D/dalvikvm( 86): 0x4858de90 (002c): blx_1 0x48589198
* D/dalvikvm( 86): 0x4858de92 (002e): blx_2 see above
* D/dalvikvm( 86): 0x4858de94 (0030): b 0x4858dec8
* D/dalvikvm( 86): 0x4858de96 (0032): b 0x4858deb6
* D/dalvikvm( 86): 0x4858de98 (0034): ldr r0, [r7, #72]
* D/dalvikvm( 86): 0x4858de9a (0036): cmp r1, #0
* D/dalvikvm( 86): 0x4858de9c (0038): bgt 0x4858dea4
* D/dalvikvm( 86): 0x4858de9e (003a): ldr r7, [r6, #116]
* D/dalvikvm( 86): 0x4858dea0 (003c): movs r1, r6
* D/dalvikvm( 86): 0x4858dea2 (003e): blx r7
* D/dalvikvm( 86): 0x4858dea4 (0040): add r1, pc, #4
* D/dalvikvm( 86): 0x4858dea6 (0042): blx_1 0x485890a0
* D/dalvikvm( 86): 0x4858dea8 (0044): blx_2 see above
* D/dalvikvm( 86): 0x4858deaa (0046): b 0x4858deb6
* D/dalvikvm( 86): 0x4858deac (0048): .align4
* D/dalvikvm( 86): L0x004f:
* D/dalvikvm( 86): -------- dalvik offset: 0x004f @ move-result-object (PI)
* v4, (#0), (#0)
* D/dalvikvm( 86): 0x4858deac (0048): ldr r4, [r6, #8]
* D/dalvikvm( 86): 0x4858deae (004a): str r4, [r5, #16]
* D/dalvikvm( 86): 0x4858deb0 (004c): b 0x4858debc
* D/dalvikvm( 86): -------- reconstruct dalvik PC : 0x42beefcc @ +0x004c
* D/dalvikvm( 86): 0x4858deb2 (004e): ldr r0, [pc, #64]
* D/dalvikvm( 86): 0x4858deb4 (0050): b 0x4858deb8
* D/dalvikvm( 86): -------- reconstruct dalvik PC : 0x42beefcc @ +0x004c
* D/dalvikvm( 86): 0x4858deb6 (0052): ldr r0, [pc, #60]
* D/dalvikvm( 86): Exception_Handling:
* D/dalvikvm( 86): 0x4858deb8 (0054): ldr r1, [r6, #100]
* D/dalvikvm( 86): 0x4858deba (0056): blx r1
* D/dalvikvm( 86): 0x4858debc (0058): .align4
* D/dalvikvm( 86): -------- chaining cell (hot): 0x0050
* D/dalvikvm( 86): 0x4858debc (0058): b 0x4858dec0
* D/dalvikvm( 86): 0x4858debe (005a): orrs r0, r0
* D/dalvikvm( 86): 0x4858dec0 (005c): ldr r0, [r6, #112]
* D/dalvikvm( 86): 0x4858dec2 (005e): blx r0
* D/dalvikvm( 86): 0x4858dec4 (0060): data 0xefd4(61396)
* D/dalvikvm( 86): 0x4858dec6 (0062): data 0x42be(17086)
* D/dalvikvm( 86): 0x4858dec8 (0064): .align4
* D/dalvikvm( 86): -------- chaining cell (predicted)
* D/dalvikvm( 86): 0x4858dec8 (0064): data 0xe7fe(59390)
* D/dalvikvm( 86): 0x4858deca (0066): data 0x0000(0)
* D/dalvikvm( 86): 0x4858decc (0068): data 0x0000(0)
* D/dalvikvm( 86): 0x4858dece (006a): data 0x0000(0)
load this
load callsiteinfo
null check
ldr clazz
预测的是clazz,根据的就是调用点信息
预测的流程是什么?
ldr r1 ,[pc,#offset]
怎么计算的这个偏移值?
classPointerList 这是一个什么list?
什么是真实的?
clazz 可以直接ldr 出来
在什么情况下需要进行预测
进行内联预测检查
尝试内联调用新的调用点