aboutsummaryrefslogtreecommitdiff
path: root/src/cljcc
diff options
context:
space:
mode:
authorShagun Agrawal <agrawalshagun07@gmail.com>2024-10-30 23:30:18 +0530
committerShagun Agrawal <agrawalshagun07@gmail.com>2024-10-30 23:30:18 +0530
commitd13573f67bb643132482acee98242b4043f12ac1 (patch)
treeab374cb38a27d0e7c57e5fdf32672cf33bb1382c /src/cljcc
parenta94b482b001d99ecffdb31067319773cbde4501e (diff)
Fix stack allocation bug
Error in rounding stack allocator to nearest 16 divisible value Pass all tests in chapter 9 Used as reference https://github.com/nlsandler/nqcc2
Diffstat (limited to 'src/cljcc')
-rw-r--r--src/cljcc/compiler.clj9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/cljcc/compiler.clj b/src/cljcc/compiler.clj
index c1af6de..17da6cf 100644
--- a/src/cljcc/compiler.clj
+++ b/src/cljcc/compiler.clj
@@ -372,9 +372,12 @@
Stack space allocated needs to be a multiple of 16. Rouding up the size of
stack frame makes it easier to maintain stack alignment during function calls."
[{instructions :instructions max-stack-val :max-stack-val}]
- (let [stack-abs (abs max-stack-val)
- stack-value (- (+ stack-abs (mod stack-abs 16)))]
- (cons (allocate-stack-instruction stack-value) instructions)))
+ (let [v (abs max-stack-val)
+ v (cond
+ (= (mod v 16) 0) v
+ (< v 0) (- v (- 16 (mod v 16)))
+ :else (+ v (- 16 (mod v 16))))]
+ (cons (allocate-stack-instruction v) instructions)))
(defn- parameters->assembly-instructions
"Moves parameters from registers and stacks to pseudoregisters.