diff options
Diffstat (limited to 'riscv/trunk/compiler/riscv32/cgcpu.pas')
-rw-r--r-- | riscv/trunk/compiler/riscv32/cgcpu.pas | 132 |
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 |