m68k: some initial HLCG, use BSET/BCLR instructions for simple bit manipulation

git-svn-id: trunk@30275 -
This commit is contained in:
Károly Balogh 2015-03-22 14:01:14 +00:00
parent f7526d0d36
commit c49c8210a3
2 changed files with 49 additions and 4 deletions

View File

@ -473,7 +473,8 @@ type
case opcode of
// CPU opcodes
A_MOVE, A_MOVEQ, A_MOVEA, A_MVZ, A_MVS, A_MOV3Q, A_LEA:
A_MOVE, A_MOVEQ, A_MOVEA, A_MVZ, A_MVS, A_MOV3Q, A_LEA,
A_BSET, A_BCLR:
if opnr=1 then
result:=operand_write;
A_ADD, A_ADDQ, A_ADDX, A_SUB, A_SUBQ, A_SUBX,
@ -490,7 +491,7 @@ type
result:=operand_write;
A_NEG, A_NEGX, A_EXT, A_EXTB, A_NOT, A_SWAP:
result:=operand_readwrite;
A_TST,A_CMP,A_CMPI:
A_TST,A_CMP,A_CMPI,A_BTST:
begin end; { Do nothing, default operand_read is fine here. }
// FPU opcodes

View File

@ -28,17 +28,61 @@ unit hlcgcpu;
interface
uses
globtype,
aasmbase, aasmdata,
cgbase, cgutils,
symconst,symtype,symdef,
parabase, hlcgobj, hlcg2ll;
type
thlcgm68k = class(thlcg2ll)
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;
end;
procedure create_hlcodegen;
implementation
uses
hlcgobj, hlcg2ll,
verbose, systems,
aasmtai,
aasmcpu,
cutils,
globals,
defutil,
cgobj,
cpubase,
cpuinfo,
cgcpu;
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
tmpvalue: tregister;
begin
tmpvalue:=getintregister(list,destsize);
//list.concat(tai_comment.create(strpnew('a_bit_set_reg_reg: called!')));
a_load_const_reg(list,u32inttype,destsize.size*8-1,tmpvalue);
a_op_reg_reg(list,OP_SUB,bitnumbersize,bitnumber,tmpvalue);
list.concat(taicpu.op_reg_reg(instr[doset],S_NO,tmpvalue,dest));
end;
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
//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));
end;
procedure create_hlcodegen;
begin
hlcg:=thlcg2ll.create;
hlcg:=thlcgm68k.create;
create_codegen;
end;