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:
@@ -151,6 +151,11 @@
|
||||
(Setcc (cc CC)
|
||||
(dst WritableGpr))
|
||||
|
||||
;; Swaps byte order in register
|
||||
(Bswap (size OperandSize) ;; 4 or 8
|
||||
(src Gpr)
|
||||
(dst WritableGpr))
|
||||
|
||||
;; =========================================
|
||||
;; Conditional moves.
|
||||
|
||||
@@ -1959,6 +1964,16 @@
|
||||
(rule (x64_sar ty src1 src2)
|
||||
(shift_r ty (ShiftKind.ShiftRightArithmetic) src1 src2))
|
||||
|
||||
;; Helper for creating byteswap instructions.
|
||||
;; In x64, 32- and 64-bit registers use BSWAP instruction, and
|
||||
;; for 16-bit registers one must instead use xchg or rol/ror
|
||||
(decl x64_bswap (Type Gpr) Gpr)
|
||||
(rule (x64_bswap ty src)
|
||||
(let ((dst WritableGpr (temp_writable_gpr))
|
||||
(size OperandSize (operand_size_of_type_32_64 ty))
|
||||
(_ Unit (emit (MInst.Bswap size src dst))))
|
||||
dst))
|
||||
|
||||
;; Helper for creating `MInst.CmpRmiR` instructions.
|
||||
(decl cmp_rmi_r (OperandSize CmpOpcode GprMemImm Gpr) ProducesFlags)
|
||||
(rule (cmp_rmi_r size opcode src1 src2)
|
||||
|
||||
Reference in New Issue
Block a user