Skip to content

Commit 3d2e05b

Browse files
committed
intrinsic-test: print scalable vectors on test fail
This makes it far easier to debug what's potentially gone wrong with an intrinsic test.
1 parent 687d636 commit 3d2e05b

2 files changed

Lines changed: 82 additions & 3 deletions

File tree

library/stdarch/crates/intrinsic-test/src/arm/mod.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,73 @@ const fn svprfop_from_i32(value: i32) -> svprfop {
232232
_ => unreachable!(),
233233
}
234234
}
235+
236+
macro_rules! debug_print_integral {
237+
($($name:ident => ($ty:ty, $svptrue_fn:ident, $svcnt_fn:ident, $svst_fn:ident)),*) => {
238+
$(
239+
#[inline]
240+
#[target_feature(enable = "sve")]
241+
#[cfg(all(any(target_arch = "aarch64", target_arch = "arm64ec"), target_endian = "little"))]
242+
pub fn $name(v: $ty) -> String {
243+
unsafe {
244+
let __pred = $svptrue_fn();
245+
let __num_elems = $svcnt_fn() as usize;
246+
let mut __buf = std::vec::Vec::with_capacity(__num_elems);
247+
$svst_fn(__pred, __buf.as_mut_ptr(), v);
248+
__buf.set_len(__num_elems);
249+
format!(
250+
"[{}]",
251+
__buf.iter().map(|el| el.to_string()).collect::<Vec<_>>().join(", ")
252+
)
253+
}
254+
}
255+
)*
256+
}
257+
}
258+
259+
debug_print_integral! {
260+
debug_print_f32 => (svfloat32_t, svptrue_b32, svcntw, svst1_f32),
261+
debug_print_f64 => (svfloat64_t, svptrue_b64, svcntd, svst1_f64),
262+
debug_print_s8 => (svint8_t, svptrue_b8, svcntb, svst1_s8),
263+
debug_print_s16 => (svint16_t, svptrue_b16, svcnth, svst1_s16),
264+
debug_print_s32 => (svint32_t, svptrue_b32, svcntw, svst1_s32),
265+
debug_print_s64 => (svint64_t, svptrue_b64, svcntd, svst1_s64),
266+
debug_print_u8 => (svuint8_t, svptrue_b8, svcntb, svst1_u8),
267+
debug_print_u16 => (svuint16_t, svptrue_b16, svcnth, svst1_u16),
268+
debug_print_u32 => (svuint32_t, svptrue_b32, svcntw, svst1_u32),
269+
debug_print_u64 => (svuint64_t, svptrue_b64, svcntd, svst1_u64)
270+
}
271+
272+
macro_rules! debug_print_bool {
273+
($($name:ident => ($ty:ty, $svst_fn:ident, $svdup_fn:ident)),*) => {
274+
$(
275+
#[inline]
276+
#[target_feature(enable = "sve")]
277+
#[cfg(all(any(target_arch = "aarch64", target_arch = "arm64ec"), target_endian = "little"))]
278+
pub fn $name(v: $ty) -> String {
279+
unsafe {
280+
let __num_elems = svcntb() as usize;
281+
let mut __buf = std::vec::Vec::with_capacity(__num_elems);
282+
$svst_fn(v, __buf.as_mut_ptr(), $svdup_fn(1));
283+
__buf.set_len(__num_elems);
284+
format!(
285+
"[{}]",
286+
__buf.iter()
287+
.map(|el| *el == 1)
288+
.map(|el| el.to_string())
289+
.collect::<Vec<_>>()
290+
.join(", ")
291+
)
292+
}
293+
}
294+
)*
295+
}
296+
}
297+
298+
debug_print_bool! {
299+
debug_print_b8 => (svbool_t, svst1_u8, svdup_n_u8),
300+
debug_print_b16 => (svbool_t, svst1_u16, svdup_n_u16),
301+
debug_print_b32 => (svbool_t, svst1_u32, svdup_n_u32),
302+
debug_print_b64 => (svbool_t, svst1_u64, svdup_n_u64)
303+
}
235304
"#;

library/stdarch/crates/intrinsic-test/src/arm/types.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,11 @@ let __rust_nan = svcmpuo_{ty}{bl}({PREDICATE_LOCAL}, __rust_eq_return_value, __r
155155
let __c_nan = svcmpuo_{ty}{bl}({PREDICATE_LOCAL}, __c_eq_return_value, __c_eq_return_value);
156156
let __both_nan = svand_b_z({PREDICATE_LOCAL}, __rust_nan, __c_nan);
157157
let __eq = svorr_b_z({PREDICATE_LOCAL}, __eq_sans_nan, __both_nan);
158-
assert!(svptest_any(__pred, __eq), "{{}}-{i_plus_one}/{n}", id);
158+
if !svptest_any(__pred, __eq) {{
159+
let __rust_pretty = debug_print_{ty}{bl}(__rust_eq_return_value);
160+
let __c_pretty = debug_print_{ty}{bl}(__c_eq_return_value);
161+
panic!("{{}}-{i_plus_one}/{n}\nRust: {{__rust_pretty}}\nC: {{__c_pretty}}", id);
162+
}}
159163
"#,
160164
ty = self.rust_intrinsic_name_prefix(),
161165
bl = self.inner_size(),
@@ -168,8 +172,14 @@ assert!(svptest_any(__pred, __eq), "{{}}-{i_plus_one}/{n}", id);
168172
// Most types can just use `svcmpeq`
169173
fmt(&format_args!(
170174
r#"
171-
let __eq = svcmpeq_{ty}{bl}({PREDICATE_LOCAL}, {rust_return_value}, {c_return_value});
172-
assert!(svptest_any(__pred, __eq), "{{}}-{i_plus_one}/{n}", id);
175+
let __rust_eq_return_value = {rust_return_value};
176+
let __c_eq_return_value = {c_return_value};
177+
let __eq = svcmpeq_{ty}{bl}({PREDICATE_LOCAL}, __rust_eq_return_value, __c_eq_return_value);
178+
if !svptest_any(__pred, __eq) {{
179+
let __rust_pretty = debug_print_{ty}{bl}(__rust_eq_return_value);
180+
let __c_pretty = debug_print_{ty}{bl}(__c_eq_return_value);
181+
panic!("{{}}-{i_plus_one}/{n}\nRust: {{__rust_pretty}}\nC: {{__c_pretty}}", id);
182+
}}
173183
"#,
174184
ty = self.rust_intrinsic_name_prefix(),
175185
bl = self.inner_size(),

0 commit comments

Comments
 (0)