2
0
Эх сурвалжийг харах

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

git-svn-id: trunk@30275 -
Károly Balogh 10 жил өмнө
parent
commit
c49c8210a3

+ 3 - 2
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

+ 46 - 2
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;