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: /// @@ -23,86 +23,91 @@ /// //===----------------------------------------------------------------------===// -//===----------------------------------------------------------------------===// -// BTST -//===----------------------------------------------------------------------===// - /// ------------+---------+---------+---------+--------- /// 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 - : MxEncoding, REG, MxBead4Bits<0b0000>, +class MxBITEnc_R OPMODE, MxBeadDReg REG, MxEncEA EA, MxEncExt EXT> + : MxEncoding, REG, MxBead4Bits<0b0000>, EXT.Imm, EXT.B8, EXT.Scale, EXT.WL, EXT.DAReg>; -/// -------------------------------+---------+--------- -/// 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 -/// ------------------------+------+---------+--------- -/// 0 0 0 0 0 0 0 0 | BIT NUMBER -/// ------------------------+-------------------------- -class MxBTSTEnc_I - : MxEncoding, - MxBead4Bits<0b1000>, MxBead4Bits<0b0000>, IMM, +/// ---------------------+---------+---------+--------- +/// 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 MxBITEnc_I OPMODE, MxBead8Imm IMM, MxEncEA EA, MxEncExt EXT> + : MxEncoding, + MxBead3Bits<0b100>, MxBead4Bits<0b0000>, IMM, EXT.Imm, EXT.B8, EXT.Scale, EXT.WL, EXT.DAReg>; let Defs = [CCR] in { -class MxBTST_RR - : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.ROp:$bitno), "btst\t$bitno, $dst", +class MxBIT_RR OPMODE, MxType TYPE> + : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.ROp:$bitno), MN#"\t$bitno, $dst", [(set CCR, (MxBt TYPE.VT:$dst, TYPE.VT:$bitno))], - MxBTSTEnc_R, MxEncEAd_0, MxExtEmpty>>; + MxBITEnc_R, MxEncEAd_0, MxExtEmpty>>; -class MxBTST_RI - : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.IOp:$bitno), "btst\t$bitno, $dst", +class MxBIT_RI OPMODE, MxType TYPE> + : MxInst<(outs), (ins TYPE.ROp:$dst, TYPE.IOp:$bitno), MN#"\t$bitno, $dst", [(set CCR, (MxBt TYPE.VT:$dst, TYPE.IPat:$bitno))], - MxBTSTEnc_I, MxEncEAd_0, MxExtEmpty>>; + MxBITEnc_I, MxEncEAd_0, MxExtEmpty>>; -class MxBTST_MR - : MxInst<(outs), (ins MEMOpd:$dst, TYPE.ROp:$bitno), "btst\t$bitno, $dst", +class MxBIT_MR OPMODE, MxType TYPE, MxOperand MEMOpd, + ComplexPattern MEMPat, MxEncEA EA, MxEncExt EXT> + : MxInst<(outs), (ins MEMOpd:$dst, TYPE.ROp:$bitno), MN#"\t$bitno, $dst", [(set CCR, (MxBt (TYPE.Load MEMPat:$dst), TYPE.VT:$bitno))], - MxBTSTEnc_R, EA, EXT>>; + MxBITEnc_R, EA, EXT>>; -class MxBTST_MI - : MxInst<(outs), (ins MEMOpd:$dst, TYPE.IOp:$bitno), "btst\t$bitno, $dst", +class MxBIT_MI OPMODE, MxType TYPE, MxOperand MEMOpd, + ComplexPattern MEMPat, MxEncEA EA, MxEncExt EXT> + : MxInst<(outs), (ins MEMOpd:$dst, TYPE.IOp:$bitno), MN#"\t$bitno, $dst", [(set CCR, (MxBt (TYPE.Load MEMPat:$dst), TYPE.IPat:$bitno))], - MxBTSTEnc_I, EA, EXT>>; + MxBITEnc_I, EA, EXT>>; } // Defs = [CCR] -// Register BTST limited to 32 bits only -def BTST32dd : MxBTST_RR; -def BTST32di : MxBTST_RI; +def BTST8qd : MxBIT_MR<"btst", 0b100, MxType8d, MxType8.QOp, MxType8.QPat, + MxEncEAq, MxExtI16_0>; +def BTST8kd : MxBIT_MR<"btst", 0b100, MxType8d, MxType8.KOp, MxType8.KPat, + MxEncEAk, MxExtBrief_0>; +def BTST8qi : MxBIT_MI<"btst", 0b000, MxType8d, MxType8.QOp, MxType8.QPat, + MxEncEAq, MxExtI16_0>; +def BTST8ki : MxBIT_MI<"btst", 0b000, MxType8d, MxType8.KOp, MxType8.KPat, + MxEncEAk, MxExtBrief_0>; + +multiclass MxBIT OP, bits<3> OPI> { + // Register BIT limited to 32 bits only + def NAME#32dd : MxBIT_RR; + def NAME#32di : MxBIT_RI; + + // Memory BIT 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; -// 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 NAME#8ji : MxBIT_MI; + def NAME#8oi : MxBIT_MI; + def NAME#8ei : MxBIT_MI; + def NAME#8pi : MxBIT_MI; + def NAME#8fi : MxBIT_MI; +} -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; +defm BCHG : MxBIT<"bchg", 0b101, 0b001>; +defm BCLR : MxBIT<"bclr", 0b110, 0b010>; +defm BSET : MxBIT<"bset", 0b111, 0b011>; +defm BTST : MxBIT<"btst", 0b100, 0b000>; 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