Ken Wakita (https://wakita.github.io/fp2018/)
| NonTail(x), Set(i) -> Printf.fprintf oc "\tmovl\t$%d, %s\n" i x
| NonTail(x), Mov(y) ->
if x <> y then Printf.fprintf oc "\tmovl\t%s, %s\n" y x
| NonTail(x), Neg(y) ->
if x <> y then Printf.fprintf oc "\tmovl\t%s, %s\n" y x;
Printf.fprintf oc "\tnegl\t%s\n" x
| NonTail(x), Add(y, z') ->
if V(x) = z' then
Printf.fprintf oc "\taddl\t%s, %s\n" y x
else
(if x <> y then Printf.fprintf oc "\tmovl\t%s, %s\n" y x;
Printf.fprintf oc "\taddl\t%s, %s\n" (pp_id_or_imm z') x)
| NonTail(a), CallDir(Id.L(x), ys, zs) ->
g'_args oc [] ys zs;
let ss = stacksize () in
if ss > 0 then Printf.fprintf oc "\taddl\t$%d, %s\n" ss reg_sp;
Printf.fprintf oc "\tcall\t%s\n" x;
if ss > 0 then Printf.fprintf oc "\tsubl\t$%d, %s\n" ss reg_sp;
if List.mem a allregs && a <> regs.(0) then
Printf.fprintf oc "\tmovl\t%s, %s\n" regs.(0) a
else if List.mem a allfregs && a <> fregs.(0) then
Printf.fprintf oc "\tmovsd\t%s, %s\n" fregs.(0) a
| NonTail(a), CallCls(x, ys, zs) ->
g'_args oc [(x, reg_cl)] ys zs;
let ss = stacksize () in
if ss > 0 then Printf.fprintf oc "\taddl\t$%d, %s\n" ss reg_sp;
Printf.fprintf oc "\tcall\t*(%s)\n" reg_cl;
if ss > 0 then Printf.fprintf oc "\tsubl\t$%d, %s\n" ss reg_sp;
if List.mem a allregs && a <> regs.(0) then
Printf.fprintf oc "\tmovl\t%s, %s\n" regs.(0) a
else if List.mem a allfregs && a <> fregs.(0) then
Printf.fprintf oc "\tmovsd\t%s, %s\n" fregs.(0) a