Skip to content

Commit 7414c0d

Browse files
authored
[LoongArch] Precommit a test for smul with overflow (NFC) (#73212)
1 parent 7f18f9a commit 7414c0d

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
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 zeroext i1 @smuloi64(i64 %v1, i64 %v2, ptr %res) {
6+
; LA32-LABEL: smuloi64:
7+
; LA32: # %bb.0:
8+
; LA32-NEXT: addi.w $sp, $sp, -16
9+
; LA32-NEXT: .cfi_def_cfa_offset 16
10+
; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
11+
; LA32-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
12+
; LA32-NEXT: .cfi_offset 1, -4
13+
; LA32-NEXT: .cfi_offset 22, -8
14+
; LA32-NEXT: move $fp, $a4
15+
; LA32-NEXT: st.w $zero, $sp, 4
16+
; LA32-NEXT: addi.w $a4, $sp, 4
17+
; LA32-NEXT: bl %plt(__mulodi4)
18+
; LA32-NEXT: st.w $a1, $fp, 4
19+
; LA32-NEXT: st.w $a0, $fp, 0
20+
; LA32-NEXT: ld.w $a0, $sp, 4
21+
; LA32-NEXT: sltu $a0, $zero, $a0
22+
; LA32-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
23+
; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
24+
; LA32-NEXT: addi.w $sp, $sp, 16
25+
; LA32-NEXT: ret
26+
;
27+
; LA64-LABEL: smuloi64:
28+
; LA64: # %bb.0:
29+
; LA64-NEXT: mul.d $a3, $a0, $a1
30+
; LA64-NEXT: st.d $a3, $a2, 0
31+
; LA64-NEXT: mulh.d $a0, $a0, $a1
32+
; LA64-NEXT: srai.d $a1, $a3, 63
33+
; LA64-NEXT: xor $a0, $a0, $a1
34+
; LA64-NEXT: sltu $a0, $zero, $a0
35+
; LA64-NEXT: ret
36+
%t = call {i64, i1} @llvm.smul.with.overflow.i64(i64 %v1, i64 %v2)
37+
%val = extractvalue {i64, i1} %t, 0
38+
%obit = extractvalue {i64, i1} %t, 1
39+
store i64 %val, ptr %res
40+
ret i1 %obit
41+
}
42+
43+
define zeroext i1 @smuloi128(i128 %v1, i128 %v2, ptr %res) {
44+
; LA32-LABEL: smuloi128:
45+
; LA32: # %bb.0:
46+
; LA32-NEXT: addi.w $sp, $sp, -64
47+
; LA32-NEXT: .cfi_def_cfa_offset 64
48+
; LA32-NEXT: st.w $ra, $sp, 60 # 4-byte Folded Spill
49+
; LA32-NEXT: st.w $fp, $sp, 56 # 4-byte Folded Spill
50+
; LA32-NEXT: .cfi_offset 1, -4
51+
; LA32-NEXT: .cfi_offset 22, -8
52+
; LA32-NEXT: move $fp, $a2
53+
; LA32-NEXT: st.w $zero, $sp, 52
54+
; LA32-NEXT: ld.w $a2, $a1, 12
55+
; LA32-NEXT: st.w $a2, $sp, 12
56+
; LA32-NEXT: ld.w $a2, $a1, 8
57+
; LA32-NEXT: st.w $a2, $sp, 8
58+
; LA32-NEXT: ld.w $a2, $a1, 4
59+
; LA32-NEXT: st.w $a2, $sp, 4
60+
; LA32-NEXT: ld.w $a1, $a1, 0
61+
; LA32-NEXT: st.w $a1, $sp, 0
62+
; LA32-NEXT: ld.w $a1, $a0, 12
63+
; LA32-NEXT: st.w $a1, $sp, 28
64+
; LA32-NEXT: ld.w $a1, $a0, 8
65+
; LA32-NEXT: st.w $a1, $sp, 24
66+
; LA32-NEXT: ld.w $a1, $a0, 4
67+
; LA32-NEXT: st.w $a1, $sp, 20
68+
; LA32-NEXT: ld.w $a0, $a0, 0
69+
; LA32-NEXT: st.w $a0, $sp, 16
70+
; LA32-NEXT: addi.w $a0, $sp, 32
71+
; LA32-NEXT: addi.w $a1, $sp, 16
72+
; LA32-NEXT: addi.w $a2, $sp, 0
73+
; LA32-NEXT: addi.w $a3, $sp, 52
74+
; LA32-NEXT: bl %plt(__muloti4)
75+
; LA32-NEXT: ld.w $a0, $sp, 44
76+
; LA32-NEXT: st.w $a0, $fp, 12
77+
; LA32-NEXT: ld.w $a0, $sp, 40
78+
; LA32-NEXT: st.w $a0, $fp, 8
79+
; LA32-NEXT: ld.w $a0, $sp, 36
80+
; LA32-NEXT: st.w $a0, $fp, 4
81+
; LA32-NEXT: ld.w $a0, $sp, 32
82+
; LA32-NEXT: st.w $a0, $fp, 0
83+
; LA32-NEXT: ld.w $a0, $sp, 52
84+
; LA32-NEXT: sltu $a0, $zero, $a0
85+
; LA32-NEXT: ld.w $fp, $sp, 56 # 4-byte Folded Reload
86+
; LA32-NEXT: ld.w $ra, $sp, 60 # 4-byte Folded Reload
87+
; LA32-NEXT: addi.w $sp, $sp, 64
88+
; LA32-NEXT: ret
89+
;
90+
; LA64-LABEL: smuloi128:
91+
; LA64: # %bb.0:
92+
; LA64-NEXT: addi.d $sp, $sp, -32
93+
; LA64-NEXT: .cfi_def_cfa_offset 32
94+
; LA64-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
95+
; LA64-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
96+
; LA64-NEXT: .cfi_offset 1, -8
97+
; LA64-NEXT: .cfi_offset 22, -16
98+
; LA64-NEXT: move $fp, $a4
99+
; LA64-NEXT: st.d $zero, $sp, 8
100+
; LA64-NEXT: addi.d $a4, $sp, 8
101+
; LA64-NEXT: bl %plt(__muloti4)
102+
; LA64-NEXT: st.d $a1, $fp, 8
103+
; LA64-NEXT: st.d $a0, $fp, 0
104+
; LA64-NEXT: ld.d $a0, $sp, 8
105+
; LA64-NEXT: sltu $a0, $zero, $a0
106+
; LA64-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
107+
; LA64-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
108+
; LA64-NEXT: addi.d $sp, $sp, 32
109+
; LA64-NEXT: ret
110+
%t = call {i128, i1} @llvm.smul.with.overflow.i128(i128 %v1, i128 %v2)
111+
%val = extractvalue {i128, i1} %t, 0
112+
%obit = extractvalue {i128, i1} %t, 1
113+
store i128 %val, ptr %res
114+
ret i1 %obit
115+
}
116+
117+
declare {i64, i1} @llvm.smul.with.overflow.i64(i64, i64) nounwind readnone
118+
declare {i128, i1} @llvm.smul.with.overflow.i128(i128, i128) nounwind readnone

0 commit comments

Comments
 (0)