Skip to content

Commit d3580c2

Browse files
gonglingqinSixWeining
authored andcommitted
[LoongArch] Add codegen support for not
Differential Revision: https://reviews.llvm.org/D131384
1 parent 8716513 commit d3580c2

File tree

3 files changed

+248
-3
lines changed

3 files changed

+248
-3
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,10 @@ def : PatGprGpr<or, OR>;
661661
def : PatGprImm<or, ORI, uimm12>;
662662
def : PatGprGpr<xor, XOR>;
663663
def : PatGprImm<xor, XORI, uimm12>;
664+
def : Pat<(not GPR:$rj), (NOR GPR:$rj, R0)>;
665+
def : Pat<(not (or GPR:$rj, GPR:$rk)), (NOR GPR:$rj, GPR:$rk)>;
666+
def : Pat<(or GPR:$rj, (not GPR:$rk)), (ORN GPR:$rj, GPR:$rk)>;
667+
def : Pat<(and GPR:$rj, (not GPR:$rk)), (ANDN GPR:$rj, GPR:$rk)>;
664668

665669
/// FrameIndex calculations
666670
let Predicates = [IsLA32] in {

llvm/test/CodeGen/LoongArch/calling-conv-lp64d.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,9 @@ define i64 @caller_small_scalar_ret() nounwind {
277277
; CHECK-NEXT: addi.d $sp, $sp, -16
278278
; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
279279
; CHECK-NEXT: bl callee_small_scalar_ret
280-
; CHECK-NEXT: addi.w $a2, $zero, -1
281-
; CHECK-NEXT: xor $a1, $a1, $a2
282280
; CHECK-NEXT: addi.w $a2, $zero, -2
283281
; CHECK-NEXT: xor $a0, $a0, $a2
284-
; CHECK-NEXT: or $a0, $a0, $a1
282+
; CHECK-NEXT: orn $a0, $a0, $a1
285283
; CHECK-NEXT: sltui $a0, $a0, 1
286284
; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
287285
; CHECK-NEXT: addi.d $sp, $sp, 16

llvm/test/CodeGen/LoongArch/not.ll

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
3+
; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
4+
5+
define i8 @nor_i8(i8 %a, i8 %b) nounwind {
6+
; LA32-LABEL: nor_i8:
7+
; LA32: # %bb.0:
8+
; LA32-NEXT: nor $a0, $a0, $a1
9+
; LA32-NEXT: jirl $zero, $ra, 0
10+
;
11+
; LA64-LABEL: nor_i8:
12+
; LA64: # %bb.0:
13+
; LA64-NEXT: nor $a0, $a0, $a1
14+
; LA64-NEXT: jirl $zero, $ra, 0
15+
%or = or i8 %a, %b
16+
%neg = xor i8 %or, -1
17+
ret i8 %neg
18+
}
19+
20+
define i16 @nor_i16(i16 %a, i16 %b) nounwind {
21+
; LA32-LABEL: nor_i16:
22+
; LA32: # %bb.0:
23+
; LA32-NEXT: nor $a0, $a0, $a1
24+
; LA32-NEXT: jirl $zero, $ra, 0
25+
;
26+
; LA64-LABEL: nor_i16:
27+
; LA64: # %bb.0:
28+
; LA64-NEXT: nor $a0, $a0, $a1
29+
; LA64-NEXT: jirl $zero, $ra, 0
30+
%or = or i16 %a, %b
31+
%neg = xor i16 %or, -1
32+
ret i16 %neg
33+
}
34+
35+
define i32 @nor_i32(i32 %a, i32 %b) nounwind {
36+
; LA32-LABEL: nor_i32:
37+
; LA32: # %bb.0:
38+
; LA32-NEXT: nor $a0, $a0, $a1
39+
; LA32-NEXT: jirl $zero, $ra, 0
40+
;
41+
; LA64-LABEL: nor_i32:
42+
; LA64: # %bb.0:
43+
; LA64-NEXT: nor $a0, $a0, $a1
44+
; LA64-NEXT: jirl $zero, $ra, 0
45+
%or = or i32 %a, %b
46+
%neg = xor i32 %or, -1
47+
ret i32 %neg
48+
}
49+
50+
define i64 @nor_i64(i64 %a, i64 %b) nounwind {
51+
; LA32-LABEL: nor_i64:
52+
; LA32: # %bb.0:
53+
; LA32-NEXT: nor $a0, $a0, $a2
54+
; LA32-NEXT: nor $a1, $a1, $a3
55+
; LA32-NEXT: jirl $zero, $ra, 0
56+
;
57+
; LA64-LABEL: nor_i64:
58+
; LA64: # %bb.0:
59+
; LA64-NEXT: nor $a0, $a0, $a1
60+
; LA64-NEXT: jirl $zero, $ra, 0
61+
%or = or i64 %a, %b
62+
%neg = xor i64 %or, -1
63+
ret i64 %neg
64+
}
65+
66+
define i8 @nor_zero_i8(i8 %a) nounwind {
67+
; LA32-LABEL: nor_zero_i8:
68+
; LA32: # %bb.0:
69+
; LA32-NEXT: nor $a0, $a0, $zero
70+
; LA32-NEXT: jirl $zero, $ra, 0
71+
;
72+
; LA64-LABEL: nor_zero_i8:
73+
; LA64: # %bb.0:
74+
; LA64-NEXT: nor $a0, $a0, $zero
75+
; LA64-NEXT: jirl $zero, $ra, 0
76+
%neg = xor i8 %a, -1
77+
ret i8 %neg
78+
}
79+
80+
define i16 @nor_zero_i16(i16 %a) nounwind {
81+
; LA32-LABEL: nor_zero_i16:
82+
; LA32: # %bb.0:
83+
; LA32-NEXT: nor $a0, $a0, $zero
84+
; LA32-NEXT: jirl $zero, $ra, 0
85+
;
86+
; LA64-LABEL: nor_zero_i16:
87+
; LA64: # %bb.0:
88+
; LA64-NEXT: nor $a0, $a0, $zero
89+
; LA64-NEXT: jirl $zero, $ra, 0
90+
%neg = xor i16 %a, -1
91+
ret i16 %neg
92+
}
93+
94+
define i32 @nor_zero_i32(i32 %a) nounwind {
95+
; LA32-LABEL: nor_zero_i32:
96+
; LA32: # %bb.0:
97+
; LA32-NEXT: nor $a0, $a0, $zero
98+
; LA32-NEXT: jirl $zero, $ra, 0
99+
;
100+
; LA64-LABEL: nor_zero_i32:
101+
; LA64: # %bb.0:
102+
; LA64-NEXT: nor $a0, $a0, $zero
103+
; LA64-NEXT: jirl $zero, $ra, 0
104+
%neg = xor i32 %a, -1
105+
ret i32 %neg
106+
}
107+
108+
define i64 @nor_zero_i64(i64 %a) nounwind {
109+
; LA32-LABEL: nor_zero_i64:
110+
; LA32: # %bb.0:
111+
; LA32-NEXT: nor $a0, $a0, $zero
112+
; LA32-NEXT: nor $a1, $a1, $zero
113+
; LA32-NEXT: jirl $zero, $ra, 0
114+
;
115+
; LA64-LABEL: nor_zero_i64:
116+
; LA64: # %bb.0:
117+
; LA64-NEXT: nor $a0, $a0, $zero
118+
; LA64-NEXT: jirl $zero, $ra, 0
119+
%neg = xor i64 %a, -1
120+
ret i64 %neg
121+
}
122+
123+
define i8 @orn_i8(i8 %a, i8 %b) nounwind {
124+
; LA32-LABEL: orn_i8:
125+
; LA32: # %bb.0:
126+
; LA32-NEXT: orn $a0, $a0, $a1
127+
; LA32-NEXT: jirl $zero, $ra, 0
128+
;
129+
; LA64-LABEL: orn_i8:
130+
; LA64: # %bb.0:
131+
; LA64-NEXT: orn $a0, $a0, $a1
132+
; LA64-NEXT: jirl $zero, $ra, 0
133+
%neg = xor i8 %b, -1
134+
%or = or i8 %neg, %a
135+
ret i8 %or
136+
}
137+
138+
define i16 @orn_i16(i16 %a, i16 %b) nounwind {
139+
; LA32-LABEL: orn_i16:
140+
; LA32: # %bb.0:
141+
; LA32-NEXT: orn $a0, $a0, $a1
142+
; LA32-NEXT: jirl $zero, $ra, 0
143+
;
144+
; LA64-LABEL: orn_i16:
145+
; LA64: # %bb.0:
146+
; LA64-NEXT: orn $a0, $a0, $a1
147+
; LA64-NEXT: jirl $zero, $ra, 0
148+
%neg = xor i16 %b, -1
149+
%or = or i16 %neg, %a
150+
ret i16 %or
151+
}
152+
153+
define i32 @orn_i32(i32 %a, i32 %b) nounwind {
154+
; LA32-LABEL: orn_i32:
155+
; LA32: # %bb.0:
156+
; LA32-NEXT: orn $a0, $a0, $a1
157+
; LA32-NEXT: jirl $zero, $ra, 0
158+
;
159+
; LA64-LABEL: orn_i32:
160+
; LA64: # %bb.0:
161+
; LA64-NEXT: orn $a0, $a0, $a1
162+
; LA64-NEXT: jirl $zero, $ra, 0
163+
%neg = xor i32 %b, -1
164+
%or = or i32 %neg, %a
165+
ret i32 %or
166+
}
167+
168+
define i64 @orn_i64(i64 %a, i64 %b) nounwind {
169+
; LA32-LABEL: orn_i64:
170+
; LA32: # %bb.0:
171+
; LA32-NEXT: orn $a0, $a0, $a2
172+
; LA32-NEXT: orn $a1, $a1, $a3
173+
; LA32-NEXT: jirl $zero, $ra, 0
174+
;
175+
; LA64-LABEL: orn_i64:
176+
; LA64: # %bb.0:
177+
; LA64-NEXT: orn $a0, $a0, $a1
178+
; LA64-NEXT: jirl $zero, $ra, 0
179+
%neg = xor i64 %b, -1
180+
%or = or i64 %neg, %a
181+
ret i64 %or
182+
}
183+
184+
define i8 @andn_i8(i8 %a, i8 %b) nounwind {
185+
; LA32-LABEL: andn_i8:
186+
; LA32: # %bb.0:
187+
; LA32-NEXT: andn $a0, $a0, $a1
188+
; LA32-NEXT: jirl $zero, $ra, 0
189+
;
190+
; LA64-LABEL: andn_i8:
191+
; LA64: # %bb.0:
192+
; LA64-NEXT: andn $a0, $a0, $a1
193+
; LA64-NEXT: jirl $zero, $ra, 0
194+
%neg = xor i8 %b, -1
195+
%and = and i8 %neg, %a
196+
ret i8 %and
197+
}
198+
199+
define i16 @andn_i16(i16 %a, i16 %b) nounwind {
200+
; LA32-LABEL: andn_i16:
201+
; LA32: # %bb.0:
202+
; LA32-NEXT: andn $a0, $a0, $a1
203+
; LA32-NEXT: jirl $zero, $ra, 0
204+
;
205+
; LA64-LABEL: andn_i16:
206+
; LA64: # %bb.0:
207+
; LA64-NEXT: andn $a0, $a0, $a1
208+
; LA64-NEXT: jirl $zero, $ra, 0
209+
%neg = xor i16 %b, -1
210+
%and = and i16 %neg, %a
211+
ret i16 %and
212+
}
213+
214+
define i32 @andn_i32(i32 %a, i32 %b) nounwind {
215+
; LA32-LABEL: andn_i32:
216+
; LA32: # %bb.0:
217+
; LA32-NEXT: andn $a0, $a0, $a1
218+
; LA32-NEXT: jirl $zero, $ra, 0
219+
;
220+
; LA64-LABEL: andn_i32:
221+
; LA64: # %bb.0:
222+
; LA64-NEXT: andn $a0, $a0, $a1
223+
; LA64-NEXT: jirl $zero, $ra, 0
224+
%neg = xor i32 %b, -1
225+
%and = and i32 %neg, %a
226+
ret i32 %and
227+
}
228+
229+
define i64 @andn_i64(i64 %a, i64 %b) nounwind {
230+
; LA32-LABEL: andn_i64:
231+
; LA32: # %bb.0:
232+
; LA32-NEXT: andn $a0, $a0, $a2
233+
; LA32-NEXT: andn $a1, $a1, $a3
234+
; LA32-NEXT: jirl $zero, $ra, 0
235+
;
236+
; LA64-LABEL: andn_i64:
237+
; LA64: # %bb.0:
238+
; LA64-NEXT: andn $a0, $a0, $a1
239+
; LA64-NEXT: jirl $zero, $ra, 0
240+
%neg = xor i64 %b, -1
241+
%and = and i64 %neg, %a
242+
ret i64 %and
243+
}

0 commit comments

Comments
 (0)