1 %default { "func":"MterpDoPackedSwitch" } 2 /* 3 * Handle a packed-switch or sparse-switch instruction. In both cases 4 * we decode it and hand it off to a helper function. 5 * 6 * We don't really expect backward branches in a switch statement, but 7 * they're perfectly legal, so we check for them here. 8 * 9 * for: packed-switch, sparse-switch 10 */ 11 /* op vAA, +BBBB */ 12 FETCH w0, 1 // w0<- bbbb (lo) 13 FETCH w1, 2 // w1<- BBBB (hi) 14 lsr w3, wINST, #8 // w3<- AA 15 orr w0, w0, w1, lsl #16 // w0<- BBBBbbbb 16 GET_VREG w1, w3 // w1<- vAA 17 add x0, xPC, w0, lsl #1 // w0<- PC + BBBBbbbb*2 18 bl $func // w0<- code-unit branch offset 19 sbfm xINST, x0, 0, 31 20 b MterpCommonTakenBranchNoFlags 21