summaryrefslogtreecommitdiff
path: root/riscv/trunk/compiler/riscv32/cgcpu.pas
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/trunk/compiler/riscv32/cgcpu.pas')
-rw-r--r--riscv/trunk/compiler/riscv32/cgcpu.pas132
1 files changed, 15 insertions, 117 deletions
diff --git a/riscv/trunk/compiler/riscv32/cgcpu.pas b/riscv/trunk/compiler/riscv32/cgcpu.pas
index 0547c6dbfb..b1830b938b 100644
--- a/riscv/trunk/compiler/riscv32/cgcpu.pas
+++ b/riscv/trunk/compiler/riscv32/cgcpu.pas
@@ -37,27 +37,15 @@ unit cgcpu;
procedure init_register_allocators;override;
procedure done_register_allocators;override;
- procedure a_op_const_reg(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; reg: TRegister); override;
- procedure a_op_reg_reg(list : TAsmList; Op: TOpCG; size: TCGSize; src, dst: TRegister); override;
-
- procedure a_op_const_reg_reg(list: TAsmList; op: TOpCg; size: tcgsize; a: tcgint; src, dst: tregister); override;
- procedure a_op_reg_reg_reg(list: TAsmList; op: TOpCg; size: tcgsize; src1, src2, dst: tregister); override;
-
{ move instructions }
procedure a_load_reg_reg(list : TAsmList; fromsize, tosize : tcgsize;reg1,reg2 : tregister);override;
- { comparison operations }
- procedure a_cmp_const_reg_label(list: TAsmList; size: tcgsize; cmp_op: topcmp; a: tcgint; reg: tregister; l: tasmlabel); override;
-
{ 32x32 to 64 bit multiplication }
procedure a_mul_reg_reg_pair(list: TAsmList;size: tcgsize; src1,src2,dstlo,dsthi: tregister); override;
procedure g_proc_entry(list : TAsmList;localsize : longint;nostackframe:boolean);override;
procedure g_proc_exit(list : TAsmList;parasize : longint;nostackframe:boolean); override;
- procedure g_save_registers(list: TAsmList); override;
- procedure g_restore_registers(list: TAsmList); override;
-
procedure g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : tcgint);override;
@@ -73,14 +61,6 @@ unit cgcpu;
procedure create_codegen;
- const
- TOpCG2AsmConstOp: Array[topcg] of TAsmOp = (A_NONE,
- A_NONE,A_ADDI,A_ANDI,A_NONE,A_NONE,A_NONE,A_NONE,
- A_None,A_None,A_ORI,A_SRAI,A_SLLI,A_SRLI,A_NONE,A_XORI,A_None,A_None);
- TOpCG2AsmOp: Array[topcg] of TAsmOp = (A_NONE,
- A_NONE,A_ADD,A_AND,A_DIVU,A_DIV,A_MUL,A_MUL,
- A_None,A_None,A_OR,A_SRA,A_SLL,A_SRL,A_SUB,A_XOR,A_None,A_None);
-
implementation
uses
@@ -101,12 +81,12 @@ unit cgcpu;
RS_X9,RS_X27,RS_X26,RS_X25,RS_X24,RS_X23,RS_X22,
RS_X21,RS_X20,RS_X19,RS_X18],first_int_imreg,[]);
rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE,
- [RS_F10,RS_F11,RS_F12,RS_F13,RS_F14,RS_F15,RS_F16,RS_F17,
- RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,
- RS_F28,RS_F29,RS_F30,RS_F31,
- RS_F8,RS_F9,
- RS_F27,
- RS_F26,RS_F25,RS_F24,RS_F23,RS_F22,RS_F21,RS_F20,RS_F19,RS_F18],first_fpu_imreg,[]);
+ [RS_F10,RS_F11,RS_F12,RS_F13,RS_F14,RS_F15,RS_F16,RS_F17,
+ RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,
+ RS_F28,RS_F29,RS_F30,RS_F31,
+ RS_F8,RS_F9,
+ RS_F27,
+ RS_F26,RS_F25,RS_F24,RS_F23,RS_F22,RS_F21,RS_F20,RS_F19,RS_F18],first_fpu_imreg,[]);
end;
@@ -152,84 +132,6 @@ unit cgcpu;
end;
- procedure tcgrv32.a_cmp_const_reg_label(list: TAsmList; size: tcgsize; cmp_op: topcmp; a: tcgint; reg: tregister; l: tasmlabel);
- var
- reg1: TRegister;
- ai: taicpu;
- begin
- if a=0 then
- begin
- reg1:=NR_X0;
- if TOpCmp2AsmCond[cmp_op]=C_None then
- begin
- cmp_op:=swap_opcmp(cmp_op);
- reg1:=reg;
- reg:=NR_X0;
- end;
-
- ai:=taicpu.op_reg_reg_sym_ofs(A_Bxx,reg,reg1,l,0);
- ai.is_jmp:=true;
- ai.condition:=TOpCmp2AsmCond[cmp_op];
- list.concat(ai);
- end
- else
- inherited;
- end;
-
-
- procedure tcgrv32.a_op_const_reg(list : TAsmList; Op: TOpCG; size: TCGSize; a: tcgint; reg: TRegister);
- begin
- a_op_const_reg_reg(list,op,size,a,reg,reg);
- end;
-
-
- procedure tcgrv32.a_op_reg_reg(list : TAsmList; Op: TOpCG; size: TCGSize; src, dst: TRegister);
- begin
- a_op_reg_reg_reg(list,op,size,src,dst,dst);
- end;
-
-
- procedure tcgrv32.a_op_const_reg_reg(list: TAsmList; op: TOpCg; size: tcgsize; a: tcgint; src, dst: tregister);
- var
- tmpreg: TRegister;
- begin
- optimize_op_const(size,op,a);
-
- if op=OP_NONE then exit;
-
- if op=OP_SUB then
- begin
- op:=OP_ADD;
- a:=-a;
- end;
-
- if (TOpCG2AsmConstOp[op]<>A_None) and
- is_imm12(a) then
- list.concat(taicpu.op_reg_reg_const(TOpCG2AsmConstOp[op],dst,src,a))
- else
- begin
- tmpreg:=getintregister(list,size);
- a_load_const_reg(list,size,a,tmpreg);
- a_op_reg_reg_reg(list,op,size,tmpreg,src,dst);
- end;
- end;
-
-
- procedure tcgrv32.a_op_reg_reg_reg(list: TAsmList; op: TOpCg; size: tcgsize; src1, src2, dst: tregister);
- begin
- case op of
- OP_NOT:
- list.concat(taicpu.op_reg_reg_const(A_XORI,dst,src1,-1));
- OP_NEG:
- list.concat(taicpu.op_reg_reg_reg(A_SUB,dst,NR_X0,src1));
- OP_MOVE:
- list.concat(taicpu.op_reg_reg_const(A_ADDI,dst,src1,0));
- else
- list.concat(taicpu.op_reg_reg_reg(TOpCG2AsmOp[op],dst,src2,src1));
- end;
- end;
-
-
procedure tcgrv32.a_mul_reg_reg_pair(list: TAsmList;size: tcgsize; src1,src2,dstlo,dsthi: tregister);
var
op: tasmop;
@@ -283,9 +185,6 @@ unit cgcpu;
if r in fregs then
inc(stackcount,8);
- if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
- list.concat(taicpu.op_reg_reg_const(A_ADDI,NR_FRAME_POINTER_REG,NR_STACK_POINTER_REG,0));
-
inc(localsize,stackcount);
if not is_imm12(-localsize) then
begin
@@ -310,10 +209,15 @@ unit cgcpu;
begin
list.concat(taicpu.op_reg_ref(A_FSD,newreg(R_FPUREGISTER,r,R_SUBWHOLE),href));
dec(href.offset,8);
- end;
+ end;
+
+ if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
+ list.concat(taicpu.op_reg_reg_const(A_ADDI,NR_FRAME_POINTER_REG,NR_STACK_POINTER_REG,0));
if localsize>0 then
begin
+ localsize:=align(localsize,4);
+
if is_imm12(-localsize) then
list.concat(taicpu.op_reg_reg_const(A_ADDI,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,-localsize))
else
@@ -359,7 +263,9 @@ unit cgcpu;
if current_procinfo.framepointer<>NR_STACK_POINTER_REG then
list.concat(taicpu.op_reg_reg_const(A_ADDI,NR_STACK_POINTER_REG,NR_FRAME_POINTER_REG,0))
else if localsize>0 then
- begin
+ begin
+ localsize:=align(localsize,4);
+
if is_imm12(localsize) then
list.concat(taicpu.op_reg_reg_const(A_ADDI,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,localsize))
else
@@ -396,14 +302,6 @@ unit cgcpu;
list.concat(taicpu.op_reg_reg(A_JALR,NR_X0,NR_RETURN_ADDRESS_REG));
end;
- procedure tcgrv32.g_save_registers(list: TAsmList);
- begin
- end;
-
- procedure tcgrv32.g_restore_registers(list: TAsmList);
- begin
- end;
-
procedure tcgrv32.g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
var