diff options
Diffstat (limited to 'src/cljcc')
| -rw-r--r-- | src/cljcc/compiler.clj | 9 |
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. |
