Skip to content

[X86][MC] Support enc/dec for SETZUCC and promoted SETCC. #86473

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Apr 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3287,6 +3287,7 @@ bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,

// FIXME: Hack to recognize setneb as setne.
if (PatchedName.starts_with("set") && PatchedName.ends_with("b") &&
PatchedName != "setzub" && PatchedName != "setzunb" &&
PatchedName != "setb" && PatchedName != "setnb")
PatchedName = PatchedName.substr(0, Name.size()-1);

Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1155,6 +1155,7 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
Prefix.setXX2(MI, MemOperand + X86::AddrIndexReg);
break;
}
case X86II::MRMXmCC:
case X86II::MRM0m:
case X86II::MRM1m:
case X86II::MRM2m:
Expand Down Expand Up @@ -1282,6 +1283,7 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
Prefix.setRR2(MI, CurOp++);
break;
}
case X86II::MRMXrCC:
case X86II::MRM0r:
case X86II::MRM1r:
case X86II::MRM2r:
Expand Down
8 changes: 6 additions & 2 deletions llvm/lib/Target/X86/X86InstrAsmAlias.td
Original file line number Diff line number Diff line change
Expand Up @@ -760,7 +760,7 @@ def : InstAlias<"xor{q}\t{$imm, %rax|rax, $imm}", (XOR64ri8 RAX, i64i8imm:$imm),
def : InstAlias<"movq.s\t{$src, $dst|$dst, $src}",
(MMX_MOVQ64rr_REV VR64:$dst, VR64:$src), 0>;

// CMOV SETCC Aliases
// CMOV SETCC SETZUCC Aliases
multiclass CMOV_SETCC_Aliases<string Cond, int CC> {
def : InstAlias<"cmov"#Cond#"{w}\t{$src, $dst|$dst, $src}",
(CMOV16rr GR16:$dst, GR16:$src, CC), 0>;
Expand All @@ -787,8 +787,12 @@ let Predicates = [In64BitMode] in {
(CMOV64rr_ND GR64:$dst, GR64:$src1, GR64:$src2, CC), 0>;
def : InstAlias<"cmov"#Cond#"{q}\t{$src2, $src1, $dst|$dst, $src1, $src2}",
(CMOV64rm_ND GR64:$dst, GR64:$src1, i64mem:$src2, CC), 0>;
}

def : InstAlias<"setzu"#Cond#"\t$dst", (SETZUCCr GR8:$dst, CC), 0>;
def : InstAlias<"setzu"#Cond#"\t$dst", (SETZUCCm i8mem:$dst, CC), 0>;
def : InstAlias<"set"#Cond#"\t$dst", (SETCCr_EVEX GR8:$dst, CC), 0>;
def : InstAlias<"set"#Cond#"\t$dst", (SETCCm_EVEX i8mem:$dst, CC), 0>;
}
def : InstAlias<"set"#Cond#"\t$dst", (SETCCr GR8:$dst, CC), 0>;
def : InstAlias<"set"#Cond#"\t$dst", (SETCCm i8mem:$dst, CC), 0>;
}
Expand Down
19 changes: 19 additions & 0 deletions llvm/lib/Target/X86/X86InstrCMovSetCC.td
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,25 @@ let Uses = [EFLAGS], isCodeGenOnly = 1, ForceDisassemble = 1 in {
TB, Sched<[WriteSETCCStore]>;
} // Uses = [EFLAGS]

// SetZUCC and promoted SetCC instructions.
let Uses = [EFLAGS], isCodeGenOnly = 1, ForceDisassemble = 1,
hasSideEffects = 0, Predicates = [In64BitMode], Predicates = [HasNDD] in {
def SETZUCCr : I<0x40, MRMXrCC, (outs GR8:$dst), (ins ccode:$cond),
"setzu${cond}\t$dst", []>,
XD, ZU, NoCD8, Sched<[WriteSETCC]>;
def SETCCr_EVEX : I<0x40, MRMXrCC, (outs GR8:$dst), (ins ccode:$cond),
"set${cond}\t$dst", []>,
XD, PL, Sched<[WriteSETCC]>;
let mayStore = 1 in {
def SETZUCCm : I<0x40, MRMXmCC, (outs), (ins i8mem:$dst, ccode:$cond),
"setzu${cond}\t$dst", []>,
XD, ZU, NoCD8, Sched<[WriteSETCCStore]>;
def SETCCm_EVEX : I<0x40, MRMXmCC, (outs), (ins i8mem:$dst, ccode:$cond),
"set${cond}\t$dst", []>,
XD, PL, Sched<[WriteSETCCStore]>;
}
}

// SALC is an undocumented instruction. Information for this instruction can be found
// here http://www.rcollins.org/secrets/opcodes/SALC.html
// Set AL if carry.
Expand Down
24 changes: 12 additions & 12 deletions llvm/lib/Target/X86/X86InstrControl.td
Original file line number Diff line number Diff line change
Expand Up @@ -167,24 +167,24 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
}

let Predicates = [Not64BitMode], AsmVariantName = "att" in {
def FARJMP16i : Iseg16<0xEA, RawFrmImm16, (outs),
(ins i16imm:$off, i16imm:$seg),
"ljmp{w}\t$seg, $off", []>,
OpSize16, Sched<[WriteJump]>;
def FARJMP32i : Iseg32<0xEA, RawFrmImm16, (outs),
(ins i32imm:$off, i16imm:$seg),
"ljmp{l}\t$seg, $off", []>,
OpSize32, Sched<[WriteJump]>;
def FARJMP16i : Iseg16<0xEA, RawFrmImm16, (outs),
(ins i16imm:$off, i16imm:$seg),
"ljmp{w}\t$seg, $off", []>,
OpSize16, Sched<[WriteJump]>;
}
let mayLoad = 1 in {
def FARJMP64m : RI<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
"ljmp{q}\t{*}$dst", []>, Sched<[WriteJump]>, Requires<[In64BitMode]>;

def FARJMP32m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
"{l}jmp{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
let AsmVariantName = "att" in
def FARJMP16m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
"ljmp{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
def FARJMP32m : I<0xFF, MRM5m, (outs), (ins opaquemem:$dst),
"{l}jmp{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
}
}

Expand Down Expand Up @@ -253,21 +253,21 @@ let isCall = 1 in
}

let Predicates = [Not64BitMode], AsmVariantName = "att" in {
def FARCALL16i : Iseg16<0x9A, RawFrmImm16, (outs),
(ins i16imm:$off, i16imm:$seg),
"lcall{w}\t$seg, $off", []>,
OpSize16, Sched<[WriteJump]>;
def FARCALL32i : Iseg32<0x9A, RawFrmImm16, (outs),
(ins i32imm:$off, i16imm:$seg),
"lcall{l}\t$seg, $off", []>,
OpSize32, Sched<[WriteJump]>;
def FARCALL16i : Iseg16<0x9A, RawFrmImm16, (outs),
(ins i16imm:$off, i16imm:$seg),
"lcall{w}\t$seg, $off", []>,
OpSize16, Sched<[WriteJump]>;
}

let mayLoad = 1 in {
def FARCALL16m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
"lcall{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
def FARCALL32m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
"{l}call{l}\t{*}$dst", []>, OpSize32, Sched<[WriteJumpLd]>;
def FARCALL16m : I<0xFF, MRM3m, (outs), (ins opaquemem:$dst),
"lcall{w}\t{*}$dst", []>, OpSize16, Sched<[WriteJumpLd]>;
}
}

Expand Down
10 changes: 10 additions & 0 deletions llvm/test/MC/Disassembler/X86/apx/evex-format.txt
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,16 @@
# INTEL: sar r17, r16, 123
0x62,0xfc,0xf4,0x10,0xc1,0xf8,0x7b

## MRMXrCC
# ATT: setzuo %r16b
# INTEL: setzuo r16b
0x62,0xfc,0x7f,0x18,0x40,0xc0

## MRMXmCC
# ATT: setzuo (%r16,%r17)
# INTEL: setzuo byte ptr [r16 + r17]
0x62,0xfc,0x7b,0x18,0x40,0x04,0x08

## NoCD8

# ATT: {nf} negq 123(%r16)
Expand Down
130 changes: 130 additions & 0 deletions llvm/test/MC/Disassembler/X86/apx/setcc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# RUN: llvm-mc -triple x86_64 -disassemble %s | FileCheck %s --check-prefix=ATT
# RUN: llvm-mc -triple x86_64 -disassemble -output-asm-variant=1 %s | FileCheck %s --check-prefix=INTEL

# ATT: {evex} seto %al
# INTEL: {evex} seto al
0x62,0xf4,0x7f,0x08,0x40,0xc0

# ATT: {evex} setno %al
# INTEL: {evex} setno al
0x62,0xf4,0x7f,0x08,0x41,0xc0

# ATT: {evex} setb %al
# INTEL: {evex} setb al
0x62,0xf4,0x7f,0x08,0x42,0xc0

# ATT: {evex} setae %al
# INTEL: {evex} setae al
0x62,0xf4,0x7f,0x08,0x43,0xc0

# ATT: {evex} sete %al
# INTEL: {evex} sete al
0x62,0xf4,0x7f,0x08,0x44,0xc0

# ATT: {evex} setne %al
# INTEL: {evex} setne al
0x62,0xf4,0x7f,0x08,0x45,0xc0

# ATT: {evex} setbe %al
# INTEL: {evex} setbe al
0x62,0xf4,0x7f,0x08,0x46,0xc0

# ATT: {evex} seta %al
# INTEL: {evex} seta al
0x62,0xf4,0x7f,0x08,0x47,0xc0

# ATT: {evex} sets %al
# INTEL: {evex} sets al
0x62,0xf4,0x7f,0x08,0x48,0xc0

# ATT: {evex} setns %al
# INTEL: {evex} setns al
0x62,0xf4,0x7f,0x08,0x49,0xc0

# ATT: {evex} setp %al
# INTEL: {evex} setp al
0x62,0xf4,0x7f,0x08,0x4a,0xc0

# ATT: {evex} setnp %al
# INTEL: {evex} setnp al
0x62,0xf4,0x7f,0x08,0x4b,0xc0

# ATT: {evex} setl %al
# INTEL: {evex} setl al
0x62,0xf4,0x7f,0x08,0x4c,0xc0

# ATT: {evex} setge %al
# INTEL: {evex} setge al
0x62,0xf4,0x7f,0x08,0x4d,0xc0

# ATT: {evex} setle %al
# INTEL: {evex} setle al
0x62,0xf4,0x7f,0x08,0x4e,0xc0

# ATT: {evex} setg %al
# INTEL: {evex} setg al
0x62,0xf4,0x7f,0x08,0x4f,0xc0

# ATT: {evex} seto (%rax)
# INTEL: {evex} seto byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x40,0x00

# ATT: {evex} setno (%rax)
# INTEL: {evex} setno byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x41,0x00

# ATT: {evex} setb (%rax)
# INTEL: {evex} setb byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x42,0x00

# ATT: {evex} setae (%rax)
# INTEL: {evex} setae byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x43,0x00

# ATT: {evex} sete (%rax)
# INTEL: {evex} sete byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x44,0x00

# ATT: {evex} setne (%rax)
# INTEL: {evex} setne byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x45,0x00

# ATT: {evex} setbe (%rax)
# INTEL: {evex} setbe byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x46,0x00

# ATT: {evex} seta (%rax)
# INTEL: {evex} seta byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x47,0x00

# ATT: {evex} sets (%rax)
# INTEL: {evex} sets byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x48,0x00

# ATT: {evex} setns (%rax)
# INTEL: {evex} setns byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x49,0x00

# ATT: {evex} setp (%rax)
# INTEL: {evex} setp byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x4a,0x00

# ATT: {evex} setnp (%rax)
# INTEL: {evex} setnp byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x4b,0x00

# ATT: {evex} setl (%rax)
# INTEL: {evex} setl byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x4c,0x00

# ATT: {evex} setge (%rax)
# INTEL: {evex} setge byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x4d,0x00

# ATT: {evex} setle (%rax)
# INTEL: {evex} setle byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x4e,0x00

# ATT: {evex} setg (%rax)
# INTEL: {evex} setg byte ptr [rax]
0x62,0xf4,0x7f,0x08,0x4f,0x00
Loading