wip: Improve register allocations and its test coverage

This commit is contained in:
Enrico Lumetti 2022-08-21 01:35:30 +02:00
parent 8a4948475c
commit 195cfbd248
2 changed files with 23 additions and 8 deletions

View File

@ -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

View File

@ -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)))))))