IUCompilerCourse/public-student-support-code

question on `subq` argument ordering

xysun opened this issue · 0 comments

xysun commented

Hello,

I'm following the Essentials of Compilation book together with this code for the exercises. I find the ordering of subq argument is giving me surprising result, I feel I must be making a silly mistake somewhere, yet I cannot figure out where.. so here I am :)

here is my example X86Program:

(define i1 (Instr 'movq (list (Imm 0) (Reg 'rax))))
(define i2 (Instr 'subq (list (Imm 10) (Reg 'rax))))
(define instrs (list i1 i2))
(define block (Block '() instrs))
(define p (X86Program '() `((start . ,block))))
(println (interp-x86-0 p))

which essentially is

movq 0 %rax
subq 10 %rax

However, both interp-pseudo-x86-0 and interp-x86-0 gives me 10 instead of -10. If I swap the arguments to subq then I do get -10 back.

From reading both the x86 instruction quick reference from the book:

subq A, B map to B - A -> B

And in code:

(subq 2 ,(lambda (s d) (- d s)))

it seems they are consistent with my understanding of the ordering of arguments. What am I doing wrong?