Merge pull request #2414 from jgouly/extend-refactor
arm64: Refactor Inst::Extend handling
This commit is contained in:
@@ -1151,21 +1151,21 @@ pub(crate) fn lower_fcmp_or_ffcmp_to_flags<C: LowerCtx<I = Inst>>(ctx: &mut C, i
|
||||
}
|
||||
}
|
||||
|
||||
/// Convert a 0 / 1 result, such as from a conditional-set instruction, into a 0
|
||||
/// / -1 (all-ones) result as expected for bool operations.
|
||||
pub(crate) fn normalize_bool_result<C: LowerCtx<I = Inst>>(
|
||||
/// Materialize a boolean value into a register from the flags
|
||||
/// (e.g set by a comparison).
|
||||
/// A 0 / -1 (all-ones) result as expected for bool operations.
|
||||
pub(crate) fn materialize_bool_result<C: LowerCtx<I = Inst>>(
|
||||
ctx: &mut C,
|
||||
insn: IRInst,
|
||||
rd: Writable<Reg>,
|
||||
cond: Cond,
|
||||
) {
|
||||
// A boolean is 0 / -1; if output width is > 1, negate.
|
||||
// A boolean is 0 / -1; if output width is > 1 use `csetm`,
|
||||
// otherwise use `cset`.
|
||||
if ty_bits(ctx.output_ty(insn, 0)) > 1 {
|
||||
ctx.emit(Inst::AluRRR {
|
||||
alu_op: ALUOp::Sub64,
|
||||
rd,
|
||||
rn: zero_reg(),
|
||||
rm: rd.to_reg(),
|
||||
});
|
||||
ctx.emit(Inst::CSetm { rd, cond });
|
||||
} else {
|
||||
ctx.emit(Inst::CSet { rd, cond });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user