mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-25 18:01:53 +02:00
m68k: some initial HLCG, use BSET/BCLR instructions for simple bit manipulation
git-svn-id: trunk@30275 -
This commit is contained in:
parent
f7526d0d36
commit
c49c8210a3
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user