Adds Bswap to the Cranelift IR. Implements the Bswap instruction in the x64 and aarch64 codegen backends. Cranelift users can now: ``` builder.ins().bswap(value) ``` to get a native byteswap instruction. * x64: implements the 32- and 64-bit bswap instruction, following the pattern set by similar unary instrutions (Neg and Not) - it only operates on a dst register, but is parameterized with both a src and dst which are expected to be the same register. As x64 bswap instruction is only for 32- or 64-bit registers, the 16-bit swap is implemented as a rotate left by 8. Updated x64 RexFlags type to support emitting for single-operand instructions like bswap * aarch64: Bswap gets emitted as aarch64 rev16, rev32, or rev64 instruction as appropriate. * s390x: Bswap was already supported in backend, just had to add a bit of plumbing * For completeness, added bswap to the interpreter as well. * added filetests and runtests for each ISA * added bswap to fuzzgen, thanks to afonso360 for the code there * 128-bit swaps are not yet implemented, that can be done later
This commit is contained in:
@@ -643,6 +643,12 @@ pub(crate) fn define(
|
||||
TypeSetBuilder::new().ints(Interval::All).build(),
|
||||
);
|
||||
|
||||
let iSwappable = &TypeVar::new(
|
||||
"iSwappable",
|
||||
"A multi byte scalar integer type",
|
||||
TypeSetBuilder::new().ints(16..128).build(),
|
||||
);
|
||||
|
||||
let iAddr = &TypeVar::new(
|
||||
"iAddr",
|
||||
"An integer address type",
|
||||
@@ -2699,6 +2705,23 @@ pub(crate) fn define(
|
||||
.operands_out(vec![a]),
|
||||
);
|
||||
|
||||
let x = &Operand::new("x", iSwappable);
|
||||
let a = &Operand::new("a", iSwappable);
|
||||
|
||||
ig.push(
|
||||
Inst::new(
|
||||
"bswap",
|
||||
r#"
|
||||
Reverse the byte order of an integer.
|
||||
|
||||
Reverses the bytes in ``x``.
|
||||
"#,
|
||||
&formats.unary,
|
||||
)
|
||||
.operands_in(vec![x])
|
||||
.operands_out(vec![a]),
|
||||
);
|
||||
|
||||
let x = &Operand::new("x", Int);
|
||||
let a = &Operand::new("a", Int);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user