blob: e1b2f6f7c2ebf8881a19dfa5e1b97371ca191351 [file] [log] [blame]
Alex Bradburyffc435e2017-11-21 08:11:03 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
Alex Bradbury92138382018-01-18 12:36:38 +00003; RUN: | FileCheck -check-prefix=RV32I %s
4; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \
5; RUN: | FileCheck -check-prefix=RV32IM %s
Alex Bradburyffc435e2017-11-21 08:11:03 +00006
Alex Bradburyd3263aa2018-01-18 09:41:14 +00007define i32 @square(i32 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +00008; RV32I-LABEL: square:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +00009; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000010; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000011; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +000012; RV32I-NEXT: lui a1, %hi(__mulsi3)
13; RV32I-NEXT: addi a2, a1, %lo(__mulsi3)
Alex Bradbury59136ff2017-12-15 09:47:01 +000014; RV32I-NEXT: mv a1, a0
15; RV32I-NEXT: jalr a2
Alex Bradbury660bcce2017-12-11 11:53:54 +000016; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000017; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000018; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000019;
20; RV32IM-LABEL: square:
21; RV32IM: # %bb.0:
22; RV32IM-NEXT: mul a0, a0, a0
23; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000024 %1 = mul i32 %a, %a
25 ret i32 %1
26}
27
Alex Bradburyd3263aa2018-01-18 09:41:14 +000028define i32 @mul(i32 %a, i32 %b) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000029; RV32I-LABEL: mul:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000030; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000031; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000032; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +000033; RV32I-NEXT: lui a2, %hi(__mulsi3)
34; RV32I-NEXT: addi a2, a2, %lo(__mulsi3)
Alex Bradbury59136ff2017-12-15 09:47:01 +000035; RV32I-NEXT: jalr a2
Alex Bradbury660bcce2017-12-11 11:53:54 +000036; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000037; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000038; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000039;
40; RV32IM-LABEL: mul:
41; RV32IM: # %bb.0:
42; RV32IM-NEXT: mul a0, a0, a1
43; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000044 %1 = mul i32 %a, %b
45 ret i32 %1
46}
47
Alex Bradburyd3263aa2018-01-18 09:41:14 +000048define i32 @mul_constant(i32 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000049; RV32I-LABEL: mul_constant:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000050; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000051; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000052; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +000053; RV32I-NEXT: lui a1, %hi(__mulsi3)
54; RV32I-NEXT: addi a2, a1, %lo(__mulsi3)
55; RV32I-NEXT: addi a1, zero, 5
Alex Bradbury59136ff2017-12-15 09:47:01 +000056; RV32I-NEXT: jalr a2
Alex Bradbury660bcce2017-12-11 11:53:54 +000057; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000058; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000059; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000060;
61; RV32IM-LABEL: mul_constant:
62; RV32IM: # %bb.0:
63; RV32IM-NEXT: addi a1, zero, 5
64; RV32IM-NEXT: mul a0, a0, a1
65; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000066 %1 = mul i32 %a, 5
67 ret i32 %1
68}
69
Alex Bradburyd3263aa2018-01-18 09:41:14 +000070define i32 @mul_pow2(i32 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000071; RV32I-LABEL: mul_pow2:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000072; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000073; RV32I-NEXT: slli a0, a0, 3
Alex Bradbury59136ff2017-12-15 09:47:01 +000074; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000075;
76; RV32IM-LABEL: mul_pow2:
77; RV32IM: # %bb.0:
78; RV32IM-NEXT: slli a0, a0, 3
79; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000080 %1 = mul i32 %a, 8
81 ret i32 %1
82}
83
Alex Bradburyd3263aa2018-01-18 09:41:14 +000084define i64 @mul64(i64 %a, i64 %b) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000085; RV32I-LABEL: mul64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000086; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000087; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000088; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +000089; RV32I-NEXT: lui a4, %hi(__muldi3)
90; RV32I-NEXT: addi a4, a4, %lo(__muldi3)
Alex Bradbury59136ff2017-12-15 09:47:01 +000091; RV32I-NEXT: jalr a4
Alex Bradbury660bcce2017-12-11 11:53:54 +000092; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000093; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000094; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000095;
96; RV32IM-LABEL: mul64:
97; RV32IM: # %bb.0:
98; RV32IM-NEXT: mul a3, a0, a3
99; RV32IM-NEXT: mulhu a4, a0, a2
100; RV32IM-NEXT: add a3, a4, a3
101; RV32IM-NEXT: mul a1, a1, a2
102; RV32IM-NEXT: add a1, a3, a1
103; RV32IM-NEXT: mul a0, a0, a2
104; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +0000105 %1 = mul i64 %a, %b
106 ret i64 %1
107}
108
Alex Bradburyd3263aa2018-01-18 09:41:14 +0000109define i64 @mul64_constant(i64 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +0000110; RV32I-LABEL: mul64_constant:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000111; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000112; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +0000113; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +0000114; RV32I-NEXT: lui a2, %hi(__muldi3)
115; RV32I-NEXT: addi a4, a2, %lo(__muldi3)
116; RV32I-NEXT: addi a2, zero, 5
Alex Bradbury59136ff2017-12-15 09:47:01 +0000117; RV32I-NEXT: mv a3, zero
118; RV32I-NEXT: jalr a4
Alex Bradbury660bcce2017-12-11 11:53:54 +0000119; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000120; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +0000121; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +0000122;
123; RV32IM-LABEL: mul64_constant:
124; RV32IM: # %bb.0:
125; RV32IM-NEXT: addi a2, zero, 5
126; RV32IM-NEXT: mul a1, a1, a2
127; RV32IM-NEXT: mulhu a3, a0, a2
128; RV32IM-NEXT: add a1, a3, a1
129; RV32IM-NEXT: mul a0, a0, a2
130; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +0000131 %1 = mul i64 %a, 5
132 ret i64 %1
133}
Alex Bradbury92138382018-01-18 12:36:38 +0000134
135define i32 @mulhs(i32 %a, i32 %b) nounwind {
136; RV32I-LABEL: mulhs:
137; RV32I: # %bb.0:
138; RV32I-NEXT: addi sp, sp, -16
139; RV32I-NEXT: sw ra, 12(sp)
140; RV32I-NEXT: mv a2, a1
141; RV32I-NEXT: lui a1, %hi(__muldi3)
142; RV32I-NEXT: addi a4, a1, %lo(__muldi3)
143; RV32I-NEXT: srai a1, a0, 31
144; RV32I-NEXT: srai a3, a2, 31
145; RV32I-NEXT: jalr a4
146; RV32I-NEXT: mv a0, a1
147; RV32I-NEXT: lw ra, 12(sp)
148; RV32I-NEXT: addi sp, sp, 16
149; RV32I-NEXT: ret
150;
151; RV32IM-LABEL: mulhs:
152; RV32IM: # %bb.0:
153; RV32IM-NEXT: mulh a0, a0, a1
154; RV32IM-NEXT: ret
155 %1 = sext i32 %a to i64
156 %2 = sext i32 %b to i64
157 %3 = mul i64 %1, %2
158 %4 = lshr i64 %3, 32
159 %5 = trunc i64 %4 to i32
160 ret i32 %5
161}
162
163define i32 @mulhu(i32 %a, i32 %b) nounwind {
164; RV32I-LABEL: mulhu:
165; RV32I: # %bb.0:
166; RV32I-NEXT: addi sp, sp, -16
167; RV32I-NEXT: sw ra, 12(sp)
168; RV32I-NEXT: mv a2, a1
169; RV32I-NEXT: lui a1, %hi(__muldi3)
170; RV32I-NEXT: addi a4, a1, %lo(__muldi3)
171; RV32I-NEXT: mv a1, zero
172; RV32I-NEXT: mv a3, zero
173; RV32I-NEXT: jalr a4
174; RV32I-NEXT: mv a0, a1
175; RV32I-NEXT: lw ra, 12(sp)
176; RV32I-NEXT: addi sp, sp, 16
177; RV32I-NEXT: ret
178;
179; RV32IM-LABEL: mulhu:
180; RV32IM: # %bb.0:
181; RV32IM-NEXT: mulhu a0, a0, a1
182; RV32IM-NEXT: ret
183 %1 = zext i32 %a to i64
184 %2 = zext i32 %b to i64
185 %3 = mul i64 %1, %2
186 %4 = lshr i64 %3, 32
187 %5 = trunc i64 %4 to i32
188 ret i32 %5
189}