diff --git a/llvm/lib/Target/M68k/M68kInstrBits.td b/llvm/lib/Target/M68k/M68kInstrBits.td --- a/llvm/lib/Target/M68k/M68kInstrBits.td +++ b/llvm/lib/Target/M68k/M68kInstrBits.td @@ -12,7 +12,7 @@ /// /// Machine: /// -/// BCHG [ ] BCLR [ ] BSET [ ] BTST [~] +/// BCHG [~] BCLR [~] BSET [~] BTST [~] /// /// Map: /// @@ -30,92 +30,134 @@ /// ------------+---------+---------+---------+--------- /// F E D C | B A 9 | 8 7 6 | 5 4 3 | 2 1 0 /// ------------+---------+---------+---------+--------- -/// 0 0 0 0 | REG | 1 0 0 | MODE | REG +/// 0 0 0 0 | REG | OP MODE | MODE | REG /// ------------+---------+---------+---------+--------- -class MxBTSTEnc_R { +class MxBITEnc_R opmode, MxEncMemOp dst_enc, string bitno_name> { dag Value = (ascend (descend 0b0000, (operand "$"#bitno_name, 3), - 0b100, dst_enc.EA + opmode, dst_enc.EA ), dst_enc.Supplement ); } -/// -------------------------------+---------+--------- -/// F E D C B A 9 8 . 7 6 | 5 4 3 | 2 1 0 -/// -------------------------------+---------+--------- -/// 0 0 0 0 1 0 0 0 . 0 0 | MODE | REG -/// ------------------------+------+---------+--------- +/// ---------------------+---------+---------+--------- +/// F E D C B A 9 | 8 7 6 | 5 4 3 | 2 1 0 +/// ---------------------+---------+---------+--------- +/// 0 0 0 0 1 0 0 | OP MODE | MODE | REG +/// ---------------------+--+------+---------+--------- /// 0 0 0 0 0 0 0 0 | BIT NUMBER /// ------------------------+-------------------------- -class MxBTSTEnc_I { +class MxBITEnc_I opmode, MxEncMemOp dst_enc, string bitno_name> { dag Value = (ascend - (descend 0b0000100000, dst_enc.EA), + (descend 0b0000100, opmode, dst_enc.EA), (descend 0b00000000, (operand "$"#bitno_name, 8)), dst_enc.Supplement ); } let Defs = [CCR] in { -class MxBTST_RR - : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.ROp:$bitno), "btst\t$bitno, $dst", - [(set CCR, (MxBtst TYPE.VT:$dst, TYPE.VT:$bitno))]> { - let Inst = MxBTSTEnc_R, "bitno">.Value; +class MxBIT_RR OPMODE, MxType TYPE> + : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.ROp:$bitno), + MN#"\t$bitno, $dst", []> { + let Inst = MxBITEnc_R, "bitno">.Value; } -class MxBTST_RI - : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.IOp:$bitno), "btst\t$bitno, $dst", - [(set CCR, (MxBtst TYPE.VT:$dst, TYPE.IPat:$bitno))]> { - let Inst = MxBTSTEnc_I, "bitno">.Value; +class MxBIT_RI OPMODE, MxType TYPE> + : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.IOp:$bitno), + MN#"\t$bitno, $dst", []> { + let Inst = MxBITEnc_I, "bitno">.Value; } -class MxBTST_MR - : MxInst<(outs), (ins MEMOpd:$dst, TYPE.ROp:$bitno), "btst\t$bitno, $dst", - [(set CCR, (MxBtst (TYPE.Load MEMPat:$dst), TYPE.VT:$bitno))]> { - let Inst = MxBTSTEnc_R.Value; +class MxBIT_MR OPMODE, MxType TYPE, + MxOperand MEMOpd, MxEncMemOp DST_ENC> + : MxInst<(outs), (ins MEMOpd:$dst, TYPE.ROp:$bitno), + MN#"\t$bitno, $dst", []> { + let Inst = MxBITEnc_R.Value; } -class MxBTST_MI - : MxInst<(outs), (ins MEMOpd:$dst, TYPE.IOp:$bitno), "btst\t$bitno, $dst", - [(set CCR, (MxBtst (TYPE.Load MEMPat:$dst), TYPE.IPat:$bitno))]> { - let Inst = MxBTSTEnc_I.Value; +class MxBIT_MI OPMODE, MxType TYPE, + MxOperand MEMOpd, MxEncMemOp DST_ENC> + : MxInst<(outs), (ins MEMOpd:$dst, TYPE.IOp:$bitno), + MN#"\t$bitno, $dst", []> { + let Inst = MxBITEnc_I.Value; } } // Defs = [CCR] -// Register BTST limited to 32 bits only -def BTST32dd : MxBTST_RR; -def BTST32di : MxBTST_RI; - -// Memory BTST limited to 8 bits only -def BTST8jd : MxBTST_MR>; -def BTST8od : MxBTST_MR>; -def BTST8ed : MxBTST_MR>; -def BTST8pd : MxBTST_MR>; -def BTST8fd : MxBTST_MR>; -def BTST8qd : MxBTST_MR>; -def BTST8kd : MxBTST_MR>; - -def BTST8ji : MxBTST_MI>; -def BTST8oi : MxBTST_MI>; -def BTST8ei : MxBTST_MI>; -def BTST8pi : MxBTST_MI>; -def BTST8fi : MxBTST_MI>; -def BTST8qi : MxBTST_MI>; -def BTST8ki : MxBTST_MI>; + +multiclass MxBIT OP, bits<3> OPI> { + // Register Bit manipulation limited to 32 bits only + def NAME#32dd : MxBIT_RR; + def NAME#32di : MxBIT_RI; + + // Memory Bit manipulation limited to 8 bits only + def NAME#8jd : MxBIT_MR>; + def NAME#8od : MxBIT_MR>; + def NAME#8ed : MxBIT_MR>; + def NAME#8pd : MxBIT_MR>; + def NAME#8fd : MxBIT_MR>; + + def NAME#8ji : MxBIT_MI>; + def NAME#8oi : MxBIT_MI>; + def NAME#8ei : MxBIT_MI>; + def NAME#8pi : MxBIT_MI>; + def NAME#8fi : MxBIT_MI>; +} + +defm BCHG : MxBIT<"bchg", 0b101, 0b001>; +defm BCLR : MxBIT<"bclr", 0b110, 0b010>; +defm BSET : MxBIT<"bset", 0b111, 0b011>; +defm BTST : MxBIT<"btst", 0b100, 0b000>; + +// Codegen patterns + +multiclass MxBITPatR { +def : Pat<(NODE MxType32d.VT:$dst, MxType32d.VT:$bitno), + (INSTd MxType32d.ROp:$dst, MxType32d.ROp:$bitno)>; +def : Pat<(NODE MxType32d.VT:$dst, MxType32d.IPat:$bitno), + (INSTi MxType32d.ROp:$dst, MxType32d.IOp:$bitno)>; +} + +defm : MxBITPatR; + +multiclass MxBITPatM { +def : Pat<(NODE (TYPE.Load MEMPat:$dst), TYPE.VT:$bitno), + (INSTd MEMOpd:$dst, TYPE.ROp:$bitno)>; +def : Pat<(NODE (TYPE.Load MEMPat:$dst), TYPE.IPat:$bitno), + (INSTi MEMOpd:$dst, TYPE.IOp:$bitno)>; +} + +defm : MxBITPatM; +defm : MxBITPatM; +defm : MxBITPatM; +defm : MxBITPatM; +defm : MxBITPatM; +defm : MxBITPatM; +defm : MxBITPatM; diff --git a/llvm/lib/Target/M68k/M68kInstrInfo.td b/llvm/lib/Target/M68k/M68kInstrInfo.td --- a/llvm/lib/Target/M68k/M68kInstrInfo.td +++ b/llvm/lib/Target/M68k/M68kInstrInfo.td @@ -137,6 +137,9 @@ def MxUMul : SDNode<"M68kISD::UMUL", MxSDT_2BiArithCCROut, [SDNPCommutative]>; def MxCmp : SDNode<"M68kISD::CMP", MxSDT_CmpTest>; +def MxBchg : SDNode<"M68kISD::BCHG", MxSDT_CmpTest>; +def MxBclr : SDNode<"M68kISD::BCLR", MxSDT_CmpTest>; +def MxBset : SDNode<"M68kISD::BSET", MxSDT_CmpTest>; def MxBtst : SDNode<"M68kISD::BTST", MxSDT_CmpTest>; def MxCmov : SDNode<"M68kISD::CMOV", MxSDT_Cmov>; diff --git a/llvm/test/MC/M68k/Bits/Classes/MxBTST_MI.s b/llvm/test/MC/M68k/Bits/Classes/MxBTST_MI.s --- a/llvm/test/MC/M68k/Bits/Classes/MxBTST_MI.s +++ b/llvm/test/MC/M68k/Bits/Classes/MxBTST_MI.s @@ -1,5 +1,26 @@ ; RUN: llvm-mc -triple=m68k -show-encoding %s | FileCheck %s +; CHECK: bchg #0, (%a1) +; CHECK-SAME: encoding: [0x08,0x51,0x00,0x00] +bchg #0, (%a1) +; CHECK: bchg #-1, (%a0) +; CHECK-SAME: encoding: [0x08,0x50,0x00,0xff] +bchg #-1, (%a0) + +; CHECK: bclr #0, (%a1) +; CHECK-SAME: encoding: [0x08,0x91,0x00,0x00] +bclr #0, (%a1) +; CHECK: bclr #-1, (%a0) +; CHECK-SAME: encoding: [0x08,0x90,0x00,0xff] +bclr #-1, (%a0) + +; CHECK: bset #0, (%a1) +; CHECK-SAME: encoding: [0x08,0xd1,0x00,0x00] +bset #0, (%a1) +; CHECK: bset #-1, (%a0) +; CHECK-SAME: encoding: [0x08,0xd0,0x00,0xff] +bset #-1, (%a0) + ; CHECK: btst #0, (%a1) ; CHECK-SAME: encoding: [0x08,0x11,0x00,0x00] btst #0, (%a1) @@ -7,6 +28,27 @@ ; CHECK-SAME: encoding: [0x08,0x10,0x00,0xff] btst #-1, (%a0) +; CHECK: bchg #0, (%a1)+ +; CHECK-SAME: encoding: [0x08,0x59,0x00,0x00] +bchg #0, (%a1)+ +; CHECK: bchg #-1, (%a0)+ +; CHECK-SAME: encoding: [0x08,0x58,0x00,0xff] +bchg #-1, (%a0)+ + +; CHECK: bclr #0, (%a1)+ +; CHECK-SAME: encoding: [0x08,0x99,0x00,0x00] +bclr #0, (%a1)+ +; CHECK: bclr #-1, (%a0)+ +; CHECK-SAME: encoding: [0x08,0x98,0x00,0xff] +bclr #-1, (%a0)+ + +; CHECK: bset #0, (%a1)+ +; CHECK-SAME: encoding: [0x08,0xd9,0x00,0x00] +bset #0, (%a1)+ +; CHECK: bset #-1, (%a0)+ +; CHECK-SAME: encoding: [0x08,0xd8,0x00,0xff] +bset #-1, (%a0)+ + ; CHECK: btst #0, (%a1)+ ; CHECK-SAME: encoding: [0x08,0x19,0x00,0x00] btst #0, (%a1)+ @@ -14,6 +56,27 @@ ; CHECK-SAME: encoding: [0x08,0x18,0x00,0xff] btst #-1, (%a0)+ +; CHECK: bchg #0, -(%a1) +; CHECK-SAME: encoding: [0x08,0x61,0x00,0x00] +bchg #0, -(%a1) +; CHECK: bchg #-1, -(%a0) +; CHECK-SAME: encoding: [0x08,0x60,0x00,0xff] +bchg #-1, -(%a0) + +; CHECK: bclr #0, -(%a1) +; CHECK-SAME: encoding: [0x08,0xa1,0x00,0x00] +bclr #0, -(%a1) +; CHECK: bclr #-1, -(%a0) +; CHECK-SAME: encoding: [0x08,0xa0,0x00,0xff] +bclr #-1, -(%a0) + +; CHECK: bset #0, -(%a1) +; CHECK-SAME: encoding: [0x08,0xe1,0x00,0x00] +bset #0, -(%a1) +; CHECK: bset #-1, -(%a0) +; CHECK-SAME: encoding: [0x08,0xe0,0x00,0xff] +bset #-1, -(%a0) + ; CHECK: btst #0, -(%a1) ; CHECK-SAME: encoding: [0x08,0x21,0x00,0x00] btst #0, -(%a1) @@ -21,6 +84,27 @@ ; CHECK-SAME: encoding: [0x08,0x20,0x00,0xff] btst #-1, -(%a0) +; CHECK: bchg #0, (-1,%a1) +; CHECK-SAME: encoding: [0x08,0x69,0x00,0x00,0xff,0xff] +bchg #0, (-1,%a1) +; CHECK: bchg #-1, (0,%a0) +; CHECK-SAME: encoding: [0x08,0x68,0x00,0xff,0x00,0x00] +bchg #-1, (0,%a0) + +; CHECK: bclr #0, (-1,%a1) +; CHECK-SAME: encoding: [0x08,0xa9,0x00,0x00,0xff,0xff] +bclr #0, (-1,%a1) +; CHECK: bclr #-1, (0,%a0) +; CHECK-SAME: encoding: [0x08,0xa8,0x00,0xff,0x00,0x00] +bclr #-1, (0,%a0) + +; CHECK: bset #0, (-1,%a1) +; CHECK-SAME: encoding: [0x08,0xe9,0x00,0x00,0xff,0xff] +bset #0, (-1,%a1) +; CHECK: bset #-1, (0,%a0) +; CHECK-SAME: encoding: [0x08,0xe8,0x00,0xff,0x00,0x00] +bset #-1, (0,%a0) + ; CHECK: btst #0, (-1,%a1) ; CHECK-SAME: encoding: [0x08,0x29,0x00,0x00,0xff,0xff] btst #0, (-1,%a1) @@ -28,6 +112,27 @@ ; CHECK-SAME: encoding: [0x08,0x28,0x00,0xff,0x00,0x00] btst #-1, (0,%a0) +; CHECK: bchg #0, (-1,%a1,%a0) +; CHECK-SAME: encoding: [0x08,0x71,0x00,0x00,0x88,0xff] +bchg #0, (-1,%a1,%a0) +; CHECK: bchg #-1, (0,%a0,%a0) +; CHECK-SAME: encoding: [0x08,0x70,0x00,0xff,0x88,0x00] +bchg #-1, (0,%a0,%a0) + +; CHECK: bclr #0, (-1,%a1,%a0) +; CHECK-SAME: encoding: [0x08,0xb1,0x00,0x00,0x88,0xff] +bclr #0, (-1,%a1,%a0) +; CHECK: bclr #-1, (0,%a0,%a0) +; CHECK-SAME: encoding: [0x08,0xb0,0x00,0xff,0x88,0x00] +bclr #-1, (0,%a0,%a0) + +; CHECK: bset #0, (-1,%a1,%a0) +; CHECK-SAME: encoding: [0x08,0xf1,0x00,0x00,0x88,0xff] +bset #0, (-1,%a1,%a0) +; CHECK: bset #-1, (0,%a0,%a0) +; CHECK-SAME: encoding: [0x08,0xf0,0x00,0xff,0x88,0x00] +bset #-1, (0,%a0,%a0) + ; CHECK: btst #0, (-1,%a1,%a0) ; CHECK-SAME: encoding: [0x08,0x31,0x00,0x00,0x88,0xff] btst #0, (-1,%a1,%a0) diff --git a/llvm/test/MC/M68k/Bits/Classes/MxBTST_MR.s b/llvm/test/MC/M68k/Bits/Classes/MxBTST_MR.s --- a/llvm/test/MC/M68k/Bits/Classes/MxBTST_MR.s +++ b/llvm/test/MC/M68k/Bits/Classes/MxBTST_MR.s @@ -1,5 +1,26 @@ ; RUN: llvm-mc -triple=m68k -show-encoding %s | FileCheck %s +; CHECK: bchg %d0, (%a1) +; CHECK-SAME: encoding: [0x01,0x51] +bchg %d0, (%a1) +; CHECK: bchg %d1, (%a0) +; CHECK-SAME: encoding: [0x03,0x50] +bchg %d1, (%a0) + +; CHECK: bclr %d0, (%a1) +; CHECK-SAME: encoding: [0x01,0x91] +bclr %d0, (%a1) +; CHECK: bclr %d1, (%a0) +; CHECK-SAME: encoding: [0x03,0x90] +bclr %d1, (%a0) + +; CHECK: bset %d0, (%a1) +; CHECK-SAME: encoding: [0x01,0xd1] +bset %d0, (%a1) +; CHECK: bset %d1, (%a0) +; CHECK-SAME: encoding: [0x03,0xd0] +bset %d1, (%a0) + ; CHECK: btst %d0, (%a1) ; CHECK-SAME: encoding: [0x01,0x11] btst %d0, (%a1) @@ -7,6 +28,27 @@ ; CHECK-SAME: encoding: [0x03,0x10] btst %d1, (%a0) +; CHECK: bchg %d0, (%a1)+ +; CHECK-SAME: encoding: [0x01,0x59] +bchg %d0, (%a1)+ +; CHECK: bchg %d1, (%a0)+ +; CHECK-SAME: encoding: [0x03,0x58] +bchg %d1, (%a0)+ + +; CHECK: bclr %d0, (%a1)+ +; CHECK-SAME: encoding: [0x01,0x99] +bclr %d0, (%a1)+ +; CHECK: bclr %d1, (%a0)+ +; CHECK-SAME: encoding: [0x03,0x98] +bclr %d1, (%a0)+ + +; CHECK: bset %d0, (%a1)+ +; CHECK-SAME: encoding: [0x01,0xd9] +bset %d0, (%a1)+ +; CHECK: bset %d1, (%a0)+ +; CHECK-SAME: encoding: [0x03,0xd8] +bset %d1, (%a0)+ + ; CHECK: btst %d0, (%a1)+ ; CHECK-SAME: encoding: [0x01,0x19] btst %d0, (%a1)+ @@ -14,6 +56,27 @@ ; CHECK-SAME: encoding: [0x03,0x18] btst %d1, (%a0)+ +; CHECK: bchg %d0, -(%a1) +; CHECK-SAME: encoding: [0x01,0x61] +bchg %d0, -(%a1) +; CHECK: bchg %d1, -(%a0) +; CHECK-SAME: encoding: [0x03,0x60] +bchg %d1, -(%a0) + +; CHECK: bclr %d0, -(%a1) +; CHECK-SAME: encoding: [0x01,0xa1] +bclr %d0, -(%a1) +; CHECK: bclr %d1, -(%a0) +; CHECK-SAME: encoding: [0x03,0xa0] +bclr %d1, -(%a0) + +; CHECK: bset %d0, -(%a1) +; CHECK-SAME: encoding: [0x01,0xe1] +bset %d0, -(%a1) +; CHECK: bset %d1, -(%a0) +; CHECK-SAME: encoding: [0x03,0xe0] +bset %d1, -(%a0) + ; CHECK: btst %d0, -(%a1) ; CHECK-SAME: encoding: [0x01,0x21] btst %d0, -(%a1) @@ -21,6 +84,27 @@ ; CHECK-SAME: encoding: [0x03,0x20] btst %d1, -(%a0) +; CHECK: bchg %d0, (-1,%a1) +; CHECK-SAME: encoding: [0x01,0x69,0xff,0xff] +bchg %d0, (-1,%a1) +; CHECK: bchg %d1, (0,%a0) +; CHECK-SAME: encoding: [0x03,0x68,0x00,0x00] +bchg %d1, (0,%a0) + +; CHECK: bclr %d0, (-1,%a1) +; CHECK-SAME: encoding: [0x01,0xa9,0xff,0xff] +bclr %d0, (-1,%a1) +; CHECK: bclr %d1, (0,%a0) +; CHECK-SAME: encoding: [0x03,0xa8,0x00,0x00] +bclr %d1, (0,%a0) + +; CHECK: bset %d0, (-1,%a1) +; CHECK-SAME: encoding: [0x01,0xe9,0xff,0xff] +bset %d0, (-1,%a1) +; CHECK: bset %d1, (0,%a0) +; CHECK-SAME: encoding: [0x03,0xe8,0x00,0x00] +bset %d1, (0,%a0) + ; CHECK: btst %d0, (-1,%a1) ; CHECK-SAME: encoding: [0x01,0x29,0xff,0xff] btst %d0, (-1,%a1) @@ -28,6 +112,27 @@ ; CHECK-SAME: encoding: [0x03,0x28,0x00,0x00] btst %d1, (0,%a0) +; CHECK: bchg %d0, (-1,%a1,%a0) +; CHECK-SAME: encoding: [0x01,0x71,0x88,0xff] +bchg %d0, (-1,%a1,%a0) +; CHECK: bchg %d1, (0,%a0,%a0) +; CHECK-SAME: encoding: [0x03,0x70,0x88,0x00] +bchg %d1, (0,%a0,%a0) + +; CHECK: bclr %d0, (-1,%a1,%a0) +; CHECK-SAME: encoding: [0x01,0xb1,0x88,0xff] +bclr %d0, (-1,%a1,%a0) +; CHECK: bclr %d1, (0,%a0,%a0) +; CHECK-SAME: encoding: [0x03,0xb0,0x88,0x00] +bclr %d1, (0,%a0,%a0) + +; CHECK: bset %d0, (-1,%a1,%a0) +; CHECK-SAME: encoding: [0x01,0xf1,0x88,0xff] +bset %d0, (-1,%a1,%a0) +; CHECK: bset %d1, (0,%a0,%a0) +; CHECK-SAME: encoding: [0x03,0xf0,0x88,0x00] +bset %d1, (0,%a0,%a0) + ; CHECK: btst %d0, (-1,%a1,%a0) ; CHECK-SAME: encoding: [0x01,0x31,0x88,0xff] btst %d0, (-1,%a1,%a0) diff --git a/llvm/test/MC/M68k/Bits/Classes/MxBTST_RR.s b/llvm/test/MC/M68k/Bits/Classes/MxBTST_RR.s --- a/llvm/test/MC/M68k/Bits/Classes/MxBTST_RR.s +++ b/llvm/test/MC/M68k/Bits/Classes/MxBTST_RR.s @@ -1,5 +1,26 @@ ; RUN: llvm-mc -triple=m68k -show-encoding %s | FileCheck %s +; CHECK: bchg %d1, %d0 +; CHECK-SAME: encoding: [0x03,0x40] +bchg %d1, %d0 +; CHECK: bchg %d0, %d3 +; CHECK-SAME: encoding: [0x01,0x43] +bchg %d0, %d3 + +; CHECK: bclr %d1, %d0 +; CHECK-SAME: encoding: [0x03,0x80] +bclr %d1, %d0 +; CHECK: bclr %d0, %d3 +; CHECK-SAME: encoding: [0x01,0x83] +bclr %d0, %d3 + +; CHECK: bset %d1, %d0 +; CHECK-SAME: encoding: [0x03,0xc0] +bset %d1, %d0 +; CHECK: bset %d0, %d3 +; CHECK-SAME: encoding: [0x01,0xc3] +bset %d0, %d3 + ; CHECK: btst %d1, %d0 ; CHECK-SAME: encoding: [0x03,0x00] btst %d1, %d0