|
@@ -145,9 +145,7 @@ unit cgcpu;
|
|
offset : longint);
|
|
offset : longint);
|
|
|
|
|
|
begin
|
|
begin
|
|
- { how can we create asmsymbols which contain a name and an offset? }
|
|
|
|
- { (JM) }
|
|
|
|
- runerror(211);
|
|
|
|
|
|
+ list.concat(taicpu.op_sym_ofs(A_CALL,S_NO,newasmsymbol(s),offset));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -163,13 +161,23 @@ unit cgcpu;
|
|
longint(a),reg))
|
|
longint(a),reg))
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_load_const_ref(list : taasmoutput; size: tcgsize; a : aword;const ref : treference);
|
|
procedure tcg386.a_load_const_ref(list : taasmoutput; size: tcgsize; a : aword;const ref : treference);
|
|
|
|
|
|
begin
|
|
begin
|
|
- list.concat(taicpu.op_const_ref(A_MOV,TCGSize2OpSize[size],
|
|
|
|
- longint(a),newreference(ref)));
|
|
|
|
|
|
+ { zero is often used several times in succession -> load it in a }
|
|
|
|
+ { register and then store it to memory, so the optimizer can then }
|
|
|
|
+ { remove the unnecessary loads of registers and you get smaller }
|
|
|
|
+ { (and faster) code }
|
|
|
|
+ if (a = 0) and
|
|
|
|
+ (size in [OS_32,OS_S32]) then
|
|
|
|
+ inherited a_load_const_ref(list,size,a,ref)
|
|
|
|
+ else
|
|
|
|
+ list.concat(taicpu.op_const_ref(A_MOV,TCGSize2OpSize[size],
|
|
|
|
+ longint(a),newreference(ref)));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_load_reg_ref(list : taasmoutput; size: TCGSize; reg : tregister;const ref : treference);
|
|
procedure tcg386.a_load_reg_ref(list : taasmoutput; size: TCGSize; reg : tregister;const ref : treference);
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -177,6 +185,7 @@ unit cgcpu;
|
|
newreference(ref)));
|
|
newreference(ref)));
|
|
End;
|
|
End;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref: treference;reg : tregister);
|
|
procedure tcg386.a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref: treference;reg : tregister);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -193,14 +202,16 @@ unit cgcpu;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);
|
|
procedure tcg386.a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);
|
|
|
|
|
|
var
|
|
var
|
|
op: tasmop;
|
|
op: tasmop;
|
|
s: topsize;
|
|
s: topsize;
|
|
|
|
+
|
|
begin
|
|
begin
|
|
- sizes2load(size,regsize(reg1),op,s);
|
|
|
|
- if (reg1 = reg2) then
|
|
|
|
|
|
+ sizes2load(size,regsize(reg2),op,s);
|
|
|
|
+ if (makereg32(reg1) = makereg32(reg2)) then
|
|
{ "mov reg1, reg1" doesn't make sense }
|
|
{ "mov reg1, reg1" doesn't make sense }
|
|
if op = A_MOV then
|
|
if op = A_MOV then
|
|
exit
|
|
exit
|
|
@@ -208,18 +219,19 @@ unit cgcpu;
|
|
case size of
|
|
case size of
|
|
OS_8:
|
|
OS_8:
|
|
begin
|
|
begin
|
|
- list.concat(taicpu.op_const_reg(A_AND,S_L,255,makereg32(reg1)));
|
|
|
|
|
|
+ list.concat(taicpu.op_const_reg(A_AND,regsize(reg2),255,reg2));
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
OS_16:
|
|
OS_16:
|
|
begin
|
|
begin
|
|
- list.concat(taicpu.op_const_reg(A_AND,S_L,65535,reg2));
|
|
|
|
|
|
+ list.concat(taicpu.op_const_reg(A_AND,S_L,65535,reg1));
|
|
exit;
|
|
exit;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
list.concat(taicpu.op_reg_reg(op,s,reg1,reg2));
|
|
list.concat(taicpu.op_reg_reg(op,s,reg1,reg2));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister);
|
|
procedure tcg386.a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -286,6 +298,7 @@ unit cgcpu;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_op_const_ref(list : taasmoutput; Op: TOpCG; size: TCGSize; a: AWord; const ref: TReference);
|
|
procedure tcg386.a_op_const_ref(list : taasmoutput; Op: TOpCG; size: TCGSize; a: AWord; const ref: TReference);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -381,6 +394,7 @@ unit cgcpu;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcg386.a_op_ref_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; const ref: TReference; reg: TRegister);
|
|
procedure tcg386.a_op_ref_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; const ref: TReference; reg: TRegister);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -670,7 +684,10 @@ begin
|
|
end.
|
|
end.
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.1 2001-09-28 20:39:33 jonas
|
|
|
|
|
|
+ Revision 1.2 2001-09-29 21:32:19 jonas
|
|
|
|
+ * fixed bug in a_load_reg_reg + implemented a_call
|
|
|
|
+
|
|
|
|
+ Revision 1.1 2001/09/28 20:39:33 jonas
|
|
* changed all flow control structures (except for exception handling
|
|
* changed all flow control structures (except for exception handling
|
|
related things) to processor independent code (in new ncgflw unit)
|
|
related things) to processor independent code (in new ncgflw unit)
|
|
+ generic cgobj unit which contains lots of code generator helpers with
|
|
+ generic cgobj unit which contains lots of code generator helpers with
|