diff --git a/lib/arm-mes/arm.M1 b/lib/arm-mes/arm.M1 index a3ebb58b..62757c76 100644 --- a/lib/arm-mes/arm.M1 +++ b/lib/arm-mes/arm.M1 @@ -44,6 +44,8 @@ DEFINE add____$i8,%r0 0090e2 # adds r0, r0, #xx; ADDSI = immediate op1 '09' op # 1090e2 # adds r1, r0, #xx; ADDSI = immediate op1 '09' op2 'e2' DEFINE add____$i8,%r1 1091e2 # adds r1, r1, #xx DEFINE add____$i8,%r13 d09de2 # adds r13, r13, #xx +DEFINE sub____$i8,%r0 0050e2 # subs r0, r0, #xx +DEFINE sub____$i8,%r1 1051e2 # subs r1, r1, #xx DEFINE add____%r0,%r0 000090e0 # adds r0, r0, r0 DEFINE add____%r0,%r1 001091e0 # adds r1, r1, r0 DEFINE add____%r1,%r0 010090e0 # adds r0, r0, r1 diff --git a/module/mescc/armv4/as.scm b/module/mescc/armv4/as.scm index 61dc5d5e..c9117c76 100644 --- a/module/mescc/armv4/as.scm +++ b/module/mescc/armv4/as.scm @@ -87,6 +87,7 @@ (define (armv4:call-label info label n) `(((#:offset3 ,label) bl) + ; FIXME: Can n be negative? ((#:immediate1 ,(* n 4)) "add____$i8,%esp"))) (define (armv4:r->arg info i) @@ -139,7 +140,9 @@ (let ((r (get-r info))) `((,(string-append "push___%r0")) (,(string-append "ldrb___%r0,(%" r ")")) - ((#:immediate1 ,v) ,(string-append "add____$i8,%r0")) + ,(if (< v 0) + `((#:immediate1 ,(abs v)) ,(string-append "sub____$i8,%r0")) + `((#:immediate1 ,v) ,(string-append "add____$i8,%r0"))) (,(string-append "strb___%r0,(%" r ")")) (,(string-append "pop____%r0"))))) @@ -148,7 +151,9 @@ `((,(string-append "push___%r0")) (,(string-append "ldrh___%r0,(%" r ")")) ;; FIXME: That's not complete. - ((#:immediate1 ,v) ,(string-append "add____$i8,%r0")) + ,(if (< v 0) + `((#:immediate1 ,(abs v)) ,(string-append "sub____$i8,%r0")) + `((#:immediate1 ,v) ,(string-append "add____$i8,%r0"))) (,(string-append "strh___%r0,(%" r ")")) (,(string-append "pop____%r0"))))) @@ -157,7 +162,9 @@ (let ((n (- 0 (* 4 n)))) `((,(string-append "mov____%ebp,%" r)) ,(if (< (abs n) #x80) - `((#:immediate1 ,n) ,(string-append "add____$i8,%" r)) + (if (< n 0) + `((#:immediate1 ,(abs n)) ,(string-append "sub____$i8,%" r)) + `((#:immediate1 ,n) ,(string-append "add____$i8,%" r))) `(,(string-append "add____$i32,%" r) (#:immediate ,n))))))) (define (armv4:label->r info label) @@ -319,6 +326,7 @@ (define (armv4:call-r info n) (let ((r (get-r info))) `((,(string-append "call___*%" r)) + ;; FIXME: Sign. ((#:immediate1 ,(* n 4)) "add____$i8,%esp")))) (define (armv4:r0*r1 info) @@ -368,7 +376,9 @@ (define (armv4:r+value info v) (let ((r (get-r info))) (if (< (abs v) #x80) - `(((#:immediate1 ,v) ,(string-append "add____$i8,%" r))) + (if (< v 0) + `(((#:immediate1 ,(abs v)) ,(string-append "sub____$i8,%" r))) + `(((#:immediate1 ,v) ,(string-append "add____$i8,%" r)))) `((,(string-append "add____$i32,%" r) (#:immediate ,v)))))) (define (armv4:r0->r1-mem info) @@ -452,7 +462,9 @@ (define (armv4:r0+value info v) (let ((r0 (get-r0 info))) (if (< (abs v) #x80) - `(((#:immediate1 ,v) ,(string-append "add____$i8,%" r0))) + (if (< v 0) + `(((#:immediate1 ,(abs v)) ,(string-append "sub____$i8,%" r0))) + `(((#:immediate1 ,v) ,(string-append "add____$i8,%" r0)))) `((,(string-append "add____$i32,%" r0) (#:immediate ,v)))))) (define (armv4:value->r0 info v)