Skip to content

Commit 09d1f74

Browse files
author
mattarde
committed
update compare opt
1 parent 8673d0e commit 09d1f74

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

llvm/lib/Target/X86/X86ISelLowering.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
10561056
}
10571057
}
10581058

1059+
if(Subtarget.hasAVX10_2_512()){
1060+
for (auto FVT : { MVT::f16, MVT::f32, MVT::f64 }) {
1061+
setOperationAction(ISD::SETCC, FVT, Custom);
1062+
}
1063+
}
10591064
// FIXME: In order to prevent SSE instructions being expanded to MMX ones
10601065
// with -msoft-float, disable use of MMX as well.
10611066
if (!Subtarget.useSoftFloat() && Subtarget.hasMMX()) {
@@ -49520,6 +49525,14 @@ static SDValue combineCompareEqual(SDNode *N, SelectionDAG &DAG,
4952049525
// FIXME: need symbolic constants for these magic numbers.
4952149526
// See X86ATTInstPrinter.cpp:printSSECC().
4952249527
unsigned x86cc = (cc0 == X86::COND_E) ? 0 : 4;
49528+
// VCOMXSS simplifies conditional code sequence into single setcc
49529+
// node. Earlier until COMI, it required upto 2 SETCC's to test CC.
49530+
if (Subtarget.hasAVX10_2()) {
49531+
return getSETCC(
49532+
((cc0 == X86::COND_E) ? X86::COND_E : X86::COND_NE),
49533+
DAG.getNode(X86ISD::UCOMX, DL, MVT::i32, CMP00, CMP01), DL,
49534+
DAG);
49535+
}
4952349536
if (Subtarget.hasAVX512()) {
4952449537
SDValue FSetCC =
4952549538
DAG.getNode(X86ISD::FSETCCM, DL, MVT::v1i1, CMP00, CMP01,

llvm/lib/Target/X86/X86InstrAVX10.td

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,6 +1541,24 @@ defm VFNMSUB132NEPBF16 : avx10_fma3p_132_bf16<0x9E, "vfnmsub132nepbf16", X86any_
15411541
//-------------------------------------------------
15421542
// AVX10 COMEF instructions
15431543
//-------------------------------------------------
1544+
multiclass avx10_com_ef<bits<8> Opc, RegisterClass RC, ValueType VT,
1545+
SDPatternOperator OpNode, string OpcodeStr,
1546+
X86MemOperand x86memop, PatFrag ld_frag,
1547+
Domain d, X86FoldableSchedWrite sched = WriteFComX>{
1548+
let ExeDomain = d, mayRaiseFPException = 1, isCodeGenOnly = 1 in {
1549+
def rr : AVX512<Opc, MRMSrcReg, (outs), (ins RC:$src1, RC:$src2),
1550+
!strconcat(OpcodeStr, "\t{$src2, $src1|$src1, $src2}"),
1551+
[(set EFLAGS, (OpNode (VT RC:$src1), RC:$src2))]>,
1552+
EVEX, EVEX_V128, Sched<[sched]>, SIMD_EXC;
1553+
let mayLoad = 1 in {
1554+
def rm : AVX512<Opc, MRMSrcMem, (outs), (ins RC:$src1, x86memop:$src2),
1555+
!strconcat(OpcodeStr, "\t{$src2, $src1|$src1, $src2}"),
1556+
[(set EFLAGS, (OpNode (VT RC:$src1), (ld_frag addr:$src2)))]>,
1557+
EVEX, EVEX_V128, Sched<[sched.Folded, sched.ReadAfterFold]>, SIMD_EXC;
1558+
}
1559+
}
1560+
}
1561+
15441562
multiclass avx10_com_ef_int<bits<8> Opc, X86VectorVTInfo _, SDNode OpNode,
15451563
string OpcodeStr,
15461564
Domain d,
@@ -1564,6 +1582,16 @@ multiclass avx10_com_ef_int<bits<8> Opc, X86VectorVTInfo _, SDNode OpNode,
15641582
}
15651583

15661584
let Defs = [EFLAGS], Uses = [MXCSR], Predicates = [HasAVX10_2] in {
1585+
1586+
defm VUCOMXSDZ : avx10_com_ef<0x2e, FR64X, f64, X86ucomi512,
1587+
"vucomxsd", f64mem, loadf64, SSEPackedSingle>,
1588+
TB, XS, VEX_LIG, REX_W, EVEX_CD8<64, CD8VT1>;
1589+
defm VUCOMXSHZ : avx10_com_ef<0x2e, FR16X, f16, X86ucomi512,
1590+
"vucomxsh", f16mem, loadf16, SSEPackedSingle>,
1591+
T_MAP5, XD, EVEX_CD8<16, CD8VT1>;
1592+
defm VUCOMXSSZ : avx10_com_ef<0x2e, FR32X, f32, X86ucomi512,
1593+
"vucomxss", f32mem, loadf32, SSEPackedSingle>,
1594+
TB, XD, VEX_LIG, EVEX_CD8<32, CD8VT1>;
15671595
defm VCOMXSDZ : avx10_com_ef_int<0x2f, v2f64x_info, X86comi512,
15681596
"vcomxsd", SSEPackedDouble>,
15691597
TB, XS, VEX_LIG, REX_W, EVEX_CD8<64, CD8VT1>;

llvm/test/TableGen/x86-fold-tables.inc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,8 +1959,11 @@ static const X86FoldTableEntry Table1[] = {
19591959
{X86::VUCOMISSZrr_Int, X86::VUCOMISSZrm_Int, TB_NO_REVERSE},
19601960
{X86::VUCOMISSrr, X86::VUCOMISSrm, 0},
19611961
{X86::VUCOMISSrr_Int, X86::VUCOMISSrm_Int, TB_NO_REVERSE},
1962+
{X86::VUCOMXSDZrr, X86::VUCOMXSDZrm, 0},
19621963
{X86::VUCOMXSDZrr_Int, X86::VUCOMXSDZrm_Int, TB_NO_REVERSE},
1964+
{X86::VUCOMXSHZrr, X86::VUCOMXSHZrm, 0},
19631965
{X86::VUCOMXSHZrr_Int, X86::VUCOMXSHZrm_Int, TB_NO_REVERSE},
1966+
{X86::VUCOMXSSZrr, X86::VUCOMXSSZrm, 0},
19641967
{X86::VUCOMXSSZrr_Int, X86::VUCOMXSSZrm_Int, TB_NO_REVERSE},
19651968
{X86::XOR16ri8_ND, X86::XOR16mi8_ND, 0},
19661969
{X86::XOR16ri8_NF_ND, X86::XOR16mi8_NF_ND, 0},

0 commit comments

Comments
 (0)