wip: Improve register allocations and its test coverage
This commit is contained in:
parent
8a4948475c
commit
195cfbd248
|
|
@ -34,20 +34,27 @@
|
||||||
(define reg-dest (generate-regs (length instr-args) (length instr-dest)))
|
(define reg-dest (generate-regs (length instr-args) (length instr-dest)))
|
||||||
(append (generate-ldr instr-args stack-map)
|
(append (generate-ldr instr-args stack-map)
|
||||||
(list (AArch64-instr-from-dest-args instr reg-dest reg-args))
|
(list (AArch64-instr-from-dest-args instr reg-dest reg-args))
|
||||||
(generate-str instr-dest stack-map))))
|
(if (empty? instr-dest)
|
||||||
|
'()
|
||||||
|
(generate-str (generate-reg-n (length instr-args))
|
||||||
|
(car instr-dest)
|
||||||
|
stack-map)))))
|
||||||
|
|
||||||
(define (generate-regs start len)
|
(define (generate-regs start len)
|
||||||
(map (lambda (i)
|
(map generate-reg-n
|
||||||
(Reg (string->symbol (string-append "x" (number->string i)))))
|
|
||||||
(range start (+ start len))))
|
(range start (+ start len))))
|
||||||
|
|
||||||
|
(define (generate-reg-n n)
|
||||||
|
(Reg (string->symbol (string-append "x" (number->string n)))))
|
||||||
|
|
||||||
(define (generate-ldr var-list stack-map)
|
(define (generate-ldr var-list stack-map)
|
||||||
(for/list ([var var-list]
|
(for/list ([var var-list]
|
||||||
[reg (generate-regs 0 (length var-list))])
|
[reg (generate-regs 0 (length var-list))])
|
||||||
(Ldr (AMOffset 'sp (hash-ref stack-map (Var-var-name var))) reg)))
|
(Ldr (AMOffset 'sp (hash-ref stack-map (Var-var-name var))) reg)))
|
||||||
|
|
||||||
(define (generate-str var-list stack-map)
|
(define (generate-str reg dest-var stack-map)
|
||||||
(list))
|
(list
|
||||||
|
(Str reg (AMOffset 'sp (hash-ref stack-map (Var-var-name dest-var))))))
|
||||||
|
|
||||||
|
|
||||||
; generate stack read/writes and allocate registers for
|
; generate stack read/writes and allocate registers for
|
||||||
|
|
|
||||||
|
|
@ -30,5 +30,13 @@
|
||||||
-16)
|
-16)
|
||||||
(list (Ldr (AMOffset 'sp 0) (Reg 'x0))
|
(list (Ldr (AMOffset 'sp 0) (Reg 'x0))
|
||||||
(Ldr (AMOffset 'sp -8) (Reg 'x1))
|
(Ldr (AMOffset 'sp -8) (Reg 'x1))
|
||||||
(Add (Reg 'x0) (Reg 'x1) (Reg 'x2))))))))
|
(Add (Reg 'x0) (Reg 'x1) (Reg 'x2))
|
||||||
|
(Str (Reg 'x2) (AMOffset 'sp -16)))))
|
||||||
|
(test-case
|
||||||
|
"RetDefault"
|
||||||
|
(check-equal?
|
||||||
|
(allocate-regs-std-instr! (RetDefault)
|
||||||
|
(make-hash)
|
||||||
|
0)
|
||||||
|
(list (RetDefault)))))))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue