aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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.