[RISCV][VLOPT] Add vector narrowing integer right shift instructions to isSupportedIn...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / logical-op-with-not.ll
blob080492a9ed56df87435f0c5bd79dd80b73bab3ba
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
4 define i64 @and_bic(i64 %0, i64 %1) {
5 ; CHECK-LABEL: and_bic:
6 ; CHECK:       // %bb.0:
7 ; CHECK-NEXT:    mvn w8, w0
8 ; CHECK-NEXT:    orr x8, x8, #0xffffffffffff00ff
9 ; CHECK-NEXT:    and x0, x8, x1
10 ; CHECK-NEXT:    ret
11   %3 = and i64 %0, 65280
12   %4 = xor i64 %3, -1
13   %5 = and i64 %4, %1
14   ret i64 %5
17 define i64 @and_bic2(i32 %0, i64 %1) {
18 ; CHECK-LABEL: and_bic2:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    mvn w8, w0
21 ; CHECK-NEXT:    orr w8, w8, #0xffff00ff
22 ; CHECK-NEXT:    and x0, x8, x1
23 ; CHECK-NEXT:    ret
24   %3 = and i32 %0, 65280
25   %4 = xor i32 %3, -1
26   %5 = zext i32 %4 to i64
27   %6 = and i64 %5, %1
28   ret i64 %6
31 define i32 @and_bic3(i32 %0, i32 %1) {
32 ; CHECK-LABEL: and_bic3:
33 ; CHECK:       // %bb.0:
34 ; CHECK-NEXT:    mvn w8, w0
35 ; CHECK-NEXT:    orr w8, w8, #0xffff00ff
36 ; CHECK-NEXT:    and w0, w8, w1
37 ; CHECK-NEXT:    ret
38   %3 = and i32 %0, 65280
39   %4 = xor i32 %3, -1
40   %5 = and i32 %4, %1
41   ret i32 %5
44 define i64 @and_eon(i64 %0, i64 %1) {
45 ; CHECK-LABEL: and_eon:
46 ; CHECK:       // %bb.0:
47 ; CHECK-NEXT:    and x8, x0, #0xff00
48 ; CHECK-NEXT:    eon x0, x8, x1
49 ; CHECK-NEXT:    ret
50   %3 = and i64 %0, 65280
51   %4 = xor i64 %3, %1
52   %5 = xor i64 %4, -1
53   ret i64 %5
56 define i64 @and_eon2(i32 %0, i64 %1) {
57 ; CHECK-LABEL: and_eon2:
58 ; CHECK:       // %bb.0:
59 ; CHECK-NEXT:    mvn w8, w0
60 ; CHECK-NEXT:    orr w8, w8, #0xffff00ff
61 ; CHECK-NEXT:    eor x0, x8, x1
62 ; CHECK-NEXT:    ret
63   %3 = and i32 %0, 65280
64   %4 = xor i32 %3, -1
65   %5 = zext i32 %4 to i64
66   %6 = xor i64 %5, %1
67   ret i64 %6
70 define i32 @and_eon3(i32 %0, i32 %1) {
71 ; CHECK-LABEL: and_eon3:
72 ; CHECK:       // %bb.0:
73 ; CHECK-NEXT:    and w8, w0, #0xff00
74 ; CHECK-NEXT:    eon w0, w8, w1
75 ; CHECK-NEXT:    ret
76   %3 = and i32 %0, 65280
77   %4 = xor i32 %3, %1
78   %5 = xor i32 %4, -1
79   ret i32 %5
82 define i64 @and_orn(i64 %0, i64 %1) {
83 ; CHECK-LABEL: and_orn:
84 ; CHECK:       // %bb.0:
85 ; CHECK-NEXT:    orn w8, w1, w0
86 ; CHECK-NEXT:    orr x0, x8, #0xffffffffffff00ff
87 ; CHECK-NEXT:    ret
88   %3 = and i64 %0, 65280
89   %4 = xor i64 %3, -1
90   %5 = or i64 %4, %1
91   ret i64 %5
94 define i64 @and_orn2(i32 %0, i64 %1) {
95 ; CHECK-LABEL: and_orn2:
96 ; CHECK:       // %bb.0:
97 ; CHECK-NEXT:    mvn w8, w0
98 ; CHECK-NEXT:    orr w8, w8, #0xffff00ff
99 ; CHECK-NEXT:    orr x0, x8, x1
100 ; CHECK-NEXT:    ret
101   %3 = and i32 %0, 65280
102   %4 = xor i32 %3, -1
103   %5 = zext i32 %4 to i64
104   %6 = or i64 %5, %1
105   ret i64 %6
108 define i32 @and_orn3(i32 %0, i32 %1) {
109 ; CHECK-LABEL: and_orn3:
110 ; CHECK:       // %bb.0:
111 ; CHECK-NEXT:    orn w8, w1, w0
112 ; CHECK-NEXT:    orr w0, w8, #0xffff00ff
113 ; CHECK-NEXT:    ret
114   %3 = and i32 %0, 65280
115   %4 = xor i32 %3, -1
116   %5 = or i32 %4, %1
117   ret i32 %5
120 define i64 @_Z6or_bic(i64 %0, i64 %1) {
121 ; CHECK-LABEL: _Z6or_bic:
122 ; CHECK:       // %bb.0:
123 ; CHECK-NEXT:    bic x8, x1, x0
124 ; CHECK-NEXT:    and x0, x8, #0xffffffffffff00ff
125 ; CHECK-NEXT:    ret
126   %3 = and i64 %0, -65281
127   %4 = xor i64 %3, -65281
128   %5 = and i64 %4, %1
129   ret i64 %5
132 define i64 @or_bic2(i32 %0, i64 %1) {
133 ; CHECK-LABEL: or_bic2:
134 ; CHECK:       // %bb.0:
135 ; CHECK-NEXT:    mov w8, #-65281
136 ; CHECK-NEXT:    bic w8, w8, w0
137 ; CHECK-NEXT:    and x0, x8, x1
138 ; CHECK-NEXT:    ret
139   %3 = and i32 %0, -65281
140   %4 = xor i32 %3, -65281
141   %5 = zext i32 %4 to i64
142   %6 = and i64 %5, %1
143   ret i64 %6
146 define i32 @or_bic3(i32 %0, i32 %1) {
147 ; CHECK-LABEL: or_bic3:
148 ; CHECK:       // %bb.0:
149 ; CHECK-NEXT:    bic w8, w1, w0
150 ; CHECK-NEXT:    and w0, w8, #0xfffff000
151 ; CHECK-NEXT:    ret
152   %3 = and i32 %0, -4096
153   %4 = xor i32 %3, -4096
154   %5 = and i32 %4, %1
155   ret i32 %5
158 define i64 @_Z6or_orn(i64 %0, i64 %1) {
159 ; CHECK-LABEL: _Z6or_orn:
160 ; CHECK:       // %bb.0:
161 ; CHECK-NEXT:    mov x8, #-4096
162 ; CHECK-NEXT:    bic x8, x8, x0
163 ; CHECK-NEXT:    orr x0, x8, x1
164 ; CHECK-NEXT:    ret
165   %3 = and i64 %0, -4096
166   %4 = xor i64 %3, -4096
167   %5 = or i64 %4, %1
168   ret i64 %5
171 define i64 @or_orn2(i32 %0, i64 %1) {
172 ; CHECK-LABEL: or_orn2:
173 ; CHECK:       // %bb.0:
174 ; CHECK-NEXT:    mov w8, #-4096
175 ; CHECK-NEXT:    bic w8, w8, w0
176 ; CHECK-NEXT:    orr x0, x8, x1
177 ; CHECK-NEXT:    ret
178   %3 = and i32 %0, -4096
179   %4 = xor i32 %3, -4096
180   %5 = zext i32 %4 to i64
181   %6 = or i64 %5, %1
182   ret i64 %6
185 define i64 @or_orn3(i32 %0, i64 %1) {
186 ; CHECK-LABEL: or_orn3:
187 ; CHECK:       // %bb.0:
188 ; CHECK-NEXT:    mov w8, #-4096
189 ; CHECK-NEXT:    bic w8, w8, w0
190 ; CHECK-NEXT:    orr x0, x8, x1
191 ; CHECK-NEXT:    ret
192   %3 = and i32 %0, -4096
193   %4 = xor i32 %3, -4096
194   %5 = zext i32 %4 to i64
195   %6 = or i64 %5, %1
196   ret i64 %6
199 define i64 @_Z6or_eon(i64 %0, i64 %1) {
200 ; CHECK-LABEL: _Z6or_eon:
201 ; CHECK:       // %bb.0:
202 ; CHECK-NEXT:    and x8, x0, #0xfffffffffffff000
203 ; CHECK-NEXT:    eor x8, x8, x1
204 ; CHECK-NEXT:    eor x0, x8, #0xfffffffffffff000
205 ; CHECK-NEXT:    ret
206   %3 = and i64 %0, -4096
207   %4 = xor i64 %3, %1
208   %5 = xor i64 %4, -4096
209   ret i64 %5
212 define i64 @or_eon2(i32 %0, i64 %1) {
213 ; CHECK-LABEL: or_eon2:
214 ; CHECK:       // %bb.0:
215 ; CHECK-NEXT:    mov w8, #-4096
216 ; CHECK-NEXT:    bic w8, w8, w0
217 ; CHECK-NEXT:    eor x0, x8, x1
218 ; CHECK-NEXT:    ret
219   %3 = and i32 %0, -4096
220   %4 = xor i32 %3, -4096
221   %5 = zext i32 %4 to i64
222   %6 = xor i64 %5, %1
223   ret i64 %6
226 define i64 @or_eon3(i32 %0, i64 %1) {
227 ; CHECK-LABEL: or_eon3:
228 ; CHECK:       // %bb.0:
229 ; CHECK-NEXT:    mov w8, #-4096
230 ; CHECK-NEXT:    bic w8, w8, w0
231 ; CHECK-NEXT:    eor x0, x8, x1
232 ; CHECK-NEXT:    ret
233   %3 = and i32 %0, -4096
234   %4 = xor i32 %3, -4096
235   %5 = zext i32 %4 to i64
236   %6 = xor i64 %5, %1
237   ret i64 %6