Skip to content

Commit 49d36d7

Browse files
committed
Improve documentation of splatted constants
1 parent 1d5bf6b commit 49d36d7

File tree

1 file changed

+28
-26
lines changed

1 file changed

+28
-26
lines changed

compiler/rustc_codegen_ssa/src/traits/builder.rs

+28-26
Original file line numberDiff line numberDiff line change
@@ -279,32 +279,6 @@ pub trait BuilderMethods<'a, 'tcx>:
279279
assert!(rounded_max.value.is_finite());
280280
(rounded_min.value.to_bits(), rounded_max.value.to_bits())
281281
};
282-
283-
let maybe_splat = |bx: &mut Self, val| {
284-
if bx.cx().type_kind(dest_ty) == TypeKind::Vector {
285-
bx.vector_splat(bx.vector_length(dest_ty), val)
286-
} else {
287-
val
288-
}
289-
};
290-
291-
let float_bits_to_llval = |bx: &mut Self, bits| {
292-
let bits_llval = match float_width {
293-
32 => bx.cx().const_u32(bits as u32),
294-
64 => bx.cx().const_u64(bits as u64),
295-
n => bug!("unsupported float width {}", n),
296-
};
297-
bx.bitcast(bits_llval, float_ty)
298-
};
299-
let (f_min, f_max) = match float_width {
300-
32 => compute_clamp_bounds_single(signed, int_width),
301-
64 => compute_clamp_bounds_double(signed, int_width),
302-
n => bug!("unsupported float width {}", n),
303-
};
304-
let f_min = float_bits_to_llval(self, f_min);
305-
let f_max = float_bits_to_llval(self, f_max);
306-
let f_min = maybe_splat(self, f_min);
307-
let f_max = maybe_splat(self, f_max);
308282
// To implement saturation, we perform the following steps:
309283
//
310284
// 1. Cast x to an integer with fpto[su]i. This may result in undef.
@@ -332,9 +306,37 @@ pub trait BuilderMethods<'a, 'tcx>:
332306
// int_ty::MIN and therefore the return value of int_ty::MIN is correct.
333307
// QED.
334308

309+
let float_bits_to_llval = |bx: &mut Self, bits| {
310+
let bits_llval = match float_width {
311+
32 => bx.cx().const_u32(bits as u32),
312+
64 => bx.cx().const_u64(bits as u64),
313+
n => bug!("unsupported float width {}", n),
314+
};
315+
bx.bitcast(bits_llval, float_ty)
316+
};
317+
let (f_min, f_max) = match float_width {
318+
32 => compute_clamp_bounds_single(signed, int_width),
319+
64 => compute_clamp_bounds_double(signed, int_width),
320+
n => bug!("unsupported float width {}", n),
321+
};
322+
let f_min = float_bits_to_llval(self, f_min);
323+
let f_max = float_bits_to_llval(self, f_max);
335324
let int_max = self.cx().const_uint_big(int_ty, int_max(signed, int_width));
336325
let int_min = self.cx().const_uint_big(int_ty, int_min(signed, int_width) as u128);
337326
let zero = self.cx().const_uint(int_ty, 0);
327+
328+
// If we're working with vectors, constants must be "splatted": the constant is duplicated
329+
// into each lane of the vector. The algorithm stays the same, we are just using the
330+
// same constant across all lanes.
331+
let maybe_splat = |bx: &mut Self, val| {
332+
if bx.cx().type_kind(dest_ty) == TypeKind::Vector {
333+
bx.vector_splat(bx.vector_length(dest_ty), val)
334+
} else {
335+
val
336+
}
337+
};
338+
let f_min = maybe_splat(self, f_min);
339+
let f_max = maybe_splat(self, f_max);
338340
let int_max = maybe_splat(self, int_max);
339341
let int_min = maybe_splat(self, int_min);
340342
let zero = maybe_splat(self, zero);

0 commit comments

Comments
 (0)