1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 // See Notices.txt for copyright information
7 #[derive(Copy, Clone, Debug)]
14 fn from_xer(xer: u64) -> Self {
16 overflow: (xer & 0x4000_0000) != 0,
17 overflow32: (xer & 0x8_0000) != 0,
22 impl fmt::Display for OverflowFlags {
23 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
30 "OV:{overflow}, OV32:{overflow32}",
31 overflow = overflow as i32,
32 overflow32 = overflow32 as i32,
37 #[derive(Copy, Clone, Debug)]
38 struct TestDivResult {
40 overflow: Option<OverflowFlags>,
43 impl fmt::Display for TestDivResult {
44 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
45 let Self { result, overflow } = *self;
46 write!(f, "{:#X}", result)?;
47 if let Some(overflow) = overflow {
48 write!(f, ", {}", overflow)?;
54 #[derive(Copy, Clone, Debug)]
61 impl fmt::Display for TestDivInput {
62 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
70 "{:#X} div {:#X} (result_prev:{:#X})",
71 dividend, divisor, result_prev,
76 macro_rules! make_div_functions {
90 pub fn $div_name(self) -> TestDivResult {
101 stringify!($div_name),
105 : "=&r"(result), "=&r"(xer)
106 : "0"(result_prev), "r"(dividend), "r"(divisor)
111 overflow: Some(OverflowFlags::from_xer(xer)),
117 pub fn $rem_name(self) -> TestDivResult {
127 stringify!($rem_name),
131 : "0"(result_prev), "r"(dividend), "r"(divisor));
139 pub const FUNCTIONS: &'static [(fn(TestDivInput) -> TestDivResult, &'static str)] = &[
140 $((Self::$div_name, stringify!($div_name)),)+
141 $((Self::$rem_name, stringify!($rem_name)),)+
147 make_div_functions! {
149 {divdeo; divdeuo; divdo; divduo; divweo; divweuo; divwo; divwuo;}
151 {modsd; modud; modsw; moduw;}
154 const TEST_VALUES: &[u64] = &[
156 0xFFFF_FFFF_FFFF_FFFF,
157 0x7FFF_FFFF_FFFF_FFFF,
158 0x8000_0000_0000_0000,
159 0x1234_5678_0000_0000,
160 0x1234_5678_8000_0000,
161 0x1234_5678_FFFF_FFFF,
162 0x1234_5678_7FFF_FFFF,
166 for &(f, name) in TestDivInput::FUNCTIONS {
167 for ÷nd in TEST_VALUES {
168 for &divisor in TEST_VALUES {
169 let inputs = TestDivInput {
172 result_prev: 0xFECD_BA98_7654_3210,
174 let outputs = f(inputs);
175 println!("{}: {} -> {}", name, inputs, outputs);