300 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx10.2 | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+avx10.2 | FileCheck %s --check-prefix=X864 5define i1 @hoeq(half %x, half %y) {6; X64-LABEL: hoeq:7; X64: # %bb.0:8; X64-NEXT: vucomxsh %xmm1, %xmm09; X64-NEXT: sete %al10; X64-NEXT: retq11;12; X86-LABEL: hoeq:13; X86: # %bb.0:14; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero15; X86-NEXT: vucomxsh {{[0-9]+}}(%esp), %xmm016; X86-NEXT: sete %al17; X86-NEXT: retl18 %1 = fcmp oeq half %x, %y19 ret i1 %120}21 22define i1 @hune(half %x, half %y) {23; X64-LABEL: hune:24; X64: # %bb.0:25; X64-NEXT: vucomxsh %xmm1, %xmm026; X64-NEXT: setne %al27; X64-NEXT: retq28;29; X86-LABEL: hune:30; X86: # %bb.0:31; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero32; X86-NEXT: vucomxsh {{[0-9]+}}(%esp), %xmm033; X86-NEXT: setne %al34; X86-NEXT: retl35 %1 = fcmp une half %x, %y36 ret i1 %137}38 39define i1 @hoeq_mem(ptr %xp, ptr %yp) {40; X64-LABEL: hoeq_mem:41; X64: # %bb.0:42; X64-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero43; X64-NEXT: vucomxsh (%rsi), %xmm044; X64-NEXT: sete %al45; X64-NEXT: retq46;47; X86-LABEL: hoeq_mem:48; X86: # %bb.0:49; X86-NEXT: movl {{[0-9]+}}(%esp), %eax50; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx51; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero52; X86-NEXT: vucomxsh (%eax), %xmm053; X86-NEXT: sete %al54; X86-NEXT: retl55 %x = load half, ptr %xp56 %y = load half, ptr %yp57 %1 = fcmp oeq half %x, %y58 ret i1 %159}60 61define i1 @hune_mem(ptr %xp, ptr %yp) {62; X64-LABEL: hune_mem:63; X64: # %bb.0:64; X64-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero65; X64-NEXT: vucomxsh (%rsi), %xmm066; X64-NEXT: setne %al67; X64-NEXT: retq68;69; X86-LABEL: hune_mem:70; X86: # %bb.0:71; X86-NEXT: movl {{[0-9]+}}(%esp), %eax72; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx73; X86-NEXT: vmovsh {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero74; X86-NEXT: vucomxsh (%eax), %xmm075; X86-NEXT: setne %al76; X86-NEXT: retl77 %x = load half, ptr %xp78 %y = load half, ptr %yp79 %1 = fcmp une half %x, %y80 ret i1 %181}82 83define i1 @foeq(float %x, float %y) {84; X64-LABEL: foeq:85; X64: # %bb.0:86; X64-NEXT: vucomxss %xmm1, %xmm087; X64-NEXT: sete %al88; X64-NEXT: retq89;90; X86-LABEL: foeq:91; X86: # %bb.0:92; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero93; X86-NEXT: vucomxss {{[0-9]+}}(%esp), %xmm094; X86-NEXT: sete %al95; X86-NEXT: retl96 %1 = fcmp oeq float %x, %y97 ret i1 %198}99 100define i1 @fune(float %x, float %y) {101; X64-LABEL: fune:102; X64: # %bb.0:103; X64-NEXT: vucomxss %xmm1, %xmm0104; X64-NEXT: setne %al105; X64-NEXT: retq106;107; X86-LABEL: fune:108; X86: # %bb.0:109; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero110; X86-NEXT: vucomxss {{[0-9]+}}(%esp), %xmm0111; X86-NEXT: setne %al112; X86-NEXT: retl113 %1 = fcmp une float %x, %y114 ret i1 %1115}116 117define i1 @foeq_mem(ptr %xp, ptr %yp) {118; X64-LABEL: foeq_mem:119; X64: # %bb.0:120; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero121; X64-NEXT: vucomxss (%rsi), %xmm0122; X64-NEXT: sete %al123; X64-NEXT: retq124;125; X86-LABEL: foeq_mem:126; X86: # %bb.0:127; X86-NEXT: movl {{[0-9]+}}(%esp), %eax128; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx129; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero130; X86-NEXT: vucomxss (%eax), %xmm0131; X86-NEXT: sete %al132; X86-NEXT: retl133 %x = load float, ptr %xp134 %y = load float, ptr %yp135 %1 = fcmp oeq float %x, %y136 ret i1 %1137}138 139define i1 @fune_mem(ptr %xp, ptr %yp) {140; X64-LABEL: fune_mem:141; X64: # %bb.0:142; X64-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero143; X64-NEXT: vucomxss (%rsi), %xmm0144; X64-NEXT: setne %al145; X64-NEXT: retq146;147; X86-LABEL: fune_mem:148; X86: # %bb.0:149; X86-NEXT: movl {{[0-9]+}}(%esp), %eax150; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx151; X86-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero152; X86-NEXT: vucomxss (%eax), %xmm0153; X86-NEXT: setne %al154; X86-NEXT: retl155 %x = load float, ptr %xp156 %y = load float, ptr %yp157 %1 = fcmp une float %x, %y158 ret i1 %1159}160 161define i1 @doeq(double %x, double %y) {162; X64-LABEL: doeq:163; X64: # %bb.0:164; X64-NEXT: vucomxsd %xmm1, %xmm0165; X64-NEXT: sete %al166; X64-NEXT: retq167;168; X86-LABEL: doeq:169; X86: # %bb.0:170; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero171; X86-NEXT: vucomxsd {{[0-9]+}}(%esp), %xmm0172; X86-NEXT: sete %al173; X86-NEXT: retl174 %1 = fcmp oeq double %x, %y175 ret i1 %1176}177 178define i1 @dune(double %x, double %y) {179; X64-LABEL: dune:180; X64: # %bb.0:181; X64-NEXT: vucomxsd %xmm1, %xmm0182; X64-NEXT: setne %al183; X64-NEXT: retq184;185; X86-LABEL: dune:186; X86: # %bb.0:187; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero188; X86-NEXT: vucomxsd {{[0-9]+}}(%esp), %xmm0189; X86-NEXT: setne %al190; X86-NEXT: retl191 %1 = fcmp une double %x, %y192 ret i1 %1193}194 195define i1 @doeq_mem(ptr %xp, ptr %yp) {196; X64-LABEL: doeq_mem:197; X64: # %bb.0:198; X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero199; X64-NEXT: vucomxsd (%rsi), %xmm0200; X64-NEXT: sete %al201; X64-NEXT: retq202;203; X86-LABEL: doeq_mem:204; X86: # %bb.0:205; X86-NEXT: movl {{[0-9]+}}(%esp), %eax206; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx207; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero208; X86-NEXT: vucomxsd (%eax), %xmm0209; X86-NEXT: sete %al210; X86-NEXT: retl211 %x = load double, ptr %xp212 %y = load double, ptr %yp213 %1 = fcmp oeq double %x, %y214 ret i1 %1215}216 217define i1 @dune_mem(ptr %xp, ptr %yp) {218; X64-LABEL: dune_mem:219; X64: # %bb.0:220; X64-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero221; X64-NEXT: vucomxsd (%rsi), %xmm0222; X64-NEXT: setne %al223; X64-NEXT: retq224;225; X86-LABEL: dune_mem:226; X86: # %bb.0:227; X86-NEXT: movl {{[0-9]+}}(%esp), %eax228; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx229; X86-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero230; X86-NEXT: vucomxsd (%eax), %xmm0231; X86-NEXT: setne %al232; X86-NEXT: retl233 %x = load double, ptr %xp234 %y = load double, ptr %yp235 %1 = fcmp une double %x, %y236 ret i1 %1237}238 239define i32 @PR118606(x86_fp80 %val1) #0 {240; X64-LABEL: PR118606:241; X64: # %bb.0: # %entry242; X64-NEXT: fldt {{[0-9]+}}(%rsp)243; X64-NEXT: fldz244; X64-NEXT: fucomi %st(1), %st245; X64-NEXT: fstp %st(1)246; X64-NEXT: fld1247; X64-NEXT: fcmovne %st(1), %st248; X64-NEXT: fcmovu %st(1), %st249; X64-NEXT: fucompi %st(1), %st250; X64-NEXT: fstp %st(0)251; X64-NEXT: xorl %eax, %eax252; X64-NEXT: retq253;254; X86-LABEL: PR118606:255; X86: # %bb.0: # %entry256; X86-NEXT: fldt {{[0-9]+}}(%esp)257; X86-NEXT: fldz258; X86-NEXT: fucomi %st(1), %st259; X86-NEXT: fstp %st(1)260; X86-NEXT: fld1261; X86-NEXT: fcmovne %st(1), %st262; X86-NEXT: fcmovu %st(1), %st263; X86-NEXT: fucompi %st(1), %st264; X86-NEXT: fstp %st(0)265; X86-NEXT: xorl %eax, %eax266; X86-NEXT: retl267entry:268 %cmp8 = fcmp oeq x86_fp80 %val1, 0xK00000000000000000000269 %0 = select i1 %cmp8, x86_fp80 0xK3FFF8000000000000000, x86_fp80 0xK00000000000000000000270 %cmp64 = fcmp ogt x86_fp80 %0, 0xK00000000000000000000271 br i1 %cmp64, label %if.then66, label %if.end70272 273if.then66: ; preds = %entry274 ret i32 0275 276if.end70: ; preds = %entry277 ret i32 0278}279 280define i1 @constrained_fcmp() {281; X64-LABEL: constrained_fcmp:282; X64: # %bb.0: # %entry283; X64-NEXT: vxorpd %xmm0, %xmm0, %xmm0284; X64-NEXT: vucomxsd %xmm0, %xmm0285; X64-NEXT: setne %al286; X64-NEXT: retq287;288; X86-LABEL: constrained_fcmp:289; X86: # %bb.0: # %entry290; X86-NEXT: vxorpd %xmm0, %xmm0, %xmm0291; X86-NEXT: vucomxsd %xmm0, %xmm0292; X86-NEXT: setne %al293; X86-NEXT: retl294entry:295 %0 = tail call i1 @llvm.experimental.constrained.fcmps.f64(double 0.000000e+00, double 0.000000e+00, metadata !"une", metadata !"fpexcept.strict")296 ret i1 %0297}298 299declare i1 @llvm.experimental.constrained.fcmps.f64(double, double, metadata, metadata)300