From 105cf743ff8b77c72d9602c144e052eff4b0fd24 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Thu, 11 Apr 2019 19:58:08 +0200 Subject: [PATCH] ARM: Support negative values as immediate. * lib/arm-mes/arm.M1 (mvn____%r0,$i8): New macro. (mvn____%r1,$i8): New macro. (mvn____%r7,$i8): New macro. * module/mescc/armv4/as.scm (immediate->r0): Use it. (armv4:value->r): Use it. --- lib/arm-mes/arm.M1 | 5 +++++ module/mescc/armv4/as.scm | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/arm-mes/arm.M1 b/lib/arm-mes/arm.M1 index e9347a65..0cb1ed6c 100644 --- a/lib/arm-mes/arm.M1 +++ b/lib/arm-mes/arm.M1 @@ -95,6 +95,11 @@ DEFINE jne 1a DEFINE mov____$i8,%r0 00a0e3 DEFINE mov____$i8,%r1 10a0e3 # mov r1, #66 DEFINE mov____$i8,%r7 70a0e3 + +DEFINE mvn____%r0,$i8 00e0e3 +DEFINE mvn____%r1,$i8 10e0e3 +DEFINE mvn____%r7,$i8 70e0e3 + DEFINE mov____%r0,%r1 0010a0e1 DEFINE mov____%r0,%r2 0020a0e1 DEFINE mov____%r0,(%r1) 000081e5 diff --git a/module/mescc/armv4/as.scm b/module/mescc/armv4/as.scm index 457b9297..357384a4 100644 --- a/module/mescc/armv4/as.scm +++ b/module/mescc/armv4/as.scm @@ -48,12 +48,16 @@ (define (immediate->r0 v) (if (< (abs v) #x80) - `(((#:immediate1 ,v) "mov____$i8,%r0")) + (if (< v 0) + `(((#:immediate1 ,(- -1 v)) "mvn____%r0,$i8")) + `(((#:immediate1 ,v) "mov____$i8,%r0"))) `(("mov____$i32,%r0" (#:immediate ,v))))) (define (armv4:value->r info v) (let ((r (get-r info))) - `(((#:immediate1 ,v) ,(string-append "mov____$i8,%" r))))) + (if (< v 0) + `(((#:immediate1 ,(- -1 v)) ,(string-append "mvn____%" r ",$i8"))) + `(((#:immediate1 ,v) ,(string-append "mov____$i8,%" r)))))) (define (armv4:ret . rest) "Note: Pretends to be on x86 a lot"