+(define (codegen-binop opcode)
+ (lambda (a b si env)
+ (codegen-expr b si env)
+ (emit "movq %rax, ~a(%rsp)" si)
+ (codegen-expr a (- si wordsize) env)
+ (emit "~a ~a(%rsp), %rax" opcode si)))
+
+(define codegen-sub (codegen-binop "sub"))
+(define codegen-mul (codegen-binop "imul"))
+
+(define (codegen-not x si env)
+ (codegen-expr x si env)
+ (emit "xorq $-1, %rax")
+ (emit "andq $1, %rax"))
+