blob: 444a75f3751275f05c47f86c087459e200a04991 [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 Bradbury59136ff2017-12-15 09:47:01 +000012; RV32I-NEXT: mv a1, a0
Shiva Chend58bd8d2018-04-25 14:19:12 +000013; RV32I-NEXT: call __mulsi3
Alex Bradbury660bcce2017-12-11 11:53:54 +000014; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000015; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000016; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000017;
18; RV32IM-LABEL: square:
19; RV32IM: # %bb.0:
20; RV32IM-NEXT: mul a0, a0, a0
21; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000022 %1 = mul i32 %a, %a
23 ret i32 %1
24}
25
Alex Bradburyd3263aa2018-01-18 09:41:14 +000026define i32 @mul(i32 %a, i32 %b) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000027; RV32I-LABEL: mul:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000028; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000029; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000030; RV32I-NEXT: sw ra, 12(sp)
Shiva Chend58bd8d2018-04-25 14:19:12 +000031; RV32I-NEXT: call __mulsi3
Alex Bradbury660bcce2017-12-11 11:53:54 +000032; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000033; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000034; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000035;
36; RV32IM-LABEL: mul:
37; RV32IM: # %bb.0:
38; RV32IM-NEXT: mul a0, a0, a1
39; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000040 %1 = mul i32 %a, %b
41 ret i32 %1
42}
43
Alex Bradburyd3263aa2018-01-18 09:41:14 +000044define i32 @mul_constant(i32 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000045; RV32I-LABEL: mul_constant:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000046; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000047; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000048; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +000049; RV32I-NEXT: addi a1, zero, 5
Shiva Chend58bd8d2018-04-25 14:19:12 +000050; RV32I-NEXT: call __mulsi3
Alex Bradbury660bcce2017-12-11 11:53:54 +000051; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000052; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000053; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000054;
55; RV32IM-LABEL: mul_constant:
56; RV32IM: # %bb.0:
57; RV32IM-NEXT: addi a1, zero, 5
58; RV32IM-NEXT: mul a0, a0, a1
59; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000060 %1 = mul i32 %a, 5
61 ret i32 %1
62}
63
Alex Bradburyd3263aa2018-01-18 09:41:14 +000064define i32 @mul_pow2(i32 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000065; RV32I-LABEL: mul_pow2:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000066; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000067; RV32I-NEXT: slli a0, a0, 3
Alex Bradbury59136ff2017-12-15 09:47:01 +000068; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000069;
70; RV32IM-LABEL: mul_pow2:
71; RV32IM: # %bb.0:
72; RV32IM-NEXT: slli a0, a0, 3
73; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000074 %1 = mul i32 %a, 8
75 ret i32 %1
76}
77
Alex Bradburyd3263aa2018-01-18 09:41:14 +000078define i64 @mul64(i64 %a, i64 %b) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +000079; RV32I-LABEL: mul64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000080; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000081; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +000082; RV32I-NEXT: sw ra, 12(sp)
Shiva Chend58bd8d2018-04-25 14:19:12 +000083; RV32I-NEXT: call __muldi3
Alex Bradbury660bcce2017-12-11 11:53:54 +000084; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +000085; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +000086; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +000087;
88; RV32IM-LABEL: mul64:
89; RV32IM: # %bb.0:
90; RV32IM-NEXT: mul a3, a0, a3
91; RV32IM-NEXT: mulhu a4, a0, a2
92; RV32IM-NEXT: add a3, a4, a3
93; RV32IM-NEXT: mul a1, a1, a2
94; RV32IM-NEXT: add a1, a3, a1
95; RV32IM-NEXT: mul a0, a0, a2
96; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +000097 %1 = mul i64 %a, %b
98 ret i64 %1
99}
100
Alex Bradburyd3263aa2018-01-18 09:41:14 +0000101define i64 @mul64_constant(i64 %a) nounwind {
Alex Bradburyffc435e2017-11-21 08:11:03 +0000102; RV32I-LABEL: mul64_constant:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000103; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000104; RV32I-NEXT: addi sp, sp, -16
Alex Bradbury660bcce2017-12-11 11:53:54 +0000105; RV32I-NEXT: sw ra, 12(sp)
Alex Bradburyffc435e2017-11-21 08:11:03 +0000106; RV32I-NEXT: addi a2, zero, 5
Alex Bradbury59136ff2017-12-15 09:47:01 +0000107; RV32I-NEXT: mv a3, zero
Shiva Chend58bd8d2018-04-25 14:19:12 +0000108; RV32I-NEXT: call __muldi3
Alex Bradbury660bcce2017-12-11 11:53:54 +0000109; RV32I-NEXT: lw ra, 12(sp)
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000110; RV32I-NEXT: addi sp, sp, 16
Alex Bradbury59136ff2017-12-15 09:47:01 +0000111; RV32I-NEXT: ret
Alex Bradbury92138382018-01-18 12:36:38 +0000112;
113; RV32IM-LABEL: mul64_constant:
114; RV32IM: # %bb.0:
115; RV32IM-NEXT: addi a2, zero, 5
116; RV32IM-NEXT: mul a1, a1, a2
117; RV32IM-NEXT: mulhu a3, a0, a2
118; RV32IM-NEXT: add a1, a3, a1
119; RV32IM-NEXT: mul a0, a0, a2
120; RV32IM-NEXT: ret
Alex Bradburyffc435e2017-11-21 08:11:03 +0000121 %1 = mul i64 %a, 5
122 ret i64 %1
123}
Alex Bradbury92138382018-01-18 12:36:38 +0000124
125define i32 @mulhs(i32 %a, i32 %b) nounwind {
126; RV32I-LABEL: mulhs:
127; RV32I: # %bb.0:
128; RV32I-NEXT: addi sp, sp, -16
129; RV32I-NEXT: sw ra, 12(sp)
130; RV32I-NEXT: mv a2, a1
Alex Bradbury92138382018-01-18 12:36:38 +0000131; RV32I-NEXT: srai a1, a0, 31
132; RV32I-NEXT: srai a3, a2, 31
Shiva Chend58bd8d2018-04-25 14:19:12 +0000133; RV32I-NEXT: call __muldi3
Alex Bradbury92138382018-01-18 12:36:38 +0000134; RV32I-NEXT: mv a0, a1
135; RV32I-NEXT: lw ra, 12(sp)
136; RV32I-NEXT: addi sp, sp, 16
137; RV32I-NEXT: ret
138;
139; RV32IM-LABEL: mulhs:
140; RV32IM: # %bb.0:
141; RV32IM-NEXT: mulh a0, a0, a1
142; RV32IM-NEXT: ret
143 %1 = sext i32 %a to i64
144 %2 = sext i32 %b to i64
145 %3 = mul i64 %1, %2
146 %4 = lshr i64 %3, 32
147 %5 = trunc i64 %4 to i32
148 ret i32 %5
149}
150
151define i32 @mulhu(i32 %a, i32 %b) nounwind {
152; RV32I-LABEL: mulhu:
153; RV32I: # %bb.0:
154; RV32I-NEXT: addi sp, sp, -16
155; RV32I-NEXT: sw ra, 12(sp)
156; RV32I-NEXT: mv a2, a1
Alex Bradbury92138382018-01-18 12:36:38 +0000157; RV32I-NEXT: mv a1, zero
158; RV32I-NEXT: mv a3, zero
Shiva Chend58bd8d2018-04-25 14:19:12 +0000159; RV32I-NEXT: call __muldi3
Alex Bradbury92138382018-01-18 12:36:38 +0000160; RV32I-NEXT: mv a0, a1
161; RV32I-NEXT: lw ra, 12(sp)
162; RV32I-NEXT: addi sp, sp, 16
163; RV32I-NEXT: ret
164;
165; RV32IM-LABEL: mulhu:
166; RV32IM: # %bb.0:
167; RV32IM-NEXT: mulhu a0, a0, a1
168; RV32IM-NEXT: ret
169 %1 = zext i32 %a to i64
170 %2 = zext i32 %b to i64
171 %3 = mul i64 %1, %2
172 %4 = lshr i64 %3, 32
173 %5 = trunc i64 %4 to i32
174 ret i32 %5
175}