};
}
+create_instr_variants_ov_cr!(add, addo, add_, addo_, i64);
+
+pub fn addo(inputs: InstructionInput) -> InstructionResult {
+ let ra = inputs.ra as i64;
+ let rb = inputs.rb as i64;
+ let (result, overflow) = ra.overflowing_add(rb);
+ let result = result as u64;
+ InstructionResult {
+ rt: Some(result),
+ overflow: Some(OverflowFlags::from_overflow(overflow)),
+ ..InstructionResult::default()
+ }
+}
+
create_instr_variants_ov_cr!(divde, divdeo, divde_, divdeo_, i64);
pub fn divdeo(inputs: InstructionInput) -> InstructionResult {
"mfxer $1\n",
"mfcr $2\n",
)
- : "=&r"(rt), "=&r"(xer), "=&r"(cr)
- : "r"(ra), "r"(rb), "r"(rc), "r"(0u64), "r"(!0x8000_0000u64)
+ : "=&b"(rt), "=&b"(xer), "=&b"(cr)
+ : "b"(ra), "b"(rb), "b"(rc), "b"(0u64), "b"(!0x8000_0000u64)
: "xer", "cr");
}
let mut retval = InstructionResult::default();
}
instrs! {
+ // add
+ #[enumerant = Add]
+ fn add(ra, rb) -> (rt) {
+ "add"
+ }
+ #[enumerant = AddO]
+ fn addo(ra, rb) -> (rt, ov) {
+ "addo"
+ }
+ #[enumerant = Add_]
+ fn add_(ra, rb) -> (rt, cr0) {
+ "add."
+ }
+ #[enumerant = AddO_]
+ fn addo_(ra, rb) -> (rt, ov, cr0) {
+ "addo."
+ }
+
// divde
#[enumerant = DivDE]
fn divde(ra, rb) -> (rt) {