blob: 068ed2078eccff54ad3f70bf4d9ec95e946eb5fa [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 \
3; RUN: | FileCheck %s -check-prefix=RV32I
4
5; TODO: check the generated instructions for the equivalent of seqz, snez,
6; sltz, sgtz map to something simple
7
8define i32 @icmp_eq(i32 %a, i32 %b) nounwind {
9; RV32I-LABEL: icmp_eq:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000010; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000011; RV32I-NEXT: addi sp, sp, -16
12; RV32I-NEXT: sw ra, 12(sp)
13; RV32I-NEXT: sw s0, 8(sp)
14; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000015; RV32I-NEXT: xor a0, a0, a1
16; RV32I-NEXT: sltiu a0, a0, 1
Alex Bradburyb014e3d2017-12-11 12:34:11 +000017; RV32I-NEXT: lw s0, 8(sp)
18; RV32I-NEXT: lw ra, 12(sp)
19; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000020; RV32I-NEXT: jalr zero, ra, 0
21 %1 = icmp eq i32 %a, %b
22 %2 = zext i1 %1 to i32
23 ret i32 %2
24}
25
26define i32 @icmp_ne(i32 %a, i32 %b) nounwind {
27; RV32I-LABEL: icmp_ne:
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
30; RV32I-NEXT: sw ra, 12(sp)
31; RV32I-NEXT: sw s0, 8(sp)
32; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000033; RV32I-NEXT: xor a0, a0, a1
34; RV32I-NEXT: sltu a0, zero, a0
Alex Bradburyb014e3d2017-12-11 12:34:11 +000035; RV32I-NEXT: lw s0, 8(sp)
36; RV32I-NEXT: lw ra, 12(sp)
37; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000038; RV32I-NEXT: jalr zero, ra, 0
39 %1 = icmp ne i32 %a, %b
40 %2 = zext i1 %1 to i32
41 ret i32 %2
42}
43
44define i32 @icmp_ugt(i32 %a, i32 %b) nounwind {
45; RV32I-LABEL: icmp_ugt:
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
48; RV32I-NEXT: sw ra, 12(sp)
49; RV32I-NEXT: sw s0, 8(sp)
50; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000051; RV32I-NEXT: sltu a0, a1, a0
Alex Bradburyb014e3d2017-12-11 12:34:11 +000052; RV32I-NEXT: lw s0, 8(sp)
53; RV32I-NEXT: lw ra, 12(sp)
54; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000055; RV32I-NEXT: jalr zero, ra, 0
56 %1 = icmp ugt i32 %a, %b
57 %2 = zext i1 %1 to i32
58 ret i32 %2
59}
60
61define i32 @icmp_uge(i32 %a, i32 %b) nounwind {
62; RV32I-LABEL: icmp_uge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000063; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000064; RV32I-NEXT: addi sp, sp, -16
65; RV32I-NEXT: sw ra, 12(sp)
66; RV32I-NEXT: sw s0, 8(sp)
67; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000068; RV32I-NEXT: sltu a0, a0, a1
69; RV32I-NEXT: xori a0, a0, 1
Alex Bradburyb014e3d2017-12-11 12:34:11 +000070; RV32I-NEXT: lw s0, 8(sp)
71; RV32I-NEXT: lw ra, 12(sp)
72; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000073; RV32I-NEXT: jalr zero, ra, 0
74 %1 = icmp uge i32 %a, %b
75 %2 = zext i1 %1 to i32
76 ret i32 %2
77}
78
79define i32 @icmp_ult(i32 %a, i32 %b) nounwind {
80; RV32I-LABEL: icmp_ult:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000081; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000082; RV32I-NEXT: addi sp, sp, -16
83; RV32I-NEXT: sw ra, 12(sp)
84; RV32I-NEXT: sw s0, 8(sp)
85; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000086; RV32I-NEXT: sltu a0, a0, a1
Alex Bradburyb014e3d2017-12-11 12:34:11 +000087; RV32I-NEXT: lw s0, 8(sp)
88; RV32I-NEXT: lw ra, 12(sp)
89; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +000090; RV32I-NEXT: jalr zero, ra, 0
91 %1 = icmp ult i32 %a, %b
92 %2 = zext i1 %1 to i32
93 ret i32 %2
94}
95
96define i32 @icmp_ule(i32 %a, i32 %b) nounwind {
97; RV32I-LABEL: icmp_ule:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000098; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +000099; RV32I-NEXT: addi sp, sp, -16
100; RV32I-NEXT: sw ra, 12(sp)
101; RV32I-NEXT: sw s0, 8(sp)
102; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000103; RV32I-NEXT: sltu a0, a1, a0
104; RV32I-NEXT: xori a0, a0, 1
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000105; RV32I-NEXT: lw s0, 8(sp)
106; RV32I-NEXT: lw ra, 12(sp)
107; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000108; RV32I-NEXT: jalr zero, ra, 0
109 %1 = icmp ule i32 %a, %b
110 %2 = zext i1 %1 to i32
111 ret i32 %2
112}
113
114define i32 @icmp_sgt(i32 %a, i32 %b) nounwind {
115; RV32I-LABEL: icmp_sgt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000116; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000117; RV32I-NEXT: addi sp, sp, -16
118; RV32I-NEXT: sw ra, 12(sp)
119; RV32I-NEXT: sw s0, 8(sp)
120; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000121; RV32I-NEXT: slt a0, a1, a0
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000122; RV32I-NEXT: lw s0, 8(sp)
123; RV32I-NEXT: lw ra, 12(sp)
124; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000125; RV32I-NEXT: jalr zero, ra, 0
126 %1 = icmp sgt i32 %a, %b
127 %2 = zext i1 %1 to i32
128 ret i32 %2
129}
130
131define i32 @icmp_sge(i32 %a, i32 %b) nounwind {
132; RV32I-LABEL: icmp_sge:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000133; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000134; RV32I-NEXT: addi sp, sp, -16
135; RV32I-NEXT: sw ra, 12(sp)
136; RV32I-NEXT: sw s0, 8(sp)
137; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000138; RV32I-NEXT: slt a0, a0, a1
139; RV32I-NEXT: xori a0, a0, 1
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000140; RV32I-NEXT: lw s0, 8(sp)
141; RV32I-NEXT: lw ra, 12(sp)
142; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000143; RV32I-NEXT: jalr zero, ra, 0
144 %1 = icmp sge i32 %a, %b
145 %2 = zext i1 %1 to i32
146 ret i32 %2
147}
148
149define i32 @icmp_slt(i32 %a, i32 %b) nounwind {
150; RV32I-LABEL: icmp_slt:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000151; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000152; RV32I-NEXT: addi sp, sp, -16
153; RV32I-NEXT: sw ra, 12(sp)
154; RV32I-NEXT: sw s0, 8(sp)
155; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000156; RV32I-NEXT: slt a0, a0, a1
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000157; RV32I-NEXT: lw s0, 8(sp)
158; RV32I-NEXT: lw ra, 12(sp)
159; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000160; RV32I-NEXT: jalr zero, ra, 0
161 %1 = icmp slt i32 %a, %b
162 %2 = zext i1 %1 to i32
163 ret i32 %2
164}
165
166define i32 @icmp_sle(i32 %a, i32 %b) nounwind {
167; RV32I-LABEL: icmp_sle:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000168; RV32I: # %bb.0:
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000169; RV32I-NEXT: addi sp, sp, -16
170; RV32I-NEXT: sw ra, 12(sp)
171; RV32I-NEXT: sw s0, 8(sp)
172; RV32I-NEXT: addi s0, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000173; RV32I-NEXT: slt a0, a1, a0
174; RV32I-NEXT: xori a0, a0, 1
Alex Bradburyb014e3d2017-12-11 12:34:11 +0000175; RV32I-NEXT: lw s0, 8(sp)
176; RV32I-NEXT: lw ra, 12(sp)
177; RV32I-NEXT: addi sp, sp, 16
Alex Bradburyffc435e2017-11-21 08:11:03 +0000178; RV32I-NEXT: jalr zero, ra, 0
179 %1 = icmp sle i32 %a, %b
180 %2 = zext i1 %1 to i32
181 ret i32 %2
182}
183
184; TODO: check variants with an immediate?