|
@@ -57,7 +57,9 @@ interface
|
|
|
|
|
|
procedure a_call_name(list:TAsmList;const s:string; weak: boolean);override;
|
|
|
procedure a_call_reg(list:TAsmList;Reg:tregister);override;
|
|
|
+
|
|
|
procedure a_jmp_name(list: TAsmList; const s: string);override;
|
|
|
+ procedure a_jmp_flags(list: TAsmList; const f: TResFlags; l: tasmlabel);override;
|
|
|
|
|
|
procedure g_proc_entry(list: TAsmList; localsize: longint; nostackframe: boolean);override;
|
|
|
procedure g_proc_exit(list: TAsmList; parasize: longint; nostackframe: boolean);override;
|
|
@@ -67,8 +69,14 @@ interface
|
|
|
procedure a_cmp_reg_reg_label(list: TAsmList; size: tcgsize; cmp_op: topcmp; reg1, reg2: tregister; l: tasmlabel);override;
|
|
|
procedure a_jmp_always(list: TAsmList; l: TAsmLabel);override;
|
|
|
|
|
|
+ procedure g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);override;
|
|
|
+
|
|
|
procedure g_concatcopy(list : TAsmList; const source,dest : treference; len : tcgint);override;
|
|
|
|
|
|
+ procedure a_loadfpu_reg_reg(list: TAsmList; fromsize, tosize: tcgsize; reg1, reg2: tregister);override;
|
|
|
+ procedure a_loadfpu_ref_reg(list: TAsmList; fromsize, tosize: tcgsize; const ref: treference; reg: tregister);override;
|
|
|
+ procedure a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference); override;
|
|
|
+
|
|
|
procedure maybeadjustresult(list: TAsmList; op: TOpCg; size: tcgsize; dst: tregister);
|
|
|
end;
|
|
|
|
|
@@ -546,6 +554,16 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ procedure tcgcpu.a_jmp_flags(list: TAsmList; const f: TResFlags; l: tasmlabel);
|
|
|
+ var
|
|
|
+ instr: taicpu;
|
|
|
+ begin
|
|
|
+ instr:=taicpu.op_reg_sym(A_Bcc,f.register,l);
|
|
|
+ instr.condition:=flags_to_cond(f.flag);
|
|
|
+ list.concat(instr);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
procedure tcgcpu.g_proc_entry(list : TAsmList; localsize : longint;
|
|
|
nostackframe : boolean);
|
|
|
var
|
|
@@ -773,6 +791,20 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ procedure tcgcpu.g_flags2reg(list: TAsmList; size: TCgSize; const f: tresflags; reg: TRegister);
|
|
|
+ var
|
|
|
+ hregister: TRegister;
|
|
|
+ instr: taicpu;
|
|
|
+ begin
|
|
|
+ a_load_const_reg(list,size,0,reg);
|
|
|
+ hregister:=getintregister(list,size);
|
|
|
+ a_load_const_reg(list,size,1,hregister);
|
|
|
+ instr:=taicpu.op_reg_reg_reg(A_MOV,reg,hregister,f.register);
|
|
|
+ instr.condition:=flags_to_cond(f.flag);
|
|
|
+ list.concat(instr);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
procedure tcgcpu.g_concatcopy_move(list: tasmlist; const Source, dest: treference; len: tcgint);
|
|
|
var
|
|
|
paraloc1, paraloc2, paraloc3: TCGPara;
|
|
@@ -917,6 +949,49 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ procedure tcgcpu.a_loadfpu_reg_reg(list: TAsmList; fromsize,tosize: tcgsize; reg1, reg2: tregister);
|
|
|
+ begin
|
|
|
+ if not(fromsize in [OS_32,OS_F32]) then
|
|
|
+ InternalError(2020032603);
|
|
|
+ list.concat(taicpu.op_reg_reg(A_MOV_S,reg2,reg1));
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure tcgcpu.a_loadfpu_ref_reg(list: TAsmList; fromsize,tosize: tcgsize; const ref: treference; reg: tregister);
|
|
|
+ var
|
|
|
+ href: treference;
|
|
|
+ begin
|
|
|
+ if not(fromsize in [OS_32,OS_F32]) then
|
|
|
+ InternalError(2020032602);
|
|
|
+ href:=ref;
|
|
|
+ if assigned(href.symbol) or
|
|
|
+ (href.index<>NR_NO) or
|
|
|
+ (((href.offset<0) or (href.offset>1020) or (href.offset mod 4<>0))) then
|
|
|
+ fixref(list,href);
|
|
|
+
|
|
|
+ list.concat(taicpu.op_reg_ref(A_LSI,reg,href));
|
|
|
+
|
|
|
+ if fromsize<>tosize then
|
|
|
+ a_loadfpu_reg_reg(list,fromsize,tosize,reg,reg);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ procedure tcgcpu.a_loadfpu_reg_ref(list: TAsmList; fromsize, tosize: tcgsize; reg: tregister; const ref: treference);
|
|
|
+ var
|
|
|
+ href: treference;
|
|
|
+ begin
|
|
|
+ if not(fromsize in [OS_32,OS_F32]) then
|
|
|
+ InternalError(2020032604);
|
|
|
+ href:=ref;
|
|
|
+ if assigned(href.symbol) or
|
|
|
+ (href.index<>NR_NO) or
|
|
|
+ (((href.offset<0) or (href.offset>1020) or (href.offset mod 4<>0))) then
|
|
|
+ fixref(list,href);
|
|
|
+
|
|
|
+ list.concat(taicpu.op_reg_ref(A_SSI,reg,href));
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
procedure tcgcpu.maybeadjustresult(list : TAsmList; op : TOpCg; size : tcgsize; dst : tregister);
|
|
|
const
|
|
|
overflowops = [OP_MUL,OP_SHL,OP_ADD,OP_SUB,OP_NEG];
|