ARM: Factor out optimize-immediate.
* module/mescc/armv4/as.scm (optimize-immediate): New macro. (immediate->r0): Use it. (armv4:value->r): Use it. (armv4:local->r): Use it. (armv4:r->local+n): Use it. (armv4:r-byte-mem-add): Use it. (armv4:r-word-mem-add): Use it. (armv4:local-ptr->r): Use it. (armv4:r+value): Use it. (armv4:r-cmp-value): Use it. (armv4:r0+value): Use it. (armv4:byte-r->local+n): Use it. (armv4:word-r->local+n): Use it.
This commit is contained in:
parent
341682f474
commit
aaa174382e
|
@ -30,6 +30,19 @@
|
||||||
#:export (
|
#:export (
|
||||||
armv4:instructions
|
armv4:instructions
|
||||||
))
|
))
|
||||||
|
;; If 0 <= exp < #x100, use positive-body.
|
||||||
|
;; If #x-100 < exp < 0, use negative-body.
|
||||||
|
;; Otherwise, use general-body.
|
||||||
|
(define-macro (optimize-immediate exp positive-body negative-body
|
||||||
|
general-body)
|
||||||
|
`(let ((exp ,exp))
|
||||||
|
(if (,>= exp ,0)
|
||||||
|
(if (,< exp ,#x100)
|
||||||
|
,positive-body
|
||||||
|
,general-body)
|
||||||
|
(if (,> exp ,#x-100)
|
||||||
|
,negative-body
|
||||||
|
,general-body))))
|
||||||
|
|
||||||
(define (armv4:function-preamble . rest)
|
(define (armv4:function-preamble . rest)
|
||||||
"Note: Pretends to be on x86 a lot"
|
"Note: Pretends to be on x86 a lot"
|
||||||
|
@ -47,23 +60,17 @@
|
||||||
`(,`(,(string-append "mov____%" r ",0x32(%ebp)") (#:immediate ,n)))))
|
`(,`(,(string-append "mov____%" r ",0x32(%ebp)") (#:immediate ,n)))))
|
||||||
|
|
||||||
(define (immediate->r0 v)
|
(define (immediate->r0 v)
|
||||||
(if (< v 0)
|
(optimize-immediate v
|
||||||
(if (> v #x-100)
|
`(((#:immediate1 ,v) "mov____$i8,%r0"))
|
||||||
`(((#:immediate1 ,(- -1 v)) "mvn____%r0,$i8"))
|
`(((#:immediate1 ,(- -1 v)) "mvn____%r0,$i8"))
|
||||||
`(("mov____$i32,%r0" (#:immediate ,v))))
|
`(("mov____$i32,%r0" (#:immediate ,v)))))
|
||||||
(if (< v #x100)
|
|
||||||
`(((#:immediate1 ,v) "mov____$i8,%r0"))
|
|
||||||
`(("mov____$i32,%r0" (#:immediate ,v))))))
|
|
||||||
|
|
||||||
(define (armv4:value->r info v)
|
(define (armv4:value->r info v)
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
(if (< v 0)
|
(optimize-immediate v
|
||||||
(if (> v #x-100)
|
`(((#:immediate1 ,v) ,(string-append "mov____$i8,%" r)))
|
||||||
`(((#:immediate1 ,(- -1 v)) ,(string-append "mvn____%" r ",$i8")))
|
`(((#:immediate1 ,(- -1 v)) ,(string-append "mvn____%" r ",$i8")))
|
||||||
`((,(string-append "mov____$i32,%" r) (#:immediate ,v))))
|
`((,(string-append "mov____$i32,%" r) (#:immediate ,v))))))
|
||||||
(if (< v #x100)
|
|
||||||
`(((#:immediate1 ,v) ,(string-append "mov____$i8,%" r)))
|
|
||||||
`((,(string-append "mov____$i32,%" r) (#:immediate ,v)))))))
|
|
||||||
|
|
||||||
(define (armv4:ret . rest)
|
(define (armv4:ret . rest)
|
||||||
"Note: Pretends to be on x86 a lot"
|
"Note: Pretends to be on x86 a lot"
|
||||||
|
@ -78,15 +85,13 @@
|
||||||
(define (armv4:local->r info n)
|
(define (armv4:local->r info n)
|
||||||
(let ((r (get-r info))
|
(let ((r (get-r info))
|
||||||
(n (- 0 (* 4 n))))
|
(n (- 0 (* 4 n))))
|
||||||
(if (< n 0)
|
(optimize-immediate n
|
||||||
(if (> n #x-100)
|
`(((#:immediate1 ,n)
|
||||||
`(((#:immediate1 ,(- n))
|
,(string-append "ldr____%" r ",(%fp,+#$i8)")))
|
||||||
,(string-append "ldr____%" r ",(%fp,-#$i8)")))
|
`(((#:immediate1 ,(- n))
|
||||||
`((,(string-append "mov____0x32(%ebp),%" r) (#:immediate ,n))))
|
,(string-append "ldr____%" r ",(%fp,-#$i8)")))
|
||||||
(if (< n #x100)
|
`((,(string-append "mov____0x32(%ebp),%" r)
|
||||||
`(((#:immediate1 ,n)
|
(#:immediate ,n))))))
|
||||||
,(string-append "ldr____%" r ",(%fp,+#$i8)")))
|
|
||||||
`((,(string-append "mov____0x32(%ebp),%" r) (#:immediate ,n)))))))
|
|
||||||
|
|
||||||
(define (armv4:r0+r1 info)
|
(define (armv4:r0+r1 info)
|
||||||
(let ((r0 (get-r0 info))
|
(let ((r0 (get-r0 info))
|
||||||
|
@ -128,17 +133,13 @@
|
||||||
(define (armv4:r->local+n info id n)
|
(define (armv4:r->local+n info id n)
|
||||||
(let ((n (+ (- 0 (* 4 id)) n))
|
(let ((n (+ (- 0 (* 4 id)) n))
|
||||||
(r (get-r info)))
|
(r (get-r info)))
|
||||||
(if (< n 0)
|
(optimize-immediate n
|
||||||
(if (> n #x-100)
|
`(((#:immediate1 ,n)
|
||||||
`(((#:immediate1 ,(- n))
|
,(string-append "str____%" r ",(%fp,+#$i8)")))
|
||||||
,(string-append "str____%" r ",(%fp,-#$i8)")))
|
`(((#:immediate1 ,(- n))
|
||||||
`((,(string-append "mov____%" r ",0x32(%ebp)")
|
,(string-append "str____%" r ",(%fp,-#$i8)")))
|
||||||
(#:immediate ,n))))
|
`((,(string-append "mov____%" r ",0x32(%ebp)")
|
||||||
(if (< n #x100)
|
(#:immediate ,n))))))
|
||||||
`(((#:immediate1 ,n)
|
|
||||||
,(string-append "str____%" r ",(%fp,+#$i8)")))
|
|
||||||
`((,(string-append "mov____%" r ",0x32(%ebp)")
|
|
||||||
(#:immediate ,n)))))))
|
|
||||||
|
|
||||||
(define (armv4:r-mem-add info v)
|
(define (armv4:r-mem-add info v)
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
|
@ -148,9 +149,10 @@
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
`((,(string-append "push___%r0"))
|
`((,(string-append "push___%r0"))
|
||||||
(,(string-append "ldrb___%r0,(%" r ")"))
|
(,(string-append "ldrb___%r0,(%" r ")"))
|
||||||
,(if (< v 0)
|
,(optimize-immediate v
|
||||||
`((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%r0"))
|
`((#:immediate1 ,v) ,(string-append "add____$i8,%r0"))
|
||||||
`((#:immediate1 ,v) ,(string-append "add____$i8,%r0")))
|
`((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%r0"))
|
||||||
|
(error "armv4:r-byte-mem-add got immediate that doesn't fit into 8 bits."))
|
||||||
(,(string-append "strb___%r0,(%" r ")"))
|
(,(string-append "strb___%r0,(%" r ")"))
|
||||||
(,(string-append "pop____%r0")))))
|
(,(string-append "pop____%r0")))))
|
||||||
|
|
||||||
|
@ -158,9 +160,10 @@
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
`((,(string-append "push___%r0"))
|
`((,(string-append "push___%r0"))
|
||||||
(,(string-append "ldrh___%r0,(%" r ")"))
|
(,(string-append "ldrh___%r0,(%" r ")"))
|
||||||
,(if (< v 0)
|
,(optimize-immediate v
|
||||||
`((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%r0"))
|
`((#:immediate1 ,v) ,(string-append "add____$i8,%r0"))
|
||||||
`((#:immediate1 ,v) ,(string-append "add____$i8,%r0")))
|
`((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%r0"))
|
||||||
|
(error "armv4:r-word-mem-add got immediate that doesn't fit into 8 bits but that is not implemented."))
|
||||||
(,(string-append "strh___%r0,(%" r ")"))
|
(,(string-append "strh___%r0,(%" r ")"))
|
||||||
(,(string-append "pop____%r0")))))
|
(,(string-append "pop____%r0")))))
|
||||||
|
|
||||||
|
@ -168,13 +171,10 @@
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
(let ((n (- 0 (* 4 n))))
|
(let ((n (- 0 (* 4 n))))
|
||||||
`((,(string-append "mov____%ebp,%" r))
|
`((,(string-append "mov____%ebp,%" r))
|
||||||
,(if (< n 0)
|
,(optimize-immediate n
|
||||||
(if (> n #x-100)
|
`((#:immediate1 ,n) ,(string-append "add____$i8,%" r))
|
||||||
`((#:immediate1 ,(- n)) ,(string-append "sub____$i8,%" r))
|
`((#:immediate1 ,(- n)) ,(string-append "sub____$i8,%" r))
|
||||||
`(,(string-append "add____$i32,%" r) (#:immediate ,n)))
|
`(,(string-append "add____$i32,%" r) (#:immediate ,n)))))))
|
||||||
(if (< n #x100)
|
|
||||||
`((#:immediate1 ,n) ,(string-append "add____$i8,%" r))
|
|
||||||
`(,(string-append "add____$i32,%" r) (#:immediate ,n))))))))
|
|
||||||
|
|
||||||
(define (armv4:label->r info label)
|
(define (armv4:label->r info label)
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
|
@ -393,13 +393,10 @@
|
||||||
|
|
||||||
(define (armv4:r+value info v)
|
(define (armv4:r+value info v)
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
(if (< v 0)
|
(optimize-immediate v
|
||||||
(if (> v #x-100)
|
`(((#:immediate1 ,v) ,(string-append "add____$i8,%" r)))
|
||||||
`(((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%" r)))
|
`(((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%" r)))
|
||||||
`((,(string-append "add____$i32,%" r) (#:immediate ,v))))
|
`((,(string-append "add____$i32,%" r) (#:immediate ,v))))))
|
||||||
(if (< v #x100)
|
|
||||||
`(((#:immediate1 ,v) ,(string-append "add____$i8,%" r)))
|
|
||||||
`((,(string-append "add____$i32,%" r) (#:immediate ,v)))))))
|
|
||||||
|
|
||||||
(define (armv4:r0->r1-mem info)
|
(define (armv4:r0->r1-mem info)
|
||||||
(let ((r0 (get-r0 info))
|
(let ((r0 (get-r0 info))
|
||||||
|
@ -418,13 +415,10 @@
|
||||||
|
|
||||||
(define (armv4:r-cmp-value info v)
|
(define (armv4:r-cmp-value info v)
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
(if (< v 0)
|
(optimize-immediate v
|
||||||
(if (> v #x-100)
|
`(((#:immediate1 ,v) ,(string-append "cmp____$i8,%" r)))
|
||||||
`(((#:immediate1 ,(- v)) ,(string-append "cmn____$i8,%" r)))
|
`(((#:immediate1 ,(- v)) ,(string-append "cmn____$i8,%" r)))
|
||||||
`((,(string-append "cmp____$i32,%" r) (#:immediate ,v))))
|
`((,(string-append "cmp____$i32,%" r) (#:immediate ,v))))))
|
||||||
(if (< v #x100)
|
|
||||||
`(((#:immediate1 ,v) ,(string-append "cmp____$i8,%" r)))
|
|
||||||
`((,(string-append "cmp____$i32,%" r) (#:immediate ,v)))))))
|
|
||||||
|
|
||||||
(define (armv4:push-register info r)
|
(define (armv4:push-register info r)
|
||||||
`((,(string-append "push___%" r))))
|
`((,(string-append "push___%" r))))
|
||||||
|
@ -485,13 +479,10 @@
|
||||||
|
|
||||||
(define (armv4:r0+value info v)
|
(define (armv4:r0+value info v)
|
||||||
(let ((r0 (get-r0 info)))
|
(let ((r0 (get-r0 info)))
|
||||||
(if (< v 0)
|
(optimize-immediate v
|
||||||
(if (> v #x-100)
|
`(((#:immediate1 ,v) ,(string-append "add____$i8,%" r0)))
|
||||||
`(((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%" r0)))
|
`(((#:immediate1 ,(- v)) ,(string-append "sub____$i8,%" r0)))
|
||||||
`((,(string-append "add____$i32,%" r0) (#:immediate ,v))))
|
`((,(string-append "add____$i32,%" r0) (#:immediate ,v))))))
|
||||||
(if (< v #x100)
|
|
||||||
`(((#:immediate1 ,v) ,(string-append "add____$i8,%" r0))))
|
|
||||||
`((,(string-append "add____$i32,%" r0) (#:immediate ,v))))))
|
|
||||||
|
|
||||||
(define (armv4:value->r0 info v)
|
(define (armv4:value->r0 info v)
|
||||||
(let ((r0 (get-r0 info)))
|
(let ((r0 (get-r0 info)))
|
||||||
|
@ -500,31 +491,23 @@
|
||||||
(define (armv4:byte-r->local+n info id n)
|
(define (armv4:byte-r->local+n info id n)
|
||||||
(let* ((n (+ (- 0 (* 4 id)) n))
|
(let* ((n (+ (- 0 (* 4 id)) n))
|
||||||
(r (get-r info)))
|
(r (get-r info)))
|
||||||
`(,(if (< n 0)
|
`(,(optimize-immediate n
|
||||||
(if (> n #x-100)
|
`((#:immediate1 ,n)
|
||||||
`((#:immediate1 ,(- n))
|
,(string-append "strb___%" r ",(%fp,+#$i8)"))
|
||||||
,(string-append "strb___%" r ",(%fp,-#$i8)"))
|
`((#:immediate1 ,(- n))
|
||||||
`(,(string-append "strb___%" r ",0x32(%ebp)")
|
,(string-append "strb___%" r ",(%fp,-#$i8)"))
|
||||||
(#:immediate ,n)))
|
`(,(string-append "strb___%" r ",0x32(%ebp)")
|
||||||
(if (< n #x100)
|
(#:immediate ,n))))))
|
||||||
`((#:immediate1 ,n)
|
|
||||||
,(string-append "strb___%" r ",(%fp,+#$i8)"))
|
|
||||||
`(,(string-append "strb___%" r ",0x32(%ebp)") (#:immediate ,n)))))))
|
|
||||||
|
|
||||||
(define (armv4:word-r->local+n info id n)
|
(define (armv4:word-r->local+n info id n)
|
||||||
(let* ((n (+ (- 0 (* 4 id)) n))
|
(let* ((n (+ (- 0 (* 4 id)) n))
|
||||||
(r (get-r info)))
|
(r (get-r info)))
|
||||||
`(,(if (< n 0)
|
(optimize-immediate n
|
||||||
(if (> n #x-100)
|
`(((#:immediate1 ,n)
|
||||||
`((#:immediate1 ,(- n))
|
,(string-append "strh___%" r ",(%fp,+#$i8)")))
|
||||||
,(string-append "strh___%" r ",(%fp,-#$i8)"))
|
`(((#:immediate1 ,(- n))
|
||||||
`(,(string-append "strh___%" r ",0x32(%ebp)")
|
,(string-append "strh___%" r ",(%fp,-#$i8)")))
|
||||||
(#:immediate ,n)))
|
`((,(string-append "strh___%" r ",0x32(%ebp)"))))))
|
||||||
(if (< n #x100)
|
|
||||||
`((#:immediate1 ,n)
|
|
||||||
,(string-append "strh___%" r ",(%fp,+#$i8)"))
|
|
||||||
`(,(string-append "strh___%" r ",0x32(%ebp)")
|
|
||||||
(#:immediate ,n)))))))
|
|
||||||
|
|
||||||
(define (armv4:r-and info v)
|
(define (armv4:r-and info v)
|
||||||
(let ((r (get-r info)))
|
(let ((r (get-r info)))
|
||||||
|
|
Loading…
Reference in a new issue