xref: /llvm-project/llvm/test/CodeGen/RISCV/half-maximum-minimum.ll (revision 048458f94c60fc9c200c9dcbcccd4a54ed84b8f9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zfh \
3; RUN:   -verify-machineinstrs -target-abi ilp32f | \
4; RUN:   FileCheck -check-prefixes=CHECKIZFH %s
5; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zfh \
6; RUN:   -verify-machineinstrs -target-abi lp64f | \
7; RUN:   FileCheck -check-prefixes=CHECKIZFH %s
8; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zhinx \
9; RUN:   -verify-machineinstrs -target-abi ilp32 | \
10; RUN:   FileCheck -check-prefixes=CHECKIZHINX %s
11; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zhinx \
12; RUN:   -verify-machineinstrs -target-abi lp64 | \
13; RUN:   FileCheck -check-prefixes=CHECKIZHINX %s
14
15declare half @llvm.minimum.f16(half, half)
16
17define half @fminimum_f16(half %a, half %b) nounwind {
18; CHECKIZFH-LABEL: fminimum_f16:
19; CHECKIZFH:       # %bb.0:
20; CHECKIZFH-NEXT:    feq.h a0, fa0, fa0
21; CHECKIZFH-NEXT:    fmv.h fa5, fa1
22; CHECKIZFH-NEXT:    beqz a0, .LBB0_3
23; CHECKIZFH-NEXT:  # %bb.1:
24; CHECKIZFH-NEXT:    feq.h a0, fa1, fa1
25; CHECKIZFH-NEXT:    beqz a0, .LBB0_4
26; CHECKIZFH-NEXT:  .LBB0_2:
27; CHECKIZFH-NEXT:    fmin.h fa0, fa0, fa5
28; CHECKIZFH-NEXT:    ret
29; CHECKIZFH-NEXT:  .LBB0_3:
30; CHECKIZFH-NEXT:    fmv.h fa5, fa0
31; CHECKIZFH-NEXT:    feq.h a0, fa1, fa1
32; CHECKIZFH-NEXT:    bnez a0, .LBB0_2
33; CHECKIZFH-NEXT:  .LBB0_4:
34; CHECKIZFH-NEXT:    fmin.h fa0, fa1, fa5
35; CHECKIZFH-NEXT:    ret
36;
37; CHECKIZHINX-LABEL: fminimum_f16:
38; CHECKIZHINX:       # %bb.0:
39; CHECKIZHINX-NEXT:    feq.h a3, a0, a0
40; CHECKIZHINX-NEXT:    mv a2, a1
41; CHECKIZHINX-NEXT:    beqz a3, .LBB0_3
42; CHECKIZHINX-NEXT:  # %bb.1:
43; CHECKIZHINX-NEXT:    feq.h a3, a1, a1
44; CHECKIZHINX-NEXT:    beqz a3, .LBB0_4
45; CHECKIZHINX-NEXT:  .LBB0_2:
46; CHECKIZHINX-NEXT:    fmin.h a0, a0, a2
47; CHECKIZHINX-NEXT:    ret
48; CHECKIZHINX-NEXT:  .LBB0_3:
49; CHECKIZHINX-NEXT:    mv a2, a0
50; CHECKIZHINX-NEXT:    feq.h a3, a1, a1
51; CHECKIZHINX-NEXT:    bnez a3, .LBB0_2
52; CHECKIZHINX-NEXT:  .LBB0_4:
53; CHECKIZHINX-NEXT:    fmin.h a0, a1, a2
54; CHECKIZHINX-NEXT:    ret
55  %1 = call half @llvm.minimum.f16(half %a, half %b)
56  ret half %1
57}
58
59declare half @llvm.maximum.f16(half, half)
60
61define half @fmaximum_f16(half %a, half %b) nounwind {
62; CHECKIZFH-LABEL: fmaximum_f16:
63; CHECKIZFH:       # %bb.0:
64; CHECKIZFH-NEXT:    feq.h a0, fa0, fa0
65; CHECKIZFH-NEXT:    fmv.h fa5, fa1
66; CHECKIZFH-NEXT:    beqz a0, .LBB1_3
67; CHECKIZFH-NEXT:  # %bb.1:
68; CHECKIZFH-NEXT:    feq.h a0, fa1, fa1
69; CHECKIZFH-NEXT:    beqz a0, .LBB1_4
70; CHECKIZFH-NEXT:  .LBB1_2:
71; CHECKIZFH-NEXT:    fmax.h fa0, fa0, fa5
72; CHECKIZFH-NEXT:    ret
73; CHECKIZFH-NEXT:  .LBB1_3:
74; CHECKIZFH-NEXT:    fmv.h fa5, fa0
75; CHECKIZFH-NEXT:    feq.h a0, fa1, fa1
76; CHECKIZFH-NEXT:    bnez a0, .LBB1_2
77; CHECKIZFH-NEXT:  .LBB1_4:
78; CHECKIZFH-NEXT:    fmax.h fa0, fa1, fa5
79; CHECKIZFH-NEXT:    ret
80;
81; CHECKIZHINX-LABEL: fmaximum_f16:
82; CHECKIZHINX:       # %bb.0:
83; CHECKIZHINX-NEXT:    feq.h a3, a0, a0
84; CHECKIZHINX-NEXT:    mv a2, a1
85; CHECKIZHINX-NEXT:    beqz a3, .LBB1_3
86; CHECKIZHINX-NEXT:  # %bb.1:
87; CHECKIZHINX-NEXT:    feq.h a3, a1, a1
88; CHECKIZHINX-NEXT:    beqz a3, .LBB1_4
89; CHECKIZHINX-NEXT:  .LBB1_2:
90; CHECKIZHINX-NEXT:    fmax.h a0, a0, a2
91; CHECKIZHINX-NEXT:    ret
92; CHECKIZHINX-NEXT:  .LBB1_3:
93; CHECKIZHINX-NEXT:    mv a2, a0
94; CHECKIZHINX-NEXT:    feq.h a3, a1, a1
95; CHECKIZHINX-NEXT:    bnez a3, .LBB1_2
96; CHECKIZHINX-NEXT:  .LBB1_4:
97; CHECKIZHINX-NEXT:    fmax.h a0, a1, a2
98; CHECKIZHINX-NEXT:    ret
99  %1 = call half @llvm.maximum.f16(half %a, half %b)
100  ret half %1
101}
102
103define half @fminimum_nnan_f16(half %a, half %b) nounwind {
104; CHECKIZFH-LABEL: fminimum_nnan_f16:
105; CHECKIZFH:       # %bb.0:
106; CHECKIZFH-NEXT:    fmin.h fa0, fa0, fa1
107; CHECKIZFH-NEXT:    ret
108;
109; CHECKIZHINX-LABEL: fminimum_nnan_f16:
110; CHECKIZHINX:       # %bb.0:
111; CHECKIZHINX-NEXT:    fmin.h a0, a0, a1
112; CHECKIZHINX-NEXT:    ret
113  %1 = call nnan half @llvm.minimum.f16(half %a, half %b)
114  ret half %1
115}
116
117define half @fmaximum_nnan_f16(half %a, half %b) nounwind {
118; CHECKIZFH-LABEL: fmaximum_nnan_f16:
119; CHECKIZFH:       # %bb.0:
120; CHECKIZFH-NEXT:    fmax.h fa0, fa0, fa1
121; CHECKIZFH-NEXT:    ret
122;
123; CHECKIZHINX-LABEL: fmaximum_nnan_f16:
124; CHECKIZHINX:       # %bb.0:
125; CHECKIZHINX-NEXT:    fmax.h a0, a0, a1
126; CHECKIZHINX-NEXT:    ret
127  %1 = call nnan half @llvm.maximum.f16(half %a, half %b)
128  ret half %1
129}
130
131define half @fminimum_nnan_attr_f16(half %a, half %b) nounwind "no-nans-fp-math"="true" {
132; CHECKIZFH-LABEL: fminimum_nnan_attr_f16:
133; CHECKIZFH:       # %bb.0:
134; CHECKIZFH-NEXT:    fmin.h fa0, fa0, fa1
135; CHECKIZFH-NEXT:    ret
136;
137; CHECKIZHINX-LABEL: fminimum_nnan_attr_f16:
138; CHECKIZHINX:       # %bb.0:
139; CHECKIZHINX-NEXT:    fmin.h a0, a0, a1
140; CHECKIZHINX-NEXT:    ret
141  %1 = call half @llvm.minimum.f16(half %a, half %b)
142  ret half %1
143}
144
145define half @fminimum_nnan_op_f16(half %a, half %b) nounwind {
146; CHECKIZFH-LABEL: fminimum_nnan_op_f16:
147; CHECKIZFH:       # %bb.0:
148; CHECKIZFH-NEXT:    feq.h a0, fa0, fa0
149; CHECKIZFH-NEXT:    bnez a0, .LBB5_2
150; CHECKIZFH-NEXT:  # %bb.1:
151; CHECKIZFH-NEXT:    fmin.h fa0, fa0, fa0
152; CHECKIZFH-NEXT:    ret
153; CHECKIZFH-NEXT:  .LBB5_2:
154; CHECKIZFH-NEXT:    fadd.h fa5, fa0, fa0
155; CHECKIZFH-NEXT:    fmin.h fa0, fa0, fa5
156; CHECKIZFH-NEXT:    ret
157;
158; CHECKIZHINX-LABEL: fminimum_nnan_op_f16:
159; CHECKIZHINX:       # %bb.0:
160; CHECKIZHINX-NEXT:    feq.h a1, a0, a0
161; CHECKIZHINX-NEXT:    bnez a1, .LBB5_2
162; CHECKIZHINX-NEXT:  # %bb.1:
163; CHECKIZHINX-NEXT:    fmin.h a0, a0, a0
164; CHECKIZHINX-NEXT:    ret
165; CHECKIZHINX-NEXT:  .LBB5_2:
166; CHECKIZHINX-NEXT:    fadd.h a1, a0, a0
167; CHECKIZHINX-NEXT:    fmin.h a0, a0, a1
168; CHECKIZHINX-NEXT:    ret
169  %c = fadd nnan half %a, %a
170  %1 = call half @llvm.minimum.f16(half %a, half %c)
171  ret half %1
172}
173
174define half @fmaximum_nnan_op_f16(half %a, half %b) nounwind {
175; CHECKIZFH-LABEL: fmaximum_nnan_op_f16:
176; CHECKIZFH:       # %bb.0:
177; CHECKIZFH-NEXT:    fadd.h fa5, fa0, fa1
178; CHECKIZFH-NEXT:    fsub.h fa4, fa0, fa1
179; CHECKIZFH-NEXT:    fmax.h fa0, fa5, fa4
180; CHECKIZFH-NEXT:    ret
181;
182; CHECKIZHINX-LABEL: fmaximum_nnan_op_f16:
183; CHECKIZHINX:       # %bb.0:
184; CHECKIZHINX-NEXT:    fadd.h a2, a0, a1
185; CHECKIZHINX-NEXT:    fsub.h a0, a0, a1
186; CHECKIZHINX-NEXT:    fmax.h a0, a2, a0
187; CHECKIZHINX-NEXT:    ret
188  %c = fadd nnan half %a, %b
189  %d = fsub nnan half %a, %b
190  %1 = call half @llvm.maximum.f16(half %c, half %d)
191  ret half %1
192}
193