Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 878a173

Browse files
committed
Fix for the fminimum intrinsics
1 parent 5701150 commit 878a173

File tree

1 file changed

+76
-37
lines changed

1 file changed

+76
-37
lines changed

src/intrinsic/mod.rs

Lines changed: 76 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -72,44 +72,8 @@ fn get_simple_intrinsic<'gcc, 'tcx>(
7272
sym::fabsf64 => "fabs",
7373
sym::minnumf32 => "fminf",
7474
sym::minnumf64 => "fmin",
75-
sym::minimumf32 => "fminimumf",
76-
sym::minimumf64 => "fminimum",
77-
sym::minimumf128 => {
78-
// GCC doesn't have the intrinsic we want so we use the compiler-builtins one
79-
// https://docs.rs/compiler_builtins/latest/compiler_builtins/math/full_availability/fn.fminimumf128.html
80-
let f128_type = cx.type_f128();
81-
return Some(cx.context.new_function(
82-
None,
83-
FunctionType::Extern,
84-
f128_type,
85-
&[
86-
cx.context.new_parameter(None, f128_type, "a"),
87-
cx.context.new_parameter(None, f128_type, "b"),
88-
],
89-
"fminimumf128",
90-
false,
91-
));
92-
}
9375
sym::maxnumf32 => "fmaxf",
9476
sym::maxnumf64 => "fmax",
95-
sym::maximumf32 => "fmaximumf",
96-
sym::maximumf64 => "fmaximum",
97-
sym::maximumf128 => {
98-
// GCC doesn't have the intrinsic we want so we use the compiler-builtins one
99-
// https://docs.rs/compiler_builtins/latest/compiler_builtins/math/full_availability/fn.fmaximumf128.html
100-
let f128_type = cx.type_f128();
101-
return Some(cx.context.new_function(
102-
None,
103-
FunctionType::Extern,
104-
f128_type,
105-
&[
106-
cx.context.new_parameter(None, f128_type, "a"),
107-
cx.context.new_parameter(None, f128_type, "b"),
108-
],
109-
"fmaximumf128",
110-
false,
111-
));
112-
}
11377
sym::copysignf32 => "copysignf",
11478
sym::copysignf64 => "copysign",
11579
sym::copysignf128 => "copysignl",
@@ -130,6 +94,72 @@ fn get_simple_intrinsic<'gcc, 'tcx>(
13094
Some(cx.context.get_builtin_function(gcc_name))
13195
}
13296

97+
// TODO(antoyo): We can probably remove these and use the fallback intrinsic implementation.
98+
fn get_simple_function<'gcc, 'tcx>(
99+
cx: &CodegenCx<'gcc, 'tcx>,
100+
name: Symbol,
101+
) -> Option<Function<'gcc>> {
102+
let (return_type, parameters, func_name) = match name {
103+
sym::minimumf32 => {
104+
let parameters = [
105+
cx.context.new_parameter(None, cx.float_type, "a"),
106+
cx.context.new_parameter(None, cx.float_type, "b"),
107+
];
108+
(cx.float_type, parameters, "fminimumf")
109+
}
110+
sym::minimumf64 => {
111+
let parameters = [
112+
cx.context.new_parameter(None, cx.double_type, "a"),
113+
cx.context.new_parameter(None, cx.double_type, "b"),
114+
];
115+
(cx.double_type, parameters, "fminimum")
116+
}
117+
sym::minimumf128 => {
118+
let f128_type = cx.type_f128();
119+
// GCC doesn't have the intrinsic we want so we use the compiler-builtins one
120+
// https://docs.rs/compiler_builtins/latest/compiler_builtins/math/full_availability/fn.fminimumf128.html
121+
let parameters = [
122+
cx.context.new_parameter(None, f128_type, "a"),
123+
cx.context.new_parameter(None, f128_type, "b"),
124+
];
125+
(f128_type, parameters, "fminimumf128")
126+
}
127+
sym::maximumf32 => {
128+
let parameters = [
129+
cx.context.new_parameter(None, cx.float_type, "a"),
130+
cx.context.new_parameter(None, cx.float_type, "b"),
131+
];
132+
(cx.float_type, parameters, "fmaximumf")
133+
}
134+
sym::maximumf64 => {
135+
let parameters = [
136+
cx.context.new_parameter(None, cx.double_type, "a"),
137+
cx.context.new_parameter(None, cx.double_type, "b"),
138+
];
139+
(cx.double_type, parameters, "fmaximum")
140+
}
141+
sym::maximumf128 => {
142+
let f128_type = cx.type_f128();
143+
// GCC doesn't have the intrinsic we want so we use the compiler-builtins one
144+
// https://docs.rs/compiler_builtins/latest/compiler_builtins/math/full_availability/fn.fmaximumf128.html
145+
let parameters = [
146+
cx.context.new_parameter(None, f128_type, "a"),
147+
cx.context.new_parameter(None, f128_type, "b"),
148+
];
149+
(f128_type, parameters, "fmaximumf128")
150+
}
151+
_ => return None,
152+
};
153+
Some(cx.context.new_function(
154+
None,
155+
FunctionType::Extern,
156+
return_type,
157+
&parameters,
158+
func_name,
159+
false,
160+
))
161+
}
162+
133163
impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tcx> {
134164
fn codegen_intrinsic_call(
135165
&mut self,
@@ -158,14 +188,23 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
158188
let result = PlaceRef::new_sized(llresult, fn_abi.ret.layout);
159189

160190
let simple = get_simple_intrinsic(self, name);
191+
let simple_func = get_simple_function(self, name);
161192

162193
// FIXME(tempdragon): Re-enable `clippy::suspicious_else_formatting` if the following issue is solved:
163194
// https://github.com/rust-lang/rust-clippy/issues/12497
164195
// and leave `else if use_integer_compare` to be placed "as is".
165196
#[allow(clippy::suspicious_else_formatting)]
166197
let value = match name {
167198
_ if simple.is_some() => {
168-
let func = simple.expect("simple function");
199+
let func = simple.expect("simple intrinsic function");
200+
self.cx.context.new_call(
201+
self.location,
202+
func,
203+
&args.iter().map(|arg| arg.immediate()).collect::<Vec<_>>(),
204+
)
205+
}
206+
_ if simple_func.is_some() => {
207+
let func = simple_func.expect("simple function");
169208
self.cx.context.new_call(
170209
self.location,
171210
func,

0 commit comments

Comments
 (0)