• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx  | FileCheck %s --check-prefix=AVX
3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx2 | FileCheck %s --check-prefix=AVX
4
5; Prefer a blend instruction to a vinsert128 instruction because blends
6; are simpler (no lane changes) and therefore will have equal or better
7; performance.
8
9define <8 x float> @castA(<4 x float> %m) nounwind uwtable readnone ssp {
10; AVX-LABEL: castA:
11; AVX:       ## %bb.0:
12; AVX-NEXT:    vmovaps %xmm0, %xmm0
13; AVX-NEXT:    retq
14  %shuffle.i = shufflevector <4 x float> %m, <4 x float> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 4, i32 4, i32 4>
15  ret <8 x float> %shuffle.i
16}
17
18define <4 x double> @castB(<2 x double> %m) nounwind uwtable readnone ssp {
19; AVX-LABEL: castB:
20; AVX:       ## %bb.0:
21; AVX-NEXT:    vmovaps %xmm0, %xmm0
22; AVX-NEXT:    retq
23  %shuffle.i = shufflevector <2 x double> %m, <2 x double> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 2>
24  ret <4 x double> %shuffle.i
25}
26
27; AVX2 is needed for integer types.
28
29define <4 x i64> @castC(<2 x i64> %m) nounwind uwtable readnone ssp {
30; AVX-LABEL: castC:
31; AVX:       ## %bb.0:
32; AVX-NEXT:    vmovaps %xmm0, %xmm0
33; AVX-NEXT:    retq
34  %shuffle.i = shufflevector <2 x i64> %m, <2 x i64> zeroinitializer, <4 x i32> <i32 0, i32 1, i32 2, i32 2>
35  ret <4 x i64> %shuffle.i
36}
37
38; The next three tests don't need any shuffling. There may or may not be a
39; vzeroupper before the return, so just check for the absence of shuffles.
40
41define <4 x float> @castD(<8 x float> %m) nounwind uwtable readnone ssp {
42; AVX-LABEL: castD:
43; AVX:       ## %bb.0:
44; AVX-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
45; AVX-NEXT:    vzeroupper
46; AVX-NEXT:    retq
47  %shuffle.i = shufflevector <8 x float> %m, <8 x float> %m, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
48  ret <4 x float> %shuffle.i
49}
50
51define <2 x i64> @castE(<4 x i64> %m) nounwind uwtable readnone ssp {
52; AVX-LABEL: castE:
53; AVX:       ## %bb.0:
54; AVX-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
55; AVX-NEXT:    vzeroupper
56; AVX-NEXT:    retq
57  %shuffle.i = shufflevector <4 x i64> %m, <4 x i64> %m, <2 x i32> <i32 0, i32 1>
58  ret <2 x i64> %shuffle.i
59}
60
61define <2 x double> @castF(<4 x double> %m) nounwind uwtable readnone ssp {
62; AVX-LABEL: castF:
63; AVX:       ## %bb.0:
64; AVX-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
65; AVX-NEXT:    vzeroupper
66; AVX-NEXT:    retq
67  %shuffle.i = shufflevector <4 x double> %m, <4 x double> %m, <2 x i32> <i32 0, i32 1>
68  ret <2 x double> %shuffle.i
69}
70
71