diff --git a/compiler/m68k/aasmcpu.pas b/compiler/m68k/aasmcpu.pas index bac309b6aa..23fa6d168b 100644 --- a/compiler/m68k/aasmcpu.pas +++ b/compiler/m68k/aasmcpu.pas @@ -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 diff --git a/compiler/m68k/hlcgcpu.pas b/compiler/m68k/hlcgcpu.pas index ecffd1b79b..c3cf53196e 100644 --- a/compiler/m68k/hlcgcpu.pas +++ b/compiler/m68k/hlcgcpu.pas @@ -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;