From: Peter Michael Green Date: Tue, 19 Mar 2019 01:46:21 +0000 (+0000) Subject: hack out ubfx and sbfx which are not supported on armv6 X-Git-Tag: archive/raspbian/10.0.0+r36-3+rpi1~15 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=cd43a112ca74675a06806c4072644fc498291061;p=android-platform-art.git hack out ubfx and sbfx which are not supported on armv6 I wrote a script to replace ubfx and sbfx with shift operations, unfortunately these clobber the carry flag, so there is some risk, hopefully it's ok..... Gbp-Pq: Name hack-out-ubfx-and-sbfx.patch --- diff --git a/runtime/interpreter/mterp/out/mterp_arm.S b/runtime/interpreter/mterp/out/mterp_arm.S index e2b693f..7cc3b2c 100644 --- a/runtime/interpreter/mterp/out/mterp_arm.S +++ b/runtime/interpreter/mterp/out/mterp_arm.S @@ -416,7 +416,10 @@ artMterpAsmInstructionStart = .L_op_nop /* for move, move-object, long-to-int */ /* op vA, vB */ mov r1, rINST, lsr #12 @ r1<- B from 15:12 - ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST GET_VREG r2, r1 @ r2<- fp[B] GET_INST_OPCODE ip @ ip<- opcode from rINST @@ -470,7 +473,10 @@ artMterpAsmInstructionStart = .L_op_nop /* move-wide vA, vB */ /* NOTE: regs can overlap, e.g. "move v6,v7" or "move v7,v6" */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] VREG_INDEX_TO_ADDR r2, rINST @ r2<- &fp[A] ldmia r3, {r0-r1} @ r0/r1<- fp[B] @@ -522,7 +528,10 @@ artMterpAsmInstructionStart = .L_op_nop /* for move, move-object, long-to-int */ /* op vA, vB */ mov r1, rINST, lsr #12 @ r1<- B from 15:12 - ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST GET_VREG r2, r1 @ r2<- fp[B] GET_INST_OPCODE ip @ ip<- opcode from rINST @@ -723,8 +732,14 @@ artMterpAsmInstructionStart = .L_op_nop .L_op_const_4: /* 0x12 */ /* File: arm/op_const_4.S */ /* const/4 vA, #+B */ - sbfx r1, rINST, #12, #4 @ r1<- sssssssB (sign-extended) - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of sbfx r1, rINST, #12, #4 @ r1<- sssssssB (sign-extended) + lsl r1, rINST, #16 + asr r1, r1, #28 + @ end replacement of sbfx r1, rINST, #12, #4 @ r1<- sssssssB (sign-extended) + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST GET_INST_OPCODE ip @ ip<- opcode from rINST SET_VREG r1, r0 @ fp[A]<- r1 @@ -975,7 +990,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl MterpInstanceOf @ (index, &obj, method, self) ldr r1, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A PREFETCH_INST 2 cmp r1, #0 @ exception pending? bne MterpException @@ -992,7 +1010,10 @@ artMterpAsmInstructionStart = .L_op_nop * Return the length of an array. */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A GET_VREG r0, r1 @ r0<- vB (object ref) cmp r0, #0 @ is object null? beq common_errNullObject @ yup, fail @@ -1139,7 +1160,10 @@ artMterpAsmInstructionStart = .L_op_nop * double to get a byte offset. */ /* goto +AA */ - sbfx rINST, rINST, #8, #8 @ rINST<- ssssssAA (sign-extended) + @ begin replacement of sbfx rINST, rINST, #8, #8 @ rINST<- ssssssAA (sign-extended) + lsl rINST, rINST, #16 + asr rINST, rINST, #24 + @ end replacement of sbfx rINST, rINST, #8, #8 @ rINST<- ssssssAA (sign-extended) b MterpCommonTakenBranchNoFlags /* ------------------------------ */ @@ -1424,7 +1448,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* if-cmp vA, vB, +CCCC */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A GET_VREG r3, r1 @ r3<- vB GET_VREG r0, r0 @ r0<- vA FETCH_S rINST, 1 @ rINST<- branch offset, in code units @@ -1450,7 +1477,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* if-cmp vA, vB, +CCCC */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A GET_VREG r3, r1 @ r3<- vB GET_VREG r0, r0 @ r0<- vA FETCH_S rINST, 1 @ rINST<- branch offset, in code units @@ -1476,7 +1506,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* if-cmp vA, vB, +CCCC */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A GET_VREG r3, r1 @ r3<- vB GET_VREG r0, r0 @ r0<- vA FETCH_S rINST, 1 @ rINST<- branch offset, in code units @@ -1502,7 +1535,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* if-cmp vA, vB, +CCCC */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A GET_VREG r3, r1 @ r3<- vB GET_VREG r0, r0 @ r0<- vA FETCH_S rINST, 1 @ rINST<- branch offset, in code units @@ -1528,7 +1564,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* if-cmp vA, vB, +CCCC */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A GET_VREG r3, r1 @ r3<- vB GET_VREG r0, r0 @ r0<- vA FETCH_S rINST, 1 @ rINST<- branch offset, in code units @@ -1554,7 +1593,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* if-cmp vA, vB, +CCCC */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A GET_VREG r3, r1 @ r3<- vB GET_VREG r0, r0 @ r0<- vA FETCH_S rINST, 1 @ rINST<- branch offset, in code units @@ -2244,7 +2286,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGet32InstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -2274,7 +2319,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGet64InstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpException @ bail out @@ -2303,7 +2351,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGetObjInstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -2335,7 +2386,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGetBooleanInstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -2367,7 +2421,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGetByteInstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -2399,7 +2456,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGetCharInstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -2431,7 +2491,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rSELF @ r3<- self bl artGetShortInstanceFromCode ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -2460,7 +2523,10 @@ artMterpAsmInstructionStart = .L_op_nop FETCH r0, 1 @ r0<- field ref CCCC mov r1, rINST, lsr #12 @ r1<- B GET_VREG r1, r1 @ r1<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A GET_VREG r2, r2 @ r2<- fp[A] ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer PREFETCH_INST 2 @@ -2481,7 +2547,10 @@ artMterpAsmInstructionStart = .L_op_nop FETCH r0, 1 @ r0<- field ref CCCC mov r1, rINST, lsr #12 @ r1<- B GET_VREG r1, r1 @ r1<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A VREG_INDEX_TO_ADDR r2, r2 @ r2<- &fp[A] ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer PREFETCH_INST 2 @@ -2524,7 +2593,10 @@ artMterpAsmInstructionStart = .L_op_nop FETCH r0, 1 @ r0<- field ref CCCC mov r1, rINST, lsr #12 @ r1<- B GET_VREG r1, r1 @ r1<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A GET_VREG r2, r2 @ r2<- fp[A] ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer PREFETCH_INST 2 @@ -2552,7 +2624,10 @@ artMterpAsmInstructionStart = .L_op_nop FETCH r0, 1 @ r0<- field ref CCCC mov r1, rINST, lsr #12 @ r1<- B GET_VREG r1, r1 @ r1<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A GET_VREG r2, r2 @ r2<- fp[A] ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer PREFETCH_INST 2 @@ -2580,7 +2655,10 @@ artMterpAsmInstructionStart = .L_op_nop FETCH r0, 1 @ r0<- field ref CCCC mov r1, rINST, lsr #12 @ r1<- B GET_VREG r1, r1 @ r1<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A GET_VREG r2, r2 @ r2<- fp[A] ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer PREFETCH_INST 2 @@ -2608,7 +2686,10 @@ artMterpAsmInstructionStart = .L_op_nop FETCH r0, 1 @ r0<- field ref CCCC mov r1, rINST, lsr #12 @ r1<- B GET_VREG r1, r1 @ r1<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A GET_VREG r2, r2 @ r2<- fp[A] ldr r3, [rFP, #OFF_FP_METHOD] @ r3<- referrer PREFETCH_INST 2 @@ -3362,7 +3443,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r3 @ r0<- vB @ optional op; may set condition codes FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -3388,7 +3472,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r3 @ r0<- vB @ optional op; may set condition codes FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -3413,7 +3500,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r3, {r0-r1} @ r0/r1<- vAA @@ -3441,7 +3531,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r3, {r0-r1} @ r0/r1<- vAA @@ -3470,7 +3563,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r3 @ r0<- vB @ optional op; may set condition codes FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -3495,7 +3591,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r3, {r0-r1} @ r0/r1<- vAA @@ -3523,7 +3622,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A GET_VREG r0, r3 @ r0<- vB VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] @ optional op; may set condition codes @@ -3551,7 +3653,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rINST, lsr #12 @ r3<- B VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB flds s0, [r3] @ s0<- vB - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST fsitos s1, s0 @ s1<- op GET_INST_OPCODE ip @ extract opcode from rINST @@ -3575,7 +3680,10 @@ artMterpAsmInstructionStart = .L_op_nop mov r3, rINST, lsr #12 @ r3<- B VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB flds s0, [r3] @ s0<- vB - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST fsitod d0, s0 @ d0<- op CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs @@ -3594,7 +3702,10 @@ artMterpAsmInstructionStart = .L_op_nop /* for move, move-object, long-to-int */ /* op vA, vB */ mov r1, rINST, lsr #12 @ r1<- B from 15:12 - ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A from 11:8 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST GET_VREG r2, r1 @ r2<- fp[B] GET_INST_OPCODE ip @ ip<- opcode from rINST @@ -3623,7 +3734,10 @@ artMterpAsmInstructionStart = .L_op_nop */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] ldmia r3, {r0-r1} @ r0/r1<- vB/vB+1 FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -3647,7 +3761,10 @@ artMterpAsmInstructionStart = .L_op_nop * For: long-to-double */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] vldr d0, [r3] @ d0<- vAA @@ -3681,7 +3798,10 @@ constvalop_long_to_double: mov r3, rINST, lsr #12 @ r3<- B VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB flds s0, [r3] @ s0<- vB - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST ftosizs s1, s0 @ s1<- op GET_INST_OPCODE ip @ extract opcode from rINST @@ -3704,7 +3824,10 @@ constvalop_long_to_double: */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A GET_VREG r0, r3 @ r0<- vB VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] @ optional op; may set condition codes @@ -3733,7 +3856,10 @@ constvalop_long_to_double: mov r3, rINST, lsr #12 @ r3<- B VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB flds s0, [r3] @ s0<- vB - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST vcvt.f64.f32 d0, s0 @ d0<- op CLEAR_SHADOW_PAIR r9, ip, lr @ Zero shadow regs @@ -3758,7 +3884,10 @@ constvalop_long_to_double: mov r3, rINST, lsr #12 @ r3<- B VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB fldd d0, [r3] @ d0<- vB - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST ftosizd s0, d0 @ s0<- op GET_INST_OPCODE ip @ extract opcode from rINST @@ -3781,7 +3910,10 @@ constvalop_long_to_double: */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r3, {r0-r1} @ r0/r1<- vAA @@ -3811,7 +3943,10 @@ constvalop_long_to_double: mov r3, rINST, lsr #12 @ r3<- B VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB fldd d0, [r3] @ d0<- vB - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A FETCH_ADVANCE_INST 1 @ advance rPC, load rINST vcvt.f32.f64 s0, d0 @ s0<- op GET_INST_OPCODE ip @ extract opcode from rINST @@ -3835,7 +3970,10 @@ constvalop_long_to_double: */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r3 @ r0<- vB @ optional op; may set condition codes FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -3861,7 +3999,10 @@ constvalop_long_to_double: */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r3 @ r0<- vB @ optional op; may set condition codes FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -3887,7 +4028,10 @@ constvalop_long_to_double: */ /* unop vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r3 @ r0<- vB @ optional op; may set condition codes FETCH_ADVANCE_INST 1 @ advance rPC, load rINST @@ -5133,7 +5277,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5171,7 +5318,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5210,7 +5360,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5242,7 +5395,10 @@ constvalop_long_to_double: * */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA cmp r1, #0 @ is second operand zero? @@ -5277,7 +5433,10 @@ constvalop_long_to_double: * */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA cmp r1, #0 @ is second operand zero? @@ -5317,7 +5476,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5355,7 +5517,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5393,7 +5558,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5431,7 +5599,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5469,7 +5640,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5507,7 +5681,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -5545,7 +5722,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5585,7 +5765,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5618,7 +5801,10 @@ constvalop_long_to_double: */ /* mul-long/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR rINST, r9 @ rINST<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5654,7 +5840,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5695,7 +5884,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5735,7 +5927,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5775,7 +5970,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5815,7 +6013,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -5844,7 +6045,10 @@ constvalop_long_to_double: */ /* shl-long/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r2, r3 @ r2<- vB CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] @@ -5871,7 +6075,10 @@ constvalop_long_to_double: */ /* shr-long/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r2, r3 @ r2<- vB CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] @@ -5898,7 +6105,10 @@ constvalop_long_to_double: */ /* ushr-long/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r2, r3 @ r2<- vB CLEAR_SHADOW_PAIR r9, lr, ip @ Zero out the shadow regs VREG_INDEX_TO_ADDR r9, r9 @ r9<- &fp[A] @@ -5929,7 +6139,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA flds s1, [r3] @ s1<- vB @@ -5955,7 +6168,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA flds s1, [r3] @ s1<- vB @@ -5981,7 +6197,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA flds s1, [r3] @ s1<- vB @@ -6007,7 +6226,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB VREG_INDEX_TO_ADDR r9, r9 @ r9<- &vA flds s1, [r3] @ s1<- vB @@ -6041,7 +6263,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r1, r3 @ r1<- vB GET_VREG r0, r9 @ r0<- vA .if 0 @@ -6073,7 +6298,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs fldd d1, [r3] @ d1<- vB @@ -6101,7 +6329,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs fldd d1, [r3] @ d1<- vB @@ -6129,7 +6360,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs fldd d1, [r3] @ d1<- vB @@ -6157,7 +6391,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r3, rINST, lsr #12 @ r3<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A VREG_INDEX_TO_ADDR r3, r3 @ r3<- &vB CLEAR_SHADOW_PAIR r9, ip, r0 @ Zero out shadow regs fldd d1, [r3] @ d1<- vB @@ -6192,7 +6429,10 @@ constvalop_long_to_double: */ /* binop/2addr vA, vB */ mov r1, rINST, lsr #12 @ r1<- B - ubfx rINST, rINST, #8, #4 @ rINST<- A + @ begin replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A + lsl rINST, rINST, #20 + lsr rINST, rINST, #28 + @ end replacement of ubfx rINST, rINST, #8, #4 @ rINST<- A VREG_INDEX_TO_ADDR r1, r1 @ r1<- &fp[B] VREG_INDEX_TO_ADDR r9, rINST @ r9<- &fp[A] ldmia r1, {r2-r3} @ r2/r3<- vBB/vBB+1 @@ -6231,7 +6471,10 @@ constvalop_long_to_double: /* binop/lit16 vA, vB, #+CCCC */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB .if 0 cmp r1, #0 @ is second operand zero? @@ -6267,7 +6510,10 @@ constvalop_long_to_double: /* binop/lit16 vA, vB, #+CCCC */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB .if 0 cmp r1, #0 @ is second operand zero? @@ -6303,7 +6549,10 @@ constvalop_long_to_double: /* binop/lit16 vA, vB, #+CCCC */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB .if 0 cmp r1, #0 @ is second operand zero? @@ -6334,7 +6583,10 @@ constvalop_long_to_double: */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB cmp r1, #0 @ is second operand zero? beq common_errDivideByZero @@ -6368,7 +6620,10 @@ constvalop_long_to_double: */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB cmp r1, #0 @ is second operand zero? beq common_errDivideByZero @@ -6405,7 +6660,10 @@ constvalop_long_to_double: /* binop/lit16 vA, vB, #+CCCC */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB .if 0 cmp r1, #0 @ is second operand zero? @@ -6440,7 +6698,10 @@ constvalop_long_to_double: /* binop/lit16 vA, vB, #+CCCC */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB .if 0 cmp r1, #0 @ is second operand zero? @@ -6475,7 +6736,10 @@ constvalop_long_to_double: /* binop/lit16 vA, vB, #+CCCC */ FETCH_S r1, 1 @ r1<- ssssCCCC (sign-extended) mov r2, rINST, lsr #12 @ r2<- B - ubfx r9, rINST, #8, #4 @ r9<- A + @ begin replacement of ubfx r9, rINST, #8, #4 @ r9<- A + lsl r9, rINST, #20 + lsr r9, r9, #28 + @ end replacement of ubfx r9, rINST, #8, #4 @ r9<- A GET_VREG r0, r2 @ r0<- vB .if 0 cmp r1, #0 @ is second operand zero? @@ -6833,7 +7097,10 @@ constvalop_long_to_double: mov r9, rINST, lsr #8 @ r9<- AA and r2, r3, #255 @ r2<- BB GET_VREG r0, r2 @ r0<- vBB - ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) + @ begin replacement of ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) + lsl r1, r3, #19 + lsr r1, r1, #27 + @ end replacement of ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) .if 0 @cmp r1, #0 @ is second operand zero? beq common_errDivideByZero @@ -6874,7 +7141,10 @@ constvalop_long_to_double: mov r9, rINST, lsr #8 @ r9<- AA and r2, r3, #255 @ r2<- BB GET_VREG r0, r2 @ r0<- vBB - ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) + @ begin replacement of ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) + lsl r1, r3, #19 + lsr r1, r1, #27 + @ end replacement of ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) .if 0 @cmp r1, #0 @ is second operand zero? beq common_errDivideByZero @@ -6915,7 +7185,10 @@ constvalop_long_to_double: mov r9, rINST, lsr #8 @ r9<- AA and r2, r3, #255 @ r2<- BB GET_VREG r0, r2 @ r0<- vBB - ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) + @ begin replacement of ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) + lsl r1, r3, #19 + lsr r1, r1, #27 + @ end replacement of ubfx r1, r3, #8, #5 @ optional; typically r1<- ssssssCC (sign extended) .if 0 @cmp r1, #0 @ is second operand zero? beq common_errDivideByZero @@ -6938,7 +7211,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- object we're operating on - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null ldr r0, [r3, r1] @ r0<- obj.field @@ -6955,7 +7231,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH ip, 1 @ ip<- field byte offset GET_VREG r3, r2 @ r3<- object we're operating on - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null ldrd r0, [r3, ip] @ r0<- obj.field (64 bits, aligned) @@ -6978,7 +7257,10 @@ constvalop_long_to_double: GET_VREG r0, r2 @ r0<- object we're operating on bl artIGetObjectFromMterp @ (obj, offset) ldr r3, [rSELF, #THREAD_EXCEPTION_OFFSET] - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A PREFETCH_INST 2 cmp r3, #0 bne MterpPossibleException @ bail out @@ -6996,7 +7278,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null GET_VREG r0, r2 @ r0<- fp[A] @@ -7013,7 +7298,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r3, 1 @ r3<- field byte offset GET_VREG r2, r2 @ r2<- fp[B], the object pointer - ubfx r0, rINST, #8, #4 @ r0<- A + @ begin replacement of ubfx r0, rINST, #8, #4 @ r0<- A + lsl r0, rINST, #20 + lsr r0, r0, #28 + @ end replacement of ubfx r0, rINST, #8, #4 @ r0<- A cmp r2, #0 @ check object for null beq common_errNullObject @ object was null VREG_INDEX_TO_ADDR r0, r0 @ r0<- &fp[A] @@ -7104,7 +7392,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null GET_VREG r0, r2 @ r0<- fp[A] @@ -7124,7 +7415,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null GET_VREG r0, r2 @ r0<- fp[A] @@ -7144,7 +7438,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null GET_VREG r0, r2 @ r0<- fp[A] @@ -7164,7 +7461,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- fp[B], the object pointer - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null GET_VREG r0, r2 @ r0<- fp[A] @@ -7184,7 +7484,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- object we're operating on - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null ldrb r0, [r3, r1] @ r0<- obj.field @@ -7204,7 +7507,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- object we're operating on - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null ldrsb r0, [r3, r1] @ r0<- obj.field @@ -7224,7 +7530,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- object we're operating on - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null ldrh r0, [r3, r1] @ r0<- obj.field @@ -7244,7 +7553,10 @@ constvalop_long_to_double: mov r2, rINST, lsr #12 @ r2<- B FETCH r1, 1 @ r1<- field byte offset GET_VREG r3, r2 @ r3<- object we're operating on - ubfx r2, rINST, #8, #4 @ r2<- A + @ begin replacement of ubfx r2, rINST, #8, #4 @ r2<- A + lsl r2, rINST, #20 + lsr r2, r2, #28 + @ end replacement of ubfx r2, rINST, #8, #4 @ r2<- A cmp r3, #0 @ check object for null beq common_errNullObject @ object was null ldrsh r0, [r3, r1] @ r0<- obj.field @@ -7406,7 +7718,10 @@ artMterpAsmSisterStart: * to modest integer. The EABI convert function isn't doing this for us. */ f2l_doconv: - ubfx r2, r0, #23, #8 @ grab the exponent + @ begin replacement of ubfx r2, r0, #23, #8 @ grab the exponent + lsl r2, r0, #1 + lsr r2, r2, #24 + @ end replacement of ubfx r2, r0, #23, #8 @ grab the exponent cmp r2, #0xbe @ MININT < x > MAXINT? bhs f2l_special_cases b __aeabi_f2lz @ tail call to convert float to long @@ -7436,7 +7751,10 @@ f2l_maybeNaN: * to modest integer. The EABI convert function isn't doing this for us. */ d2l_doconv: - ubfx r2, r1, #20, #11 @ grab the exponent + @ begin replacement of ubfx r2, r1, #20, #11 @ grab the exponent + lsl r2, r1, #1 + lsr r2, r2, #21 + @ end replacement of ubfx r2, r1, #20, #11 @ grab the exponent movw r3, #0x43e cmp r2, r3 @ MINLONG < x > MAXLONG? bhs d2l_special_cases diff --git a/runtime/interpreter/mterp/replace-ubfx.py b/runtime/interpreter/mterp/replace-ubfx.py new file mode 100644 index 0000000..7ca6137 --- /dev/null +++ b/runtime/interpreter/mterp/replace-ubfx.py @@ -0,0 +1,51 @@ +#!/usr/bin/python3 +#script to replace ubfx with equivilent code for older arm +#note: these replacements will unfortunately clobber the carry +#flag, I hope that doesn't break anything. +#Copyright 2019 Peter Michael Green +# +#Permission is hereby granted, free of charge, to any person obtaining a copy of +#this software and associated documentation files (the "Software"), to deal in +#the Software without restriction, including without limitation the rights to +#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +#of the Software, and to permit persons to whom the Software is furnished to do +#so, subject to the following conditions: +# +#The above copyright notice and this permission notice shall be included in all +#copies or substantial portions of the Software. +# +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +#SOFTWARE. +import sys + +f = open(sys.argv[1],"r") +for line in f: + line = line.rstrip() + linels = line.lstrip() + linesplit = linels.split() + if (len(linesplit) > 0) and ((linesplit[0] == 'ubfx') or (linesplit[0] == 'sbfx')): + linestartwhitespace = line[:(len(line)-len(linels))] + destreg = linesplit[1][:-1] + sourcereg = linesplit[2][:-1] + lsb = int(linesplit[3][1:-1]) + width = int(linesplit[4][1:]) + #print(linesplit) + #print((destreg,sourcereg,lsb,width)) + print(linestartwhitespace+'@ begin replacement of '+linels) + print(linestartwhitespace+'lsl '+destreg+', '+sourcereg+', #'+str(32-width-lsb)) + if linesplit[0] == 'ubfx': + rightshift = 'lsr' + else: + rightshift = 'asr' + print(linestartwhitespace+rightshift+' '+destreg+', '+destreg+', #'+str(32-width)) + print(linestartwhitespace+'@ end replacement of '+linels) + else: + print(line) +f.close() + +