refactor(asmjit): remove older asmjit, add new version
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
// This file is part of AsmJit project <https://asmjit.com>
|
||||
//
|
||||
// See asmjit.h or LICENSE.md for license and copyright information
|
||||
// See <asmjit/core.h> or LICENSE.md for license and copyright information
|
||||
// SPDX-License-Identifier: Zlib
|
||||
|
||||
#ifndef ASMJIT_ARM_ARMUTILS_H_INCLUDED
|
||||
#define ASMJIT_ARM_ARMUTILS_H_INCLUDED
|
||||
|
||||
#include "../core/support.h"
|
||||
#include "../arm/armglobals.h"
|
||||
|
||||
ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
||||
@@ -16,6 +17,38 @@ ASMJIT_BEGIN_SUB_NAMESPACE(arm)
|
||||
//! Public utilities and helpers for targeting AArch32 and AArch64 architectures.
|
||||
namespace Utils {
|
||||
|
||||
//! Encodes a 12-bit immediate part of opcode that ise used by a standard 32-bit ARM encoding.
|
||||
[[maybe_unused]]
|
||||
static inline bool encodeAArch32Imm(uint64_t imm, uint32_t* encodedImmOut) noexcept {
|
||||
if (imm & 0xFFFFFFFF00000000u)
|
||||
return false;
|
||||
|
||||
uint32_t v = uint32_t(imm);
|
||||
uint32_t r = 0;
|
||||
|
||||
if (v <= 0xFFu) {
|
||||
*encodedImmOut = v;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Rotate if there are bits on both ends (LSB and MSB)
|
||||
// (otherwise we would not be able to calculate the rotation with ctz).
|
||||
if (v & 0xFF0000FFu) {
|
||||
v = Support::ror(v, 16);
|
||||
r = 16u;
|
||||
}
|
||||
|
||||
uint32_t n = Support::ctz(v) & ~0x1u;
|
||||
r = (r - n) & 0x1Eu;
|
||||
v = Support::ror(v, n);
|
||||
|
||||
if (v > 0xFFu)
|
||||
return false;
|
||||
|
||||
*encodedImmOut = v | (r << 7);
|
||||
return true;
|
||||
}
|
||||
|
||||
//! Decomposed fields of a logical immediate value.
|
||||
struct LogicalImm {
|
||||
uint32_t n;
|
||||
@@ -40,7 +73,7 @@ struct LogicalImm {
|
||||
//! | 0 | 11110s | .....r | 2 |
|
||||
//! +---+--------+--------+------+
|
||||
//! ```
|
||||
ASMJIT_MAYBE_UNUSED
|
||||
[[maybe_unused]]
|
||||
static bool encodeLogicalImm(uint64_t imm, uint32_t width, LogicalImm* out) noexcept {
|
||||
// Determine the element width, which must be 2, 4, 8, 16, 32, or 64 bits.
|
||||
do {
|
||||
@@ -88,12 +121,19 @@ static bool encodeLogicalImm(uint64_t imm, uint32_t width, LogicalImm* out) noex
|
||||
//! Returns true if the given `imm` value is encodable as a logical immediate. The `width` argument describes the
|
||||
//! width of the operation, and must be either 32 or 64. This function can be used to test whether an immediate
|
||||
//! value can be used with AND, ANDS, BIC, BICS, EON, EOR, ORN, and ORR instruction.
|
||||
ASMJIT_MAYBE_UNUSED
|
||||
[[maybe_unused]]
|
||||
static ASMJIT_INLINE_NODEBUG bool isLogicalImm(uint64_t imm, uint32_t width) noexcept {
|
||||
LogicalImm dummy;
|
||||
return encodeLogicalImm(imm, width, &dummy);
|
||||
}
|
||||
|
||||
//! Returns true if the given `imm` value is encodable as an immediate with `add` and `sub` instructions on AArch64.
|
||||
//! These two instructions can encode 12-bit immediate value optionally shifted left by 12 bits.
|
||||
[[maybe_unused]]
|
||||
static ASMJIT_INLINE_NODEBUG bool isAddSubImm(uint64_t imm) noexcept {
|
||||
return imm <= 0xFFFu || (imm & ~uint64_t(0xFFFu << 12)) == 0;
|
||||
}
|
||||
|
||||
//! Returns true if the given `imm` value is a byte mask. Byte mask has each byte part of the value set to either
|
||||
//! 0x00 or 0xFF. Some ARM instructions accept immediates that form a byte-mask and this function can be used to
|
||||
//! verify that the immediate is encodable before using the value.
|
||||
@@ -113,7 +153,7 @@ static ASMJIT_INLINE_NODEBUG uint32_t encodeImm64ByteMaskToImm8(uint64_t imm) no
|
||||
//! \cond
|
||||
//! A generic implementation that checjs whether a floating point value can be converted to ARM Imm8.
|
||||
template<typename T, uint32_t kNumBBits, uint32_t kNumCDEFGHBits, uint32_t kNumZeroBits>
|
||||
static ASMJIT_FORCE_INLINE bool isFPImm8Generic(T val) noexcept {
|
||||
static ASMJIT_INLINE bool isFPImm8Generic(T val) noexcept {
|
||||
constexpr uint32_t kAllBsMask = Support::lsbMask<uint32_t>(kNumBBits);
|
||||
constexpr uint32_t kB0Pattern = Support::bitMask(kNumBBits - 1);
|
||||
constexpr uint32_t kB1Pattern = kAllBsMask ^ kB0Pattern;
|
||||
|
||||
Reference in New Issue
Block a user