Squashed 'externals/oaknut/' changes from 72f7ccd94..816481f10

816481f10 oaknut: 1.1.4
a75c1144e cmake: add export rules
ff4d78861 oaknut: CI: Add msvc-arm64 build
d0c317831 oaknut: CI: Pin catch2 version to v3.2.0
caf9cbbdc oaknut: Implement ADRL and MOVP2R pseudo instructions (#2)

git-subtree-dir: externals/oaknut
git-subtree-split: 816481f1036fb4177455ffa0c7b71e6ac9193d6c
This commit is contained in:
Merry 2022-11-26 15:17:46 +00:00
parent cb8abc3ae5
commit b65b07d566
5 changed files with 113 additions and 5 deletions

View file

@ -66,7 +66,7 @@ private:
template<std::size_t bitsize, std::size_t shift_amount>
struct PageOffset {
PageOffset(void* ptr)
PageOffset(const void* ptr)
: m_payload(ptr)
{}
@ -86,7 +86,7 @@ struct PageOffset {
private:
template<typename Policy>
friend class BasicCodeGenerator;
std::variant<Label*, void*> m_payload;
std::variant<Label*, const void*> m_payload;
};
template<std::size_t bitsize, std::size_t alignment>

View file

@ -110,6 +110,12 @@ public:
return RET(XReg{30});
}
void ADRL(XReg xd, const void* addr)
{
ADRP(xd, addr);
ADD(xd, xd, reinterpret_cast<uint64_t>(addr) & 0xFFF);
}
void MOV(WReg wd, uint32_t imm)
{
if (wd.index() == 31)
@ -163,6 +169,18 @@ public:
}
}
// Convenience function for moving pointers to registers
void MOVP2R(XReg xd, const void* addr) {
int64_t diff = reinterpret_cast<uint64_t>(addr) - Policy::current_address();
if (diff >= -0xF'FFFF && diff <= 0xF'FFFF) {
ADR(xd, addr);
} else if (diff >= -int64_t{0xFFFF'FFFF} && diff <= int64_t{0xFFFF'FFFF}) {
ADRL(xd, addr);
} else {
MOV(xd, reinterpret_cast<uint64_t>(addr));
}
}
void align(std::size_t alignment)
{
if (alignment < 4 || (alignment & (alignment - 1)) != 0)
@ -242,7 +260,7 @@ private:
label->m_wbs.emplace_back(Label::Writeback{Policy::current_address(), ~splat, static_cast<Label::EmitFunctionType>(encode_fn)});
return 0u;
},
[&](void* p) {
[&](const void* p) {
return encode_fn(Policy::current_address(), reinterpret_cast<std::uintptr_t>(p));
},
},