? t1 Index: M3x86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/M3x86.m3,v retrieving revision 1.158 diff -u -r1.158 M3x86.m3 --- M3x86.m3 3 Mar 2010 12:10:35 -0000 1.158 +++ M3x86.m3 6 Mar 2010 12:38:14 -0000 @@ -1704,6 +1704,7 @@ (* s0.z := Mem [s0.A + o].t *) VAR newreg: ARRAY OperandPart OF Regno; size: OperandSize; + regset: RegSet; BEGIN IF u.debug THEN u.wr.Cmd ("load_indirect"); @@ -1716,7 +1717,7 @@ u.vstack.unlock(); WITH stack0 = u.vstack.pos(0, "load_indirect") DO - u.vstack.find(stack0, Force.anyreg, RegSet {}, TRUE); + u.vstack.find(stack0, Force.anyreg, AllRegisters, TRUE); IF Target.FloatType [t] THEN u.cg.f_loadind(u.vstack.op(stack0), o, t); u.vstack.dealloc_reg(stack0, operandPart := 0); @@ -1727,17 +1728,16 @@ (* allocate the registers *) + IF CG_Bytes[t] = 1 THEN + <* ASSERT size = 1 *> + regset := RegistersForByteOperations; + ELSE + regset := AllRegisters; + END; + FOR i := 0 TO size - 1 DO - IF CG_Bytes[t] = 1 THEN - <* ASSERT i = 0 AND size = 1 *> - newreg[i] := u.vstack.freereg(RegistersForByteOperations, operandPart := i); - ELSE - IF i = 0 THEN - newreg[i] := u.vstack.freereg(operandPart := i); - ELSE - newreg[i] := u.vstack.freereg(AllRegisters - RegSet{newreg[0]}, operandPart := i); - END; - END; + newreg[i] := u.vstack.freereg(regset, operandPart := i); + regset := (regset - RegSet{newreg[i]}); <* ASSERT newreg[i] # -1 *> END; @@ -1774,7 +1774,7 @@ WITH (* stack0 = u.vstack.pos(0, "store_indirect"), *) stack1 = u.vstack.pos(1, "store_indirect") DO IF Target.FloatType [t] THEN - u.vstack.find(stack1, Force.anyreg, RegSet {}, TRUE); + u.vstack.find(stack1, Force.anyreg, AllRegisters, TRUE); u.cg.f_storeind(u.vstack.op(stack1), o, t); u.vstack.discard(2); ELSE @@ -2824,8 +2824,8 @@ u.vstack.find(stack0, Force.regset, RegSet { ESI } ); u.vstack.find(stack1, Force.regset, RegSet { EDI } ); ELSE - u.vstack.find(stack0, Force.anyreg, RegSet {}, TRUE); - u.vstack.find(stack1, Force.anyreg, RegSet {}, TRUE); + u.vstack.find(stack0, Force.anyreg, AllRegisters, TRUE); + u.vstack.find(stack1, Force.anyreg, AllRegisters, TRUE); END END; @@ -2865,8 +2865,8 @@ PROCEDURE zero_n (u: U; z: IType; t: MType) = (* Mem[s1.A:s0.z] := 0; pop(2) *) - VAR n: INTEGER; - shift: TIntN.T; +(*VAR n: INTEGER; + shift: TIntN.T;*) BEGIN IF u.debug THEN u.wr.Cmd ("zero_n"); @@ -2879,7 +2879,6 @@ (* zero_n is implemented incorrectly in the gcc backend, * therefore it must not be used. - *) WITH stack0 = u.vstack.pos(0, "zero_n") DO IF u.vstack.loc(stack0) = OLoc.imm THEN @@ -2917,6 +2916,7 @@ call_int_proc (u, Builtin.memset); u.vstack.discard(1); + *) END zero_n; PROCEDURE zero (u: U; n: INTEGER; t: MType) = @@ -2969,7 +2969,7 @@ ELSE WITH stack0 = u.vstack.pos(0, "zero"), stop0 = u.vstack.op(stack0) DO - u.vstack.find(stack0, Force.anyreg, RegSet {}, TRUE); + u.vstack.find(stack0, Force.anyreg, AllRegisters, TRUE); FOR i := 0 TO n - 1 DO u.cg.store_ind(Operand { loc := OLoc.imm, imm := TZero, optype := t }, stop0, i * size, faketype[size]); @@ -3108,7 +3108,7 @@ reportfault(u, code); END ELSE - u.vstack.find(stack0, Force.anyreg, RegSet {}, TRUE); + u.vstack.find(stack0, Force.anyreg, AllRegisters, TRUE); IF NOT u.vstack.non_nil(u.vstack.reg(stack0)) THEN u.cg.immOp(Op.oCMP, u.vstack.op(stack0), TZero); @@ -3422,7 +3422,7 @@ END; u.vstack.set_imm(stack0, imm_plus_i); ELSE - u.vstack.find(stack0, Force.anytemp, RegSet {}, TRUE); + u.vstack.find(stack0, Force.anytemp, AllRegisters, TRUE); u.cg.immOp(Op.oADD, u.vstack.op(stack0), ti); @@ -3654,7 +3654,7 @@ (* if the struct is "small", use a few load/push to copy it to the machine stack *) - u.vstack.find(stack0, Force.anyreg, RegSet {}, TRUE); + u.vstack.find(stack0, Force.anyreg, AllRegisters, TRUE); WITH temp = u.vstack.freereg(operandPart := 0) DO FOR i := 1 TO (s DIV 4) DO Index: Stackx86.i3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.i3,v retrieving revision 1.25 diff -u -r1.25 Stackx86.i3 --- Stackx86.i3 2 Mar 2010 12:52:29 -0000 1.25 +++ Stackx86.i3 6 Mar 2010 12:38:14 -0000 @@ -12,8 +12,8 @@ FROM M3CG_Ops IMPORT ErrorHandler; IMPORT M3x86Rep, Codex86, Wrx86, TIntN; -FROM M3x86Rep IMPORT Operand, OLoc, MVar, Regno, Force, RegSet, FlToInt; -FROM M3x86Rep IMPORT x86Proc, x86Var, OperandPart; +FROM M3x86Rep IMPORT Operand, OLoc, MVar, Regno, Force, FlToInt; +FROM M3x86Rep IMPORT x86Proc, x86Var, OperandPart, AllRegisters; FROM Codex86 IMPORT Op; @@ -30,9 +30,9 @@ releaseall (); all_to_mem (); lock (r: Regno); - find (stackp: INTEGER; force: Force; set := RegSet {}; + find (stackp: INTEGER; force: Force; set := AllRegisters; hintaddr := FALSE); - freereg (set := RegSet {}; operandPart: OperandPart): Regno; + freereg (set := AllRegisters; operandPart: OperandPart): Regno; set_reg (stackp: INTEGER; r: Regno; operandPart: OperandPart); set_type (stackp: INTEGER; type: Type); dealloc_reg (stackp: INTEGER; operandPart: OperandPart); @@ -46,7 +46,7 @@ discard (depth: INTEGER); set_error_handler (err: ErrorHandler); push (READONLY mvar: MVar); - pushnew (type: MType; force: Force; set := RegSet {}); + pushnew (type: MType; force: Force; set := AllRegisters); pushimmI (imm: INTEGER; type: Type); pushimmT (imm: TIntN.T; type: Type); pop (READONLY mvar: MVar); Index: Stackx86.m3 =================================================================== RCS file: /usr/cvs/cm3/m3-sys/m3back/src/Stackx86.m3,v retrieving revision 1.111 diff -u -r1.111 Stackx86.m3 --- Stackx86.m3 2 Mar 2010 14:14:03 -0000 1.111 +++ Stackx86.m3 6 Mar 2010 12:38:15 -0000 @@ -17,9 +17,9 @@ FROM M3CG IMPORT Type, MType, ZType, IType, Sign, Label, ByteOffset; FROM M3CG_Ops IMPORT ErrorHandler; -FROM M3x86Rep IMPORT Operand, MVar, Regno, OLoc, VLoc, NRegs, Force, TypeIs64, OperandPart, RegName, OperandSize, TZero; +FROM M3x86Rep IMPORT Operand, MVar, Regno, OLoc, VLoc, NRegs, Force, TypeIs64, OperandPart, RegName, OperandSize, TZero, AllRegisters; FROM M3x86Rep IMPORT RegistersForByteOperations, RegSet, FlToInt, x86Var, x86Proc, NoStore, SplitOperand, SplitMVar, GetTypeSize, GetOperandSize; -FROM M3x86Rep IMPORT TypeIsSigned, TypeIsUnsigned, EAX, ECX, EDX, EBX, ESI, EDI, UnsignedType, MaximumShift, MinimumShift, BitCountMask, IntType; +FROM M3x86Rep IMPORT TypeIsSigned, TypeIsUnsigned, EAX, ECX, EDX, EBX, UnsignedType, MaximumShift, MinimumShift, BitCountMask, IntType; FROM Codex86 IMPORT Op, FOp, Cond, revcond; @@ -283,7 +283,7 @@ PROCEDURE find (t: T; stackp: INTEGER; - force: Force := Force.any; set := RegSet {}; + force: Force := Force.any; set := AllRegisters; hintaddr := FALSE) = (* Find a suitable register to put a stack item in *) VAR in: ARRAY OperandPart OF Regno; (* initialize to -1? *) @@ -299,10 +299,6 @@ size := SplitOperand(op, opA); IF size = 2 THEN - IF set = RegSet{} THEN - (* Why? Probably because of the set subtraction below (pickreg). *) - set := RegSet{EAX, EBX, ECX, EDX, ESI, EDI}; - END; ret64 := (force = Force.regset AND set = RegSet{EAX, EDX}); END; @@ -367,11 +363,7 @@ IF op.loc = OLoc.mem AND CG_Bytes[op.mvar.mvar_type] = 1 THEN force := Force.regset; - IF set = RegSet {} THEN - set := RegistersForByteOperations; - ELSE - set := set * RegistersForByteOperations; - END + set := set * RegistersForByteOperations; END; (* If for any reason it isn't in the right register, find the best @@ -481,7 +473,7 @@ t.reguse[to[size - 1]].locked := TRUE; END find; -PROCEDURE freereg (t: T; set := RegSet {}; operandPart: OperandPart): Regno = +PROCEDURE freereg (t: T; set := AllRegisters; operandPart: OperandPart): Regno = VAR to: Regno; BEGIN to := pickreg(t, set); @@ -518,12 +510,12 @@ RETURN bestreg; END finddead; -PROCEDURE pickreg (t: T; set: RegSet:= RegSet {}; hintaddr := FALSE): Regno = +PROCEDURE pickreg (t: T; set: RegSet:= AllRegisters; hintaddr := FALSE): Regno = VAR minprec := HighPrec; bestreg: Regno := -1; BEGIN FOR i := 0 TO NRegs DO - IF set = RegSet {} OR i IN set THEN + IF i IN set THEN WITH prec = precedence(t, i, hintaddr) DO IF prec < minprec THEN minprec := prec; @@ -536,7 +528,7 @@ RETURN bestreg; END pickreg; -PROCEDURE inreg (t: T; READONLY v: MVar; set: RegSet:= RegSet {}): Regno = +PROCEDURE inreg (t: T; READONLY v: MVar; set: RegSet:= AllRegisters): Regno = VAR minprec := HighPrec * HighPrec; prec := 0; bestreg: Regno := -1; @@ -549,7 +541,7 @@ FOR i := 0 TO NRegs DO IF t.reguse[i].last_store # NoStore AND v = t.reguse[i].last_store THEN prec := precedence(t, i); - IF (set # RegSet {}) AND (NOT i IN set) THEN + IF NOT i IN set THEN prec := prec * HighPrec; END; IF prec < minprec THEN @@ -561,7 +553,7 @@ RETURN bestreg; END inreg; -PROCEDURE immreg (t: T; READONLY imm: TIntN.T; set: RegSet:= RegSet {}): Regno = +PROCEDURE immreg (t: T; READONLY imm: TIntN.T; set: RegSet:= AllRegisters): Regno = VAR minprec := HighPrec * HighPrec; prec := 0; bestreg: Regno := -1; @@ -569,7 +561,7 @@ FOR i := 0 TO NRegs DO IF t.reguse[i].imm AND TIntN.EQ(imm, t.reguse[i].last_imm) THEN prec := precedence(t, i); - IF (set # RegSet {}) AND (NOT i IN set) THEN + IF NOT i IN set THEN prec := prec * HighPrec; END; IF prec < minprec THEN @@ -816,7 +808,7 @@ END; END pushnew1; -PROCEDURE pushnew (t: T; type: MType; force: Force; set := RegSet {}) = +PROCEDURE pushnew (t: T; type: MType; force: Force; set := AllRegisters) = BEGIN maybe_expand_stack(t); IF TypeIs64(type) AND force = Force.regset AND set = RegSet { EAX, EDX } THEN @@ -843,7 +835,7 @@ IF FloatType [src_mvar.mvar_type] THEN IF src_mvar.var.loc = VLoc.temp AND src_mvar.var.parent # t.current_proc THEN unlock(t); - indreg := pickreg(t, RegSet {}, TRUE); + indreg := pickreg(t, AllRegisters, TRUE); corrupt(t, indreg, operandPart := 0); t.cg.get_frame(indreg, src_mvar.var.parent, t.current_proc); @@ -859,15 +851,15 @@ FOR i := 0 TO srcSize - 1 DO IF CG_Bytes[src_mvar.mvar_type] = 1 THEN <* ASSERT srcSize = 1 AND i = 0 *> - destreg[i] := pickreg(t, RegSet{EAX, EBX, ECX, EDX}); + destreg[i] := pickreg(t, RegistersForByteOperations); ELSE - destreg[i] := pickreg(t, RegSet {}, src_mvar.mvar_type = Type.Addr); + destreg[i] := pickreg(t, AllRegisters, src_mvar.mvar_type = Type.Addr); END; corrupt(t, destreg[i], operandPart := i); t.reguse[destreg[i]].locked := TRUE; END; - indreg := pickreg(t, RegSet {}, TRUE); + indreg := pickreg(t, AllRegisters, TRUE); corrupt(t, indreg, operandPart := 0); t.cg.get_frame(indreg, src_mvar.var.parent, t.current_proc); @@ -902,7 +894,7 @@ IF src_stack0.loc = OLoc.fstack THEN IF dest_mvar.var.loc = VLoc.temp AND dest_mvar.var.parent # t.current_proc THEN unlock(t); - indreg := pickreg(t, RegSet {}, TRUE); + indreg := pickreg(t, AllRegisters, TRUE); corrupt(t, indreg, operandPart := 0); t.cg.get_frame(indreg, dest_mvar.var.parent, t.current_proc); t.cg.f_storeind(t.cg.reg[indreg], dest_mvar.mvar_offset + dest_mvar.var.offset, dest_mvar.mvar_type); @@ -928,7 +920,7 @@ <* ASSERT srcSize = destSize *> IF dest_mvar.var.loc = VLoc.temp AND dest_mvar.var.parent # t.current_proc THEN - indreg := pickreg(t, RegSet {}, TRUE); + indreg := pickreg(t, AllRegisters, TRUE); corrupt(t, indreg, operandPart := 0); t.cg.get_frame(indreg, dest_mvar.var.parent, t.current_proc); FOR i := 0 TO destSize - 1 DO @@ -1109,7 +1101,7 @@ BEGIN WITH stack0 = pos(t, 0, "store_indirect"), stack1 = pos(t, 1, "store_indirect") DO - find(t, stack1, Force.any, RegSet {}, TRUE); + find(t, stack1, Force.any, AllRegisters, TRUE); IF CG_Bytes[type] = 1 AND t.vstack[stack0].loc # OLoc.imm THEN find(t, stack0, Force.regset, RegistersForByteOperations); ELSE @@ -1117,7 +1109,7 @@ END; IF t.vstack[stack1].loc # OLoc.register THEN - find(t, stack1, Force.anyreg, RegSet {}, TRUE); + find(t, stack1, Force.anyreg, AllRegisters, TRUE); END; t.cg.store_ind(t.vstack[stack0], t.vstack[stack1], o, type); @@ -2256,7 +2248,7 @@ stop0 = t.vstack[stack0], stop1 = t.vstack[stack1] DO find(t, stack0, Force.any); - find(t, stack1, Force.anyreg, RegSet {}, TRUE); + find(t, stack1, Force.anyreg, AllRegisters, TRUE); IF stop0.loc = OLoc.imm THEN IF NOT TIntN.FromHostInteger(size, Target.Integer.bytes, tsize) THEN