mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 17:49:13 +02:00
m68k: implemented 68k specific a_bit_set_const_ref and a_bit_set_reg_ref, using BSET/BCLR
git-svn-id: trunk@30278 -
This commit is contained in:
parent
069fa51445
commit
87deec105d
@ -39,6 +39,8 @@ uses
|
|||||||
thlcgm68k = class(thlcg2ll)
|
thlcgm68k = class(thlcg2ll)
|
||||||
procedure a_bit_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister); override;
|
procedure a_bit_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister); override;
|
||||||
procedure a_bit_set_const_reg(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; destreg: tregister); override;
|
procedure a_bit_set_const_reg(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; destreg: tregister); override;
|
||||||
|
procedure a_bit_set_reg_ref(list: TAsmList; doset: boolean; fromsize, tosize: tdef; bitnumber: tregister; const ref: treference); override;
|
||||||
|
procedure a_bit_set_const_ref(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; const ref: treference); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -58,27 +60,54 @@ implementation
|
|||||||
cpuinfo,
|
cpuinfo,
|
||||||
cgcpu;
|
cgcpu;
|
||||||
|
|
||||||
|
const
|
||||||
|
bit_set_clr_instr: array[boolean] of tasmop = (A_BCLR,A_BSET);
|
||||||
|
|
||||||
procedure thlcgm68k.a_bit_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister);
|
procedure thlcgm68k.a_bit_set_reg_reg(list: TAsmList; doset: boolean; bitnumbersize, destsize: tdef; bitnumber, dest: tregister);
|
||||||
const
|
|
||||||
instr: array[boolean] of tasmop = (A_BCLR,A_BSET);
|
|
||||||
var
|
var
|
||||||
tmpvalue: tregister;
|
tmpvalue: tregister;
|
||||||
begin
|
begin
|
||||||
tmpvalue:=getintregister(list,destsize);
|
tmpvalue:=getintregister(list,ptruinttype);
|
||||||
//list.concat(tai_comment.create(strpnew('a_bit_set_reg_reg: called!')));
|
//list.concat(tai_comment.create(strpnew('a_bit_set_reg_reg: called!')));
|
||||||
a_load_const_reg(list,u32inttype,destsize.size*8-1,tmpvalue);
|
a_load_const_reg(list,ptruinttype,destsize.size*8-1,tmpvalue);
|
||||||
a_op_reg_reg(list,OP_SUB,bitnumbersize,bitnumber,tmpvalue);
|
a_op_reg_reg(list,OP_SUB,bitnumbersize,bitnumber,tmpvalue);
|
||||||
list.concat(taicpu.op_reg_reg(instr[doset],S_NO,tmpvalue,dest));
|
list.concat(taicpu.op_reg_reg(bit_set_clr_instr[doset],S_NO,tmpvalue,dest));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure thlcgm68k.a_bit_set_const_reg(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; destreg: tregister);
|
procedure thlcgm68k.a_bit_set_const_reg(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; destreg: tregister);
|
||||||
const
|
|
||||||
instr: array[boolean] of tasmop = (A_BCLR,A_BSET);
|
|
||||||
begin
|
begin
|
||||||
//list.concat(tai_comment.create(strpnew('a_bit_set_const_reg: called!')));
|
//list.concat(tai_comment.create(strpnew('a_bit_set_const_reg: called!')));
|
||||||
list.concat(taicpu.op_const_reg(instr[doset],S_NO,(destsize.size*8)-bitnumber-1,destreg));
|
list.concat(taicpu.op_const_reg(bit_set_clr_instr[doset],S_NO,(destsize.size*8)-bitnumber-1,destreg));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure thlcgm68k.a_bit_set_reg_ref(list: TAsmList; doset: boolean; fromsize, tosize: tdef; bitnumber: tregister; const ref: treference);
|
||||||
|
var
|
||||||
|
tmpvalue: tregister;
|
||||||
|
sref: tsubsetreference;
|
||||||
|
begin
|
||||||
|
//list.concat(tai_comment.create(strpnew('a_bit_set_reg_ref: called!')));
|
||||||
|
sref:=get_bit_reg_ref_sref(list,fromsize,tosize,bitnumber,ref);
|
||||||
|
tcg68k(cg).fixref(list,sref.ref);
|
||||||
|
|
||||||
|
tmpvalue:=getintregister(list,ptruinttype);
|
||||||
|
a_load_const_reg(list,ptruinttype,7,tmpvalue);
|
||||||
|
a_op_reg_reg(list,OP_SUB,fromsize,sref.bitindexreg,tmpvalue);
|
||||||
|
|
||||||
|
{ memory accesses of bset/bclr are always byte, so no alignment problem }
|
||||||
|
list.concat(taicpu.op_reg_ref(bit_set_clr_instr[doset],S_NO,tmpvalue,sref.ref));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure thlcgm68k.a_bit_set_const_ref(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; const ref: treference);
|
||||||
|
var
|
||||||
|
sref: tsubsetreference;
|
||||||
|
begin
|
||||||
|
//list.concat(tai_comment.create(strpnew('a_bit_set_const_ref: called!')));
|
||||||
|
sref:=get_bit_const_ref_sref(bitnumber,destsize,ref);
|
||||||
|
tcg68k(cg).fixref(list,sref.ref);
|
||||||
|
|
||||||
|
{ memory accesses of bset/bclr are always byte, so no alignment problem }
|
||||||
|
list.concat(taicpu.op_const_ref(bit_set_clr_instr[doset],S_NO,8-sref.startbit-1,sref.ref));
|
||||||
|
end;
|
||||||
|
|
||||||
procedure create_hlcodegen;
|
procedure create_hlcodegen;
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user