Provide correct encodings for the get_lane and set_lane variants of vmov.
[oota-llvm.git] / test / MC / ARM / neon-bitwise-encoding.ll
1 ; RUN: llc -show-mc-encoding -march=arm -mcpu=cortex-a8 -mattr=+neon < %s | FileCheck %s
2
3 ; FIXME: The following instructions still require testing:
4 ;  - vand with immediate, vorr with immediate
5 ;  - both vbit and vbif
6
7 ; CHECK: vand_8xi8
8 define <8 x i8> @vand_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
9         %tmp1 = load <8 x i8>* %A
10         %tmp2 = load <8 x i8>* %B
11 ; CHECK: vand   d16, d17, d16           @ encoding: [0xb0,0x01,0x41,0xf2]
12         %tmp3 = and <8 x i8> %tmp1, %tmp2
13         ret <8 x i8> %tmp3
14 }
15
16 ; CHECK: vand_16xi8
17 define <16 x i8> @vand_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
18         %tmp1 = load <16 x i8>* %A
19         %tmp2 = load <16 x i8>* %B
20 ; CHECK: vand   q8, q8, q9              @ encoding: [0xf2,0x01,0x40,0xf2]
21         %tmp3 = and <16 x i8> %tmp1, %tmp2
22         ret <16 x i8> %tmp3
23 }
24
25 ; CHECK: veor_8xi8
26 define <8 x i8> @veor_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
27         %tmp1 = load <8 x i8>* %A
28         %tmp2 = load <8 x i8>* %B
29 ; CHECK: veor   d16, d17, d16           @ encoding: [0xb0,0x01,0x41,0xf3]
30         %tmp3 = xor <8 x i8> %tmp1, %tmp2
31         ret <8 x i8> %tmp3
32 }
33
34 ; CHECK: veor_16xi8
35 define <16 x i8> @veor_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
36         %tmp1 = load <16 x i8>* %A
37         %tmp2 = load <16 x i8>* %B
38 ; CHECK: veor   q8, q8, q9              @ encoding: [0xf2,0x01,0x40,0xf3]
39         %tmp3 = xor <16 x i8> %tmp1, %tmp2
40         ret <16 x i8> %tmp3
41 }
42
43 ; CHECK: vorr_8xi8
44 define <8 x i8> @vorr_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
45         %tmp1 = load <8 x i8>* %A
46         %tmp2 = load <8 x i8>* %B
47 ; CHECK: vorr   d16, d17, d16           @ encoding: [0xb0,0x01,0x61,0xf2]
48         %tmp3 = or <8 x i8> %tmp1, %tmp2
49         ret <8 x i8> %tmp3
50 }
51
52 ; CHECK: vorr_16xi8
53 define <16 x i8> @vorr_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
54         %tmp1 = load <16 x i8>* %A
55         %tmp2 = load <16 x i8>* %B
56 ; CHECK: vorr   q8, q8, q9              @ encoding: [0xf2,0x01,0x60,0xf2]
57         %tmp3 = or <16 x i8> %tmp1, %tmp2
58         ret <16 x i8> %tmp3
59 }
60
61 ; CHECK: vbic_8xi8
62 define <8 x i8> @vbic_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
63         %tmp1 = load <8 x i8>* %A
64         %tmp2 = load <8 x i8>* %B
65 ; CHECK: vbic   d16, d17, d16           @ encoding: [0xb0,0x01,0x51,0xf2]
66         %tmp3 = xor <8 x i8> %tmp2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
67         %tmp4 = and <8 x i8> %tmp1, %tmp3
68         ret <8 x i8> %tmp4
69 }
70
71 ; CHECK: vbic_16xi8
72 define <16 x i8> @vbic_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
73         %tmp1 = load <16 x i8>* %A
74         %tmp2 = load <16 x i8>* %B
75 ; CHECK: vbic   q8, q8, q9              @ encoding: [0xf2,0x01,0x50,0xf2]
76         %tmp3 = xor <16 x i8> %tmp2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
77         %tmp4 = and <16 x i8> %tmp1, %tmp3
78         ret <16 x i8> %tmp4
79 }
80
81 ; CHECK: vorn_8xi8
82 define <8 x i8> @vorn_8xi8(<8 x i8>* %A, <8 x i8>* %B) nounwind {
83         %tmp1 = load <8 x i8>* %A
84         %tmp2 = load <8 x i8>* %B
85 ; CHECK: vorn   d16, d17, d16           @ encoding: [0xb0,0x01,0x71,0xf2]
86         %tmp3 = xor <8 x i8> %tmp2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
87         %tmp4 = or <8 x i8> %tmp1, %tmp3
88         ret <8 x i8> %tmp4
89 }
90
91 ; CHECK: vorn_16xi8
92 define <16 x i8> @vorn_16xi8(<16 x i8>* %A, <16 x i8>* %B) nounwind {
93         %tmp1 = load <16 x i8>* %A
94         %tmp2 = load <16 x i8>* %B
95 ; CHECK: vorn   q8, q8, q9              @ encoding: [0xf2,0x01,0x70,0xf2]
96         %tmp3 = xor <16 x i8> %tmp2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
97         %tmp4 = or <16 x i8> %tmp1, %tmp3
98         ret <16 x i8> %tmp4
99 }
100
101 ; CHECK: vmvn_8xi8
102 define <8 x i8> @vmvn_8xi8(<8 x i8>* %A) nounwind {
103         %tmp1 = load <8 x i8>* %A
104 ; CHECK: vmvn   d16, d16                @ encoding: [0xa0,0x05,0xf0,0xf3]
105         %tmp2 = xor <8 x i8> %tmp1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
106         ret <8 x i8> %tmp2
107 }
108
109 ; CHECK: vmvn_16xi8
110 define <16 x i8> @vmvn_16xi8(<16 x i8>* %A) nounwind {
111         %tmp1 = load <16 x i8>* %A
112 ; CHECK: vmvn   q8, q8                  @ encoding: [0xe0,0x05,0xf0,0xf3]
113         %tmp2 = xor <16 x i8> %tmp1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
114         ret <16 x i8> %tmp2
115 }
116
117 ; CHECK: vbsl_8xi8
118 define <8 x i8> @vbsl_8xi8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
119         %tmp1 = load <8 x i8>* %A
120         %tmp2 = load <8 x i8>* %B
121         %tmp3 = load <8 x i8>* %C
122 ; CHECK: vbsl   d18, d17, d16           @ encoding: [0xb0,0x21,0x51,0xf3]
123         %tmp4 = and <8 x i8> %tmp1, %tmp2
124         %tmp5 = xor <8 x i8> %tmp1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
125         %tmp6 = and <8 x i8> %tmp5, %tmp3
126         %tmp7 = or <8 x i8> %tmp4, %tmp6
127         ret <8 x i8> %tmp7
128 }
129
130 ; CHECK: vbsl_16xi8
131 define <16 x i8> @vbsl_16xi8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8>* %C) nounwind {
132         %tmp1 = load <16 x i8>* %A
133         %tmp2 = load <16 x i8>* %B
134         %tmp3 = load <16 x i8>* %C
135 ; CHECK: vbsl   q8, q10, q9             @ encoding: [0xf2,0x01,0x54,0xf3]
136         %tmp4 = and <16 x i8> %tmp1, %tmp2
137         %tmp5 = xor <16 x i8> %tmp1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1 >
138         %tmp6 = and <16 x i8> %tmp5, %tmp3
139         %tmp7 = or <16 x i8> %tmp4, %tmp6
140         ret <16 x i8> %tmp7
141 }