1 use crate::{OverflowFlags, TestDivInput, TestDivResult};
3 pub fn divdeo(inputs: TestDivInput) -> TestDivResult {
4 let dividend = i128::from(inputs.dividend as i64) << 64;
5 let divisor = i128::from(inputs.divisor as i64);
8 if divisor == 0 || (divisor == -1 && dividend == i128::min_value()) {
12 let result128 = dividend / divisor;
13 result = result128 as u64;
14 overflow = result128 as i64 as i128 != result128;
18 overflow: Some(OverflowFlags {
25 pub fn divdeuo(inputs: TestDivInput) -> TestDivResult {
26 let dividend = u128::from(inputs.dividend) << 64;
27 let divisor = u128::from(inputs.divisor);
34 let resultu128 = dividend / divisor;
35 result = resultu128 as u64;
36 overflow = resultu128 > u128::from(u64::max_value());
40 overflow: Some(OverflowFlags {
47 pub fn divdo(inputs: TestDivInput) -> TestDivResult {
48 let dividend = inputs.dividend as i64;
49 let divisor = inputs.divisor as i64;
52 if divisor == 0 || (divisor == -1 && dividend == i64::min_value()) {
56 result = (dividend / divisor) as u64;
61 overflow: Some(OverflowFlags {
68 pub fn divduo(inputs: TestDivInput) -> TestDivResult {
69 let dividend: u64 = inputs.dividend;
70 let divisor: u64 = inputs.divisor;
77 result = dividend / divisor;
82 overflow: Some(OverflowFlags {
89 pub fn divweo(inputs: TestDivInput) -> TestDivResult {
90 let dividend = i64::from(inputs.dividend as i32) << 32;
91 let divisor = i64::from(inputs.divisor as i32);
94 if divisor == 0 || (divisor == -1 && dividend == i64::min_value()) {
98 let result64 = dividend / divisor;
99 result = result64 as u32 as u64;
100 overflow = result64 as i32 as i64 != result64;
104 overflow: Some(OverflowFlags {
106 overflow32: overflow,
111 pub fn divweuo(inputs: TestDivInput) -> TestDivResult {
112 let dividend = u64::from(inputs.dividend) << 32;
113 let divisor = u64::from(inputs.divisor);
120 let resultu64 = dividend / divisor;
121 result = resultu64 as u32 as u64;
122 overflow = resultu64 > u64::from(u32::max_value());
126 overflow: Some(OverflowFlags {
128 overflow32: overflow,
133 pub fn divwo(inputs: TestDivInput) -> TestDivResult {
134 let dividend = inputs.dividend as i32;
135 let divisor = inputs.divisor as i32;
138 if divisor == 0 || (divisor == -1 && dividend == i32::min_value()) {
142 result = (dividend / divisor) as u32 as u64;
147 overflow: Some(OverflowFlags {
149 overflow32: overflow,
154 pub fn divwuo(inputs: TestDivInput) -> TestDivResult {
155 let dividend = inputs.dividend as u32;
156 let divisor = inputs.divisor as u32;
163 result = (dividend / divisor) as u64;
168 overflow: Some(OverflowFlags {
170 overflow32: overflow,
175 pub fn modsd(inputs: TestDivInput) -> TestDivResult {
176 let dividend = inputs.dividend as i64;
177 let divisor = inputs.divisor as i64;
179 if divisor == 0 || (divisor == -1 && dividend == i64::min_value()) {
182 result = (dividend % divisor) as u64;
190 pub fn modud(inputs: TestDivInput) -> TestDivResult {
191 let dividend: u64 = inputs.dividend;
192 let divisor: u64 = inputs.divisor;
197 result = dividend % divisor;
205 pub fn modsw(inputs: TestDivInput) -> TestDivResult {
206 let dividend = inputs.dividend as i32;
207 let divisor = inputs.divisor as i32;
209 if divisor == 0 || (divisor == -1 && dividend == i32::min_value()) {
212 result = (dividend % divisor) as u32 as u64;
220 pub fn moduw(inputs: TestDivInput) -> TestDivResult {
221 let dividend = inputs.dividend as u32;
222 let divisor = inputs.divisor as u32;
227 result = (dividend % divisor) as u64;