Fix PR10688. Add support for spliting 256-bit vector shifts when the
[oota-llvm.git] / test / CodeGen / X86 / avx-shift.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -mattr=+avx | FileCheck %s
2
3 ;;; Shift left
4 ; CHECK: vpslld
5 ; CHECK: vpslld
6 define <8 x i32> @vshift00(<8 x i32> %a) nounwind readnone {
7   %s = shl <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
8 2>
9   ret <8 x i32> %s
10 }
11
12 ; CHECK: vpsllw
13 ; CHECK: vpsllw
14 define <16 x i16> @vshift01(<16 x i16> %a) nounwind readnone {
15   %s = shl <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
16   ret <16 x i16> %s
17 }
18
19 ; CHECK: vpsllq
20 ; CHECK: vpsllq
21 define <4 x i64> @vshift02(<4 x i64> %a) nounwind readnone {
22   %s = shl <4 x i64> %a, <i64 2, i64 2, i64 2, i64 2>
23   ret <4 x i64> %s
24 }
25
26 ;;; Logical Shift right
27 ; CHECK: vpsrld
28 ; CHECK: vpsrld
29 define <8 x i32> @vshift03(<8 x i32> %a) nounwind readnone {
30   %s = lshr <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
31 2>
32   ret <8 x i32> %s
33 }
34
35 ; CHECK: vpsrlw
36 ; CHECK: vpsrlw
37 define <16 x i16> @vshift04(<16 x i16> %a) nounwind readnone {
38   %s = lshr <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
39   ret <16 x i16> %s
40 }
41
42 ; CHECK: vpsrlq
43 ; CHECK: vpsrlq
44 define <4 x i64> @vshift05(<4 x i64> %a) nounwind readnone {
45   %s = lshr <4 x i64> %a, <i64 2, i64 2, i64 2, i64 2>
46   ret <4 x i64> %s
47 }
48
49 ;;; Arithmetic Shift right
50 ; CHECK: vpsrad
51 ; CHECK: vpsrad
52 define <8 x i32> @vshift06(<8 x i32> %a) nounwind readnone {
53   %s = ashr <8 x i32> %a, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32
54 2>
55   ret <8 x i32> %s
56 }
57
58 ; CHECK: vpsraw
59 ; CHECK: vpsraw
60 define <16 x i16> @vshift07(<16 x i16> %a) nounwind readnone {
61   %s = ashr <16 x i16> %a, <i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
62   ret <16 x i16> %s
63 }
64
65 ;;; Support variable shifts
66 ; CHECK: _vshift08
67 ; CHECK: vextractf128 $1
68 ; CHECK: vpslld $23
69 ; CHECK: vextractf128 $1
70 ; CHECK: vpslld $23
71 define <8 x i32> @vshift08(<8 x i32> %a) nounwind {
72   %bitop = shl <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %a
73   ret <8 x i32> %bitop
74 }
75