xref: /llvm-project/llvm/test/CodeGen/RISCV/atomic-rmw-sub.ll (revision eabaee0c59110d0e11b33a69db54ccda526b35fd)
1b423e1f0SYingwei Zheng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3b423e1f0SYingwei Zheng; RUN:   | FileCheck -check-prefix=RV32I %s
4b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
5b423e1f0SYingwei Zheng; RUN:   | FileCheck -check-prefixes=RV32IA %s
6b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
7b423e1f0SYingwei Zheng; RUN:   | FileCheck -check-prefix=RV64I %s
8b423e1f0SYingwei Zheng; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
9b423e1f0SYingwei Zheng; RUN:   | FileCheck -check-prefixes=RV64IA %s
10b423e1f0SYingwei Zheng
11b423e1f0SYingwei Zhengdefine i32 @atomicrmw_sub_i32_constant(ptr %a) nounwind {
12b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i32_constant:
13b423e1f0SYingwei Zheng; RV32I:       # %bb.0:
14b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, -16
15b423e1f0SYingwei Zheng; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
16b423e1f0SYingwei Zheng; RV32I-NEXT:    li a1, 1
17b423e1f0SYingwei Zheng; RV32I-NEXT:    li a2, 5
18*eabaee0cSFangrui Song; RV32I-NEXT:    call __atomic_fetch_sub_4
19b423e1f0SYingwei Zheng; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
20b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, 16
21b423e1f0SYingwei Zheng; RV32I-NEXT:    ret
22b423e1f0SYingwei Zheng;
23b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i32_constant:
24b423e1f0SYingwei Zheng; RV32IA:       # %bb.0:
25b423e1f0SYingwei Zheng; RV32IA-NEXT:    li a1, -1
26b423e1f0SYingwei Zheng; RV32IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
27b423e1f0SYingwei Zheng; RV32IA-NEXT:    ret
28b423e1f0SYingwei Zheng;
29b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i32_constant:
30b423e1f0SYingwei Zheng; RV64I:       # %bb.0:
31b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, -16
32b423e1f0SYingwei Zheng; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
33b423e1f0SYingwei Zheng; RV64I-NEXT:    li a1, 1
34b423e1f0SYingwei Zheng; RV64I-NEXT:    li a2, 5
35*eabaee0cSFangrui Song; RV64I-NEXT:    call __atomic_fetch_sub_4
36b423e1f0SYingwei Zheng; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
37b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, 16
38b423e1f0SYingwei Zheng; RV64I-NEXT:    ret
39b423e1f0SYingwei Zheng;
40b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i32_constant:
41b423e1f0SYingwei Zheng; RV64IA:       # %bb.0:
42b423e1f0SYingwei Zheng; RV64IA-NEXT:    li a1, -1
43b423e1f0SYingwei Zheng; RV64IA-NEXT:    amoadd.w.aqrl a0, a1, (a0)
44b423e1f0SYingwei Zheng; RV64IA-NEXT:    ret
45b423e1f0SYingwei Zheng  %1 = atomicrmw sub ptr %a, i32 1 seq_cst
46b423e1f0SYingwei Zheng  ret i32 %1
47b423e1f0SYingwei Zheng}
48b423e1f0SYingwei Zheng
49b423e1f0SYingwei Zhengdefine i64 @atomicrmw_sub_i64_constant(ptr %a) nounwind {
50b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i64_constant:
51b423e1f0SYingwei Zheng; RV32I:       # %bb.0:
52b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, -16
53b423e1f0SYingwei Zheng; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
54b423e1f0SYingwei Zheng; RV32I-NEXT:    li a1, 1
55b423e1f0SYingwei Zheng; RV32I-NEXT:    li a3, 5
56b423e1f0SYingwei Zheng; RV32I-NEXT:    li a2, 0
57*eabaee0cSFangrui Song; RV32I-NEXT:    call __atomic_fetch_sub_8
58b423e1f0SYingwei Zheng; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
59b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, 16
60b423e1f0SYingwei Zheng; RV32I-NEXT:    ret
61b423e1f0SYingwei Zheng;
62b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i64_constant:
63b423e1f0SYingwei Zheng; RV32IA:       # %bb.0:
64b423e1f0SYingwei Zheng; RV32IA-NEXT:    addi sp, sp, -16
65b423e1f0SYingwei Zheng; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
66b423e1f0SYingwei Zheng; RV32IA-NEXT:    li a1, 1
67b423e1f0SYingwei Zheng; RV32IA-NEXT:    li a3, 5
68b423e1f0SYingwei Zheng; RV32IA-NEXT:    li a2, 0
69*eabaee0cSFangrui Song; RV32IA-NEXT:    call __atomic_fetch_sub_8
70b423e1f0SYingwei Zheng; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
71b423e1f0SYingwei Zheng; RV32IA-NEXT:    addi sp, sp, 16
72b423e1f0SYingwei Zheng; RV32IA-NEXT:    ret
73b423e1f0SYingwei Zheng;
74b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i64_constant:
75b423e1f0SYingwei Zheng; RV64I:       # %bb.0:
76b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, -16
77b423e1f0SYingwei Zheng; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
78b423e1f0SYingwei Zheng; RV64I-NEXT:    li a1, 1
79b423e1f0SYingwei Zheng; RV64I-NEXT:    li a2, 5
80*eabaee0cSFangrui Song; RV64I-NEXT:    call __atomic_fetch_sub_8
81b423e1f0SYingwei Zheng; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
82b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, 16
83b423e1f0SYingwei Zheng; RV64I-NEXT:    ret
84b423e1f0SYingwei Zheng;
85b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i64_constant:
86b423e1f0SYingwei Zheng; RV64IA:       # %bb.0:
87b423e1f0SYingwei Zheng; RV64IA-NEXT:    li a1, -1
88b423e1f0SYingwei Zheng; RV64IA-NEXT:    amoadd.d.aqrl a0, a1, (a0)
89b423e1f0SYingwei Zheng; RV64IA-NEXT:    ret
90b423e1f0SYingwei Zheng  %1 = atomicrmw sub ptr %a, i64 1 seq_cst
91b423e1f0SYingwei Zheng  ret i64 %1
92b423e1f0SYingwei Zheng}
93b423e1f0SYingwei Zheng
94b423e1f0SYingwei Zhengdefine i32 @atomicrmw_sub_i32_neg(ptr %a, i32 %x, i32 %y) nounwind {
95b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i32_neg:
96b423e1f0SYingwei Zheng; RV32I:       # %bb.0:
97b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, -16
98b423e1f0SYingwei Zheng; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
99b423e1f0SYingwei Zheng; RV32I-NEXT:    sub a1, a1, a2
100b423e1f0SYingwei Zheng; RV32I-NEXT:    li a2, 5
101*eabaee0cSFangrui Song; RV32I-NEXT:    call __atomic_fetch_sub_4
102b423e1f0SYingwei Zheng; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
103b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, 16
104b423e1f0SYingwei Zheng; RV32I-NEXT:    ret
105b423e1f0SYingwei Zheng;
106b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i32_neg:
107b423e1f0SYingwei Zheng; RV32IA:       # %bb.0:
108b423e1f0SYingwei Zheng; RV32IA-NEXT:    sub a2, a2, a1
109b423e1f0SYingwei Zheng; RV32IA-NEXT:    amoadd.w.aqrl a0, a2, (a0)
110b423e1f0SYingwei Zheng; RV32IA-NEXT:    ret
111b423e1f0SYingwei Zheng;
112b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i32_neg:
113b423e1f0SYingwei Zheng; RV64I:       # %bb.0:
114b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, -16
115b423e1f0SYingwei Zheng; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
116b423e1f0SYingwei Zheng; RV64I-NEXT:    subw a1, a1, a2
117b423e1f0SYingwei Zheng; RV64I-NEXT:    li a2, 5
118*eabaee0cSFangrui Song; RV64I-NEXT:    call __atomic_fetch_sub_4
119b423e1f0SYingwei Zheng; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
120b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, 16
121b423e1f0SYingwei Zheng; RV64I-NEXT:    ret
122b423e1f0SYingwei Zheng;
123b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i32_neg:
124b423e1f0SYingwei Zheng; RV64IA:       # %bb.0:
125b423e1f0SYingwei Zheng; RV64IA-NEXT:    sub a2, a2, a1
126b423e1f0SYingwei Zheng; RV64IA-NEXT:    amoadd.w.aqrl a0, a2, (a0)
127b423e1f0SYingwei Zheng; RV64IA-NEXT:    ret
128b423e1f0SYingwei Zheng  %b = sub i32 %x, %y
129b423e1f0SYingwei Zheng  %1 = atomicrmw sub ptr %a, i32 %b seq_cst
130b423e1f0SYingwei Zheng  ret i32 %1
131b423e1f0SYingwei Zheng}
132b423e1f0SYingwei Zheng
133b423e1f0SYingwei Zhengdefine i64 @atomicrmw_sub_i64_neg(ptr %a, i64 %x, i64 %y) nounwind {
134b423e1f0SYingwei Zheng; RV32I-LABEL: atomicrmw_sub_i64_neg:
135b423e1f0SYingwei Zheng; RV32I:       # %bb.0:
136b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, -16
137b423e1f0SYingwei Zheng; RV32I-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
138b423e1f0SYingwei Zheng; RV32I-NEXT:    sltu a5, a1, a3
139b423e1f0SYingwei Zheng; RV32I-NEXT:    sub a2, a2, a4
140b423e1f0SYingwei Zheng; RV32I-NEXT:    sub a2, a2, a5
141b423e1f0SYingwei Zheng; RV32I-NEXT:    sub a1, a1, a3
142b423e1f0SYingwei Zheng; RV32I-NEXT:    li a3, 5
143*eabaee0cSFangrui Song; RV32I-NEXT:    call __atomic_fetch_sub_8
144b423e1f0SYingwei Zheng; RV32I-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
145b423e1f0SYingwei Zheng; RV32I-NEXT:    addi sp, sp, 16
146b423e1f0SYingwei Zheng; RV32I-NEXT:    ret
147b423e1f0SYingwei Zheng;
148b423e1f0SYingwei Zheng; RV32IA-LABEL: atomicrmw_sub_i64_neg:
149b423e1f0SYingwei Zheng; RV32IA:       # %bb.0:
150b423e1f0SYingwei Zheng; RV32IA-NEXT:    addi sp, sp, -16
151b423e1f0SYingwei Zheng; RV32IA-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
152b423e1f0SYingwei Zheng; RV32IA-NEXT:    sltu a5, a1, a3
153b423e1f0SYingwei Zheng; RV32IA-NEXT:    sub a2, a2, a4
154b423e1f0SYingwei Zheng; RV32IA-NEXT:    sub a2, a2, a5
155b423e1f0SYingwei Zheng; RV32IA-NEXT:    sub a1, a1, a3
156b423e1f0SYingwei Zheng; RV32IA-NEXT:    li a3, 5
157*eabaee0cSFangrui Song; RV32IA-NEXT:    call __atomic_fetch_sub_8
158b423e1f0SYingwei Zheng; RV32IA-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
159b423e1f0SYingwei Zheng; RV32IA-NEXT:    addi sp, sp, 16
160b423e1f0SYingwei Zheng; RV32IA-NEXT:    ret
161b423e1f0SYingwei Zheng;
162b423e1f0SYingwei Zheng; RV64I-LABEL: atomicrmw_sub_i64_neg:
163b423e1f0SYingwei Zheng; RV64I:       # %bb.0:
164b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, -16
165b423e1f0SYingwei Zheng; RV64I-NEXT:    sd ra, 8(sp) # 8-byte Folded Spill
166b423e1f0SYingwei Zheng; RV64I-NEXT:    sub a1, a1, a2
167b423e1f0SYingwei Zheng; RV64I-NEXT:    li a2, 5
168*eabaee0cSFangrui Song; RV64I-NEXT:    call __atomic_fetch_sub_8
169b423e1f0SYingwei Zheng; RV64I-NEXT:    ld ra, 8(sp) # 8-byte Folded Reload
170b423e1f0SYingwei Zheng; RV64I-NEXT:    addi sp, sp, 16
171b423e1f0SYingwei Zheng; RV64I-NEXT:    ret
172b423e1f0SYingwei Zheng;
173b423e1f0SYingwei Zheng; RV64IA-LABEL: atomicrmw_sub_i64_neg:
174b423e1f0SYingwei Zheng; RV64IA:       # %bb.0:
175b423e1f0SYingwei Zheng; RV64IA-NEXT:    sub a2, a2, a1
176b423e1f0SYingwei Zheng; RV64IA-NEXT:    amoadd.d.aqrl a0, a2, (a0)
177b423e1f0SYingwei Zheng; RV64IA-NEXT:    ret
178b423e1f0SYingwei Zheng  %b = sub i64 %x, %y
179b423e1f0SYingwei Zheng  %1 = atomicrmw sub ptr %a, i64 %b seq_cst
180b423e1f0SYingwei Zheng  ret i64 %1
181b423e1f0SYingwei Zheng}
182