• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i386--   -mattr=sse2     | FileCheck %s --check-prefixes=X86,X86-SSE
3; RUN: llc < %s -mtriple=i386--   -mattr=sse4.1   | FileCheck %s --check-prefixes=X86,X86-SSE
4; RUN: llc < %s -mtriple=i386--   -mattr=avx2     | FileCheck %s --check-prefixes=X86,X86-AVX2
5; RUN: llc < %s -mtriple=i386--   -mattr=avx512f  | FileCheck %s --check-prefixes=X86,X86-AVX512F
6; RUN: llc < %s -mtriple=x86_64-- -mattr=sse2     | FileCheck %s --check-prefix=X64-SSE
7; RUN: llc < %s -mtriple=x86_64-- -mattr=sse4.1   | FileCheck %s --check-prefix=X64-SSE
8; RUN: llc < %s -mtriple=x86_64-- -mattr=avx2     | FileCheck %s --check-prefixes=X64-AVX,X64-AVX2
9; RUN: llc < %s -mtriple=x86_64-- -mattr=avx512f  | FileCheck %s --check-prefixes=X64-AVX,X64-AVX512F
10
11; This should do a single load into the fp stack for the return, not diddle with xmm registers.
12
13define float @icmp_select_fp_constants(i32 %x) nounwind readnone {
14; X86-LABEL: icmp_select_fp_constants:
15; X86:       # %bb.0:
16; X86-NEXT:    xorl %eax, %eax
17; X86-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
18; X86-NEXT:    sete %al
19; X86-NEXT:    flds {{\.LCPI.*}}(,%eax,4)
20; X86-NEXT:    retl
21;
22; X64-SSE-LABEL: icmp_select_fp_constants:
23; X64-SSE:       # %bb.0:
24; X64-SSE-NEXT:    xorl %eax, %eax
25; X64-SSE-NEXT:    testl %edi, %edi
26; X64-SSE-NEXT:    sete %al
27; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
28; X64-SSE-NEXT:    retq
29;
30; X64-AVX-LABEL: icmp_select_fp_constants:
31; X64-AVX:       # %bb.0:
32; X64-AVX-NEXT:    xorl %eax, %eax
33; X64-AVX-NEXT:    testl %edi, %edi
34; X64-AVX-NEXT:    sete %al
35; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
36; X64-AVX-NEXT:    retq
37	%c = icmp eq i32 %x, 0
38	%r = select i1 %c, float 42.0, float 23.0
39	ret float %r
40}
41
42define float @fcmp_select_fp_constants(float %x) nounwind readnone {
43; X86-SSE-LABEL: fcmp_select_fp_constants:
44; X86-SSE:       # %bb.0:
45; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
46; X86-SSE-NEXT:    cmpneqss {{[0-9]+}}(%esp), %xmm0
47; X86-SSE-NEXT:    movd %xmm0, %eax
48; X86-SSE-NEXT:    andl $1, %eax
49; X86-SSE-NEXT:    flds {{\.LCPI.*}}(,%eax,4)
50; X86-SSE-NEXT:    retl
51;
52; X86-AVX2-LABEL: fcmp_select_fp_constants:
53; X86-AVX2:       # %bb.0:
54; X86-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
55; X86-AVX2-NEXT:    vcmpneqss {{[0-9]+}}(%esp), %xmm0, %xmm0
56; X86-AVX2-NEXT:    vmovd %xmm0, %eax
57; X86-AVX2-NEXT:    andl $1, %eax
58; X86-AVX2-NEXT:    flds {{\.LCPI.*}}(,%eax,4)
59; X86-AVX2-NEXT:    retl
60;
61; X86-AVX512F-LABEL: fcmp_select_fp_constants:
62; X86-AVX512F:       # %bb.0:
63; X86-AVX512F-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
64; X86-AVX512F-NEXT:    vcmpneqss {{\.LCPI.*}}, %xmm0, %k0
65; X86-AVX512F-NEXT:    kmovw %k0, %eax
66; X86-AVX512F-NEXT:    flds {{\.LCPI.*}}(,%eax,4)
67; X86-AVX512F-NEXT:    retl
68;
69; X64-SSE-LABEL: fcmp_select_fp_constants:
70; X64-SSE:       # %bb.0:
71; X64-SSE-NEXT:    cmpneqss {{.*}}(%rip), %xmm0
72; X64-SSE-NEXT:    movd %xmm0, %eax
73; X64-SSE-NEXT:    andl $1, %eax
74; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
75; X64-SSE-NEXT:    retq
76;
77; X64-AVX2-LABEL: fcmp_select_fp_constants:
78; X64-AVX2:       # %bb.0:
79; X64-AVX2-NEXT:    vcmpneqss {{.*}}(%rip), %xmm0, %xmm0
80; X64-AVX2-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
81; X64-AVX2-NEXT:    vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero
82; X64-AVX2-NEXT:    vblendvps %xmm0, %xmm1, %xmm2, %xmm0
83; X64-AVX2-NEXT:    retq
84;
85; X64-AVX512F-LABEL: fcmp_select_fp_constants:
86; X64-AVX512F:       # %bb.0:
87; X64-AVX512F-NEXT:    vcmpneqss {{.*}}(%rip), %xmm0, %k1
88; X64-AVX512F-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
89; X64-AVX512F-NEXT:    vmovss {{.*}}(%rip), %xmm0 {%k1}
90; X64-AVX512F-NEXT:    retq
91 %c = fcmp une float %x, -4.0
92 %r = select i1 %c, float 42.0, float 23.0
93 ret float %r
94}
95
96