+
+ fun ophit (X.OSIZE (s, oo)) = let val (insns, p) = ophit (X.stripsize oo) in (insns, X.OSIZE (s, p)) end
+ | ophit (X.REL(op1, op2)) =
+ let
+ val t1 = X.stripsize op1
+ val (s, t2) = X.sizeoper op2
+ in
+ if (isspilled t1 andalso isspilled t2) then
+ ([X.MOV (X.OSIZE (s, X.REG spillreg1), stackoper t2),
+ X.ADD (X.OSIZE (X.Qword, X.REG spillreg1), stackoper t1)],
+ X.REL (X.REG spillreg1, X.CONST 0w0))
+ else if(isspilled t1) then
+ ([X.MOV (X.OSIZE (X.Qword, X.REG spillreg1), stackoper t1)],
+ X.REL (X.REG spillreg1, realoper t2))
+ else if(isspilled t2) then
+ ([X.MOV (X.OSIZE (s, X.REG spillreg1), stackoper t2)],
+ X.REL (realoper t1, X.REG spillreg1))
+ else
+ ([],
+ X.REL (realoper t1, realoper t2))
+ end
+ | ophit a = (nil, realoper a handle Spilled => stackoper a)
+