Add a ARM-specific SD node for VBSL so that forms with a constant first operand
[oota-llvm.git] / test / CodeGen / ARM / vbsl-constant.ll
1 ; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
2
3 define <8 x i8> @v_bsli8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
4 ;CHECK: v_bsli8:
5 ;CHECK: vbsl
6         %tmp1 = load <8 x i8>* %A
7         %tmp2 = load <8 x i8>* %B
8         %tmp3 = load <8 x i8>* %C
9         %tmp4 = and <8 x i8> %tmp1, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
10         %tmp6 = and <8 x i8> %tmp3, <i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4>
11         %tmp7 = or <8 x i8> %tmp4, %tmp6
12         ret <8 x i8> %tmp7
13 }
14
15 define <4 x i16> @v_bsli16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
16 ;CHECK: v_bsli16:
17 ;CHECK: vbsl
18         %tmp1 = load <4 x i16>* %A
19         %tmp2 = load <4 x i16>* %B
20         %tmp3 = load <4 x i16>* %C
21         %tmp4 = and <4 x i16> %tmp1, <i16 3, i16 3, i16 3, i16 3>
22         %tmp6 = and <4 x i16> %tmp3, <i16 -4, i16 -4, i16 -4, i16 -4>
23         %tmp7 = or <4 x i16> %tmp4, %tmp6
24         ret <4 x i16> %tmp7
25 }
26
27 define <2 x i32> @v_bsli32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
28 ;CHECK: v_bsli32:
29 ;CHECK: vbsl
30         %tmp1 = load <2 x i32>* %A
31         %tmp2 = load <2 x i32>* %B
32         %tmp3 = load <2 x i32>* %C
33         %tmp4 = and <2 x i32> %tmp1, <i32 3, i32 3>
34         %tmp6 = and <2 x i32> %tmp3, <i32 -4, i32 -4>
35         %tmp7 = or <2 x i32> %tmp4, %tmp6
36         ret <2 x i32> %tmp7
37 }
38
39 define <1 x i64> @v_bsli64(<1 x i64>* %A, <1 x i64>* %B, <1 x i64>* %C) nounwind {
40 ;CHECK: v_bsli64:
41 ;CHECK: vbsl
42         %tmp1 = load <1 x i64>* %A
43         %tmp2 = load <1 x i64>* %B
44         %tmp3 = load <1 x i64>* %C
45         %tmp4 = and <1 x i64> %tmp1, <i64 3>
46         %tmp6 = and <1 x i64> %tmp3, <i64 -4>
47         %tmp7 = or <1 x i64> %tmp4, %tmp6
48         ret <1 x i64> %tmp7
49 }
50
51 define <16 x i8> @v_bslQi8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8>* %C) nounwind {
52 ;CHECK: v_bslQi8:
53 ;CHECK: vbsl
54         %tmp1 = load <16 x i8>* %A
55         %tmp2 = load <16 x i8>* %B
56         %tmp3 = load <16 x i8>* %C
57         %tmp4 = and <16 x i8> %tmp1, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
58         %tmp6 = and <16 x i8> %tmp3, <i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4, i8 -4>
59         %tmp7 = or <16 x i8> %tmp4, %tmp6
60         ret <16 x i8> %tmp7
61 }
62
63 define <8 x i16> @v_bslQi16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
64 ;CHECK: v_bslQi16:
65 ;CHECK: vbsl
66         %tmp1 = load <8 x i16>* %A
67         %tmp2 = load <8 x i16>* %B
68         %tmp3 = load <8 x i16>* %C
69         %tmp4 = and <8 x i16> %tmp1, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3>
70         %tmp6 = and <8 x i16> %tmp3, <i16 -4, i16 -4, i16 -4, i16 -4, i16 -4, i16 -4, i16 -4, i16 -4>
71         %tmp7 = or <8 x i16> %tmp4, %tmp6
72         ret <8 x i16> %tmp7
73 }
74
75 define <4 x i32> @v_bslQi32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
76 ;CHECK: v_bslQi32:
77 ;CHECK: vbsl
78         %tmp1 = load <4 x i32>* %A
79         %tmp2 = load <4 x i32>* %B
80         %tmp3 = load <4 x i32>* %C
81         %tmp4 = and <4 x i32> %tmp1, <i32 3, i32 3, i32 3, i32 3>
82         %tmp6 = and <4 x i32> %tmp3, <i32 -4, i32 -4, i32 -4, i32 -4>
83         %tmp7 = or <4 x i32> %tmp4, %tmp6
84         ret <4 x i32> %tmp7
85 }
86
87 define <2 x i64> @v_bslQi64(<2 x i64>* %A, <2 x i64>* %B, <2 x i64>* %C) nounwind {
88 ;CHECK: v_bslQi64:
89 ;CHECK: vbsl
90         %tmp1 = load <2 x i64>* %A
91         %tmp2 = load <2 x i64>* %B
92         %tmp3 = load <2 x i64>* %C
93         %tmp4 = and <2 x i64> %tmp1, <i64 3, i64 3>
94         %tmp6 = and <2 x i64> %tmp3, <i64 -4, i64 -4>
95         %tmp7 = or <2 x i64> %tmp4, %tmp6
96         ret <2 x i64> %tmp7
97 }