[8u] RFR: assembler canonical modified imm encoding

Alex Kashchenko akashche at redhat.com
Fri Apr 1 13:44:00 UTC 2016


Hi,

On 03/30/2016 09:23 PM, Anton Kozlov wrote:
> Hi, All!
>
> In 'prec1' commit, modified imm encoding was changed to use constant amount of time for any immediate.
> Sadly, new encoding became not canonical i.e. rotate value may be not minimal as possible, which is not recommended, but allowed by ARM. Start of -XX:+PrintInterpreter looks like
>    0x72df8320: mov       r3, sp
>    0x72df8324: sub       sp, sp, #88     ; 0x58
>    0x72df8328: str       lr, [sp]
>    0x72df832c: mov       r2, r6
>    0x72df8330: mov       r1, sl
>    0x72df8334: str       r5, [fp, #-32]  ; 0xffffffe0
>    0x72df8338: ldr       r9, [fp, #-12]
>    0x72df833c: cmp       r9, #0, 8
>    0x72df8340: beq       0x72df8374
>    0x72df8344: push      {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
>    0x72df8348: add       ip, sp, #224, 2 ; 0x38
>    0x72df834c: push      {ip}            ; (str ip, [sp, #-4]!)
>    0x72df8350: movw      r0, #33092      ; 0x8144
>    0x72df8354: movt      r0, #30085      ; 0x7585
>    0x72df8358: mov       r1, pc
>    0x72df835c: sub       r1, r1, #128, 4
>
> Note instructions like
>    0x72df833c: cmp       r9, #0, 8 // zero encoded as 0 rotated at 8.
>
> The patch restores recommended encoding (still constant time encoding), after applying listing looks like
>    0x72dae320: mov       r3, sp
>    0x72dae324: sub       sp, sp, #88     ; 0x58
>    0x72dae328: str       lr, [sp]
>    0x72dae32c: mov       r2, r6
>    0x72dae330: mov       r1, sl
>    0x72dae334: str       r5, [fp, #-32]  ; 0xffffffe0
>    0x72dae338: ldr       r9, [fp, #-12]
>    0x72dae33c: cmp       r9, #0
>    0x72dae340: beq       0x72dae374
>    0x72dae344: push      {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
>    0x72dae348: add       ip, sp, #56     ; 0x38
>    0x72dae34c: push      {ip}            ; (str ip, [sp, #-4]!)
>    0x72dae350: movw      r0, #45548      ; 0xb1ec
>    0x72dae354: movt      r0, #30080      ; 0x7580
>    0x72dae358: mov       r1, pc
>    0x72dae35c: sub       r1, r1, #8
>
> Sorry for temporary inconvenience in debugging. Happy hacking again!

For what it's worth, commented part of the change (first 3 hunks - 
commented aarch32ops disassembly) cannot be applied cleanly (looks like 
the whitespaces problem). Other part applies and compiles fine.


-- 
-Alex


More information about the aarch32-port-dev mailing list