Skip to content

Commit 658a12d

Browse files
committed
Add newtype for signedness in LLVM SIMD
1 parent c0fca90 commit 658a12d

File tree

1 file changed

+30
-23
lines changed

1 file changed

+30
-23
lines changed

compiler/rustc_codegen_llvm/src/intrinsic.rs

+30-23
Original file line numberDiff line numberDiff line change
@@ -2089,65 +2089,72 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
20892089
return Ok(args[0].immediate());
20902090
}
20912091

2092+
#[derive(Copy, Clone)]
2093+
enum Sign {
2094+
Unsigned,
2095+
Signed,
2096+
}
2097+
use Sign::*;
2098+
20922099
enum Style {
20932100
Float,
2094-
Int(/* is signed? */ bool),
2101+
Int(Sign),
20952102
Unsupported,
20962103
}
20972104

20982105
let (in_style, in_width) = match in_elem.kind() {
20992106
// vectors of pointer-sized integers should've been
21002107
// disallowed before here, so this unwrap is safe.
21012108
ty::Int(i) => (
2102-
Style::Int(true),
2109+
Style::Int(Signed),
21032110
i.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
21042111
),
21052112
ty::Uint(u) => (
2106-
Style::Int(false),
2113+
Style::Int(Unsigned),
21072114
u.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
21082115
),
21092116
ty::Float(f) => (Style::Float, f.bit_width()),
21102117
_ => (Style::Unsupported, 0),
21112118
};
21122119
let (out_style, out_width) = match out_elem.kind() {
21132120
ty::Int(i) => (
2114-
Style::Int(true),
2121+
Style::Int(Signed),
21152122
i.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
21162123
),
21172124
ty::Uint(u) => (
2118-
Style::Int(false),
2125+
Style::Int(Unsigned),
21192126
u.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
21202127
),
21212128
ty::Float(f) => (Style::Float, f.bit_width()),
21222129
_ => (Style::Unsupported, 0),
21232130
};
21242131

21252132
match (in_style, out_style) {
2126-
(Style::Int(in_is_signed), Style::Int(_)) => {
2133+
(Style::Int(sign), Style::Int(_)) => {
21272134
return Ok(match in_width.cmp(&out_width) {
21282135
Ordering::Greater => bx.trunc(args[0].immediate(), llret_ty),
21292136
Ordering::Equal => args[0].immediate(),
2130-
Ordering::Less => {
2131-
if in_is_signed {
2132-
bx.sext(args[0].immediate(), llret_ty)
2133-
} else {
2134-
bx.zext(args[0].immediate(), llret_ty)
2135-
}
2136-
}
2137+
Ordering::Less => match sign {
2138+
Sign::Signed => bx.sext(args[0].immediate(), llret_ty),
2139+
Sign::Unsigned => bx.zext(args[0].immediate(), llret_ty),
2140+
},
21372141
});
21382142
}
2139-
(Style::Int(in_is_signed), Style::Float) => {
2140-
return Ok(if in_is_signed {
2141-
bx.sitofp(args[0].immediate(), llret_ty)
2142-
} else {
2143-
bx.uitofp(args[0].immediate(), llret_ty)
2143+
(Style::Int(sign), Style::Float) => {
2144+
return Ok(match sign {
2145+
Sign::Signed => bx.sitofp(args[0].immediate(), llret_ty),
2146+
Sign::Unsigned => bx.uitofp(args[0].immediate(), llret_ty),
21442147
});
21452148
}
2146-
(Style::Float, Style::Int(out_is_signed)) => {
2147-
return Ok(match (out_is_signed, name == sym::simd_as) {
2148-
(false, false) => bx.fptoui(args[0].immediate(), llret_ty),
2149-
(true, false) => bx.fptosi(args[0].immediate(), llret_ty),
2150-
(_, true) => bx.cast_float_to_int(out_is_signed, args[0].immediate(), llret_ty),
2149+
(Style::Float, Style::Int(sign)) => {
2150+
return Ok(match (sign, name == sym::simd_as) {
2151+
(Sign::Unsigned, false) => bx.fptoui(args[0].immediate(), llret_ty),
2152+
(Sign::Signed, false) => bx.fptosi(args[0].immediate(), llret_ty),
2153+
(_, true) => bx.cast_float_to_int(
2154+
matches!(sign, Sign::Signed),
2155+
args[0].immediate(),
2156+
llret_ty,
2157+
),
21512158
});
21522159
}
21532160
(Style::Float, Style::Float) => {

0 commit comments

Comments
 (0)