1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
// Copyright (c) 2025 taitep
// SPDX-License-Identifier: BSD-2-Clause
//
// This file is part of TRVE (https://gitea.taitep.se/taitep/trve)
// See LICENSE file in the project root for full license text.
//
use crate::{core::Core, decode::Instruction, exceptions::Exception};
// multiplication
instr_op_r!(mul, u64::wrapping_mul);
instr_op_r!(mulw, |a, b| u32::wrapping_mul(a as u32, b as u32) as u64);
instr_op_r!(mulh, |a, b| ((a as i64 as i128 * b as i64 as i128) >> 64)
as u64);
instr_op_r!(mulhsu, |a, b| ((a as i64 as i128 * b as i128) >> 64) as u64);
instr_op_r!(mulhu, |a, b| ((a as u128 * b as u128) >> 64) as u64);
// division
instr_op_r!(div, |a, b| match b {
0 => -1,
_ => i64::wrapping_div(a as i64, b as i64),
} as u64);
instr_op_r!(divu, |a, b| match b {
0 => u64::MAX,
_ => a / b,
});
instr_op_r!(divw, |a, b| match b {
0 => -1,
_ => i32::wrapping_div(a as i32, b as i32),
} as i64 as u64);
instr_op_r!(divuw, |a, b| match b {
0 => u32::MAX,
_ => a as u32 / b as u32,
} as i32 as i64 as u64);
// remainder
instr_op_r!(rem, |a, b| match b {
0 => a,
_ => i64::wrapping_rem(a as i64, b as i64) as u64,
});
instr_op_r!(remu, |a, b| match b {
0 => a,
_ => a % b,
});
instr_op_r!(remw, |a, b| match b {
0 => a as i32,
_ => i32::wrapping_rem(a as i32, b as i32),
} as i64 as u64);
instr_op_r!(remuw, |a, b| match b {
0 => a as u32,
_ => a as u32 % b as u32,
} as i32 as i64 as u64);
|