< prev index next >
src/hotspot/cpu/aarch64/register_aarch64.hpp
Print this page
rev 60623 : 8248500: AArch64: Remove the r18 dependency on Windows AArch64
Reviewed-by:
Contributed-by: mbeckwit, luhenry, burban
*** 89,99 ****
CONSTANT_REGISTER_DECLARATION(Register, r13, (13));
CONSTANT_REGISTER_DECLARATION(Register, r14, (14));
CONSTANT_REGISTER_DECLARATION(Register, r15, (15));
CONSTANT_REGISTER_DECLARATION(Register, r16, (16));
CONSTANT_REGISTER_DECLARATION(Register, r17, (17));
! CONSTANT_REGISTER_DECLARATION(Register, r18, (18));
CONSTANT_REGISTER_DECLARATION(Register, r19, (19));
CONSTANT_REGISTER_DECLARATION(Register, r20, (20));
CONSTANT_REGISTER_DECLARATION(Register, r21, (21));
CONSTANT_REGISTER_DECLARATION(Register, r22, (22));
CONSTANT_REGISTER_DECLARATION(Register, r23, (23));
--- 89,110 ----
CONSTANT_REGISTER_DECLARATION(Register, r13, (13));
CONSTANT_REGISTER_DECLARATION(Register, r14, (14));
CONSTANT_REGISTER_DECLARATION(Register, r15, (15));
CONSTANT_REGISTER_DECLARATION(Register, r16, (16));
CONSTANT_REGISTER_DECLARATION(Register, r17, (17));
!
! // In the ABI for Windows+AArch64 the register r18 is used to store the pointer
! // to the current thread's TEB (where TLS variables are stored). We could
! // carefully save and restore r18 at key places, however Win32 Structured
! // Exception Handling (SEH) is using TLS to unwind the stack. If r18 is used
! // for any other purpose at the time of an exception happening, SEH would not
! // be able to unwind the stack properly and most likely crash.
! //
! // It's easier to avoid allocating r18 altogether.
! //
! // See https://docs.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=vs-2019#integer-registers
! CONSTANT_REGISTER_DECLARATION(Register, r18_tls, (18));
CONSTANT_REGISTER_DECLARATION(Register, r19, (19));
CONSTANT_REGISTER_DECLARATION(Register, r20, (20));
CONSTANT_REGISTER_DECLARATION(Register, r21, (21));
CONSTANT_REGISTER_DECLARATION(Register, r22, (22));
CONSTANT_REGISTER_DECLARATION(Register, r23, (23));
*** 205,214 ****
--- 216,227 ----
// added to make it compile
static const int max_gpr;
static const int max_fpr;
};
+ class RegSetIterator;
+
// A set of registers
class RegSet {
uint32_t _bitset;
RegSet(uint32_t bitset) : _bitset(bitset) { }
*** 263,270 ****
--- 276,326 ----
return RegSet(bits);
}
uint32_t bits() const { return _bitset; }
+
+ private:
+
+ Register first() {
+ uint32_t first = _bitset & -_bitset;
+ return first ? as_Register(exact_log2(first)) : noreg;
+ }
+
+ public:
+
+ friend class RegSetIterator;
+
+ RegSetIterator begin();
};
+ class RegSetIterator {
+ RegSet _regs;
+
+ public:
+ RegSetIterator(RegSet x): _regs(x) {}
+ RegSetIterator(const RegSetIterator& mit) : _regs(mit._regs) {}
+
+ RegSetIterator& operator++() {
+ Register r = _regs.first();
+ if (r != noreg)
+ _regs -= r;
+ return *this;
+ }
+
+ bool operator==(const RegSetIterator& rhs) const {
+ return _regs.bits() == rhs._regs.bits();
+ }
+ bool operator!=(const RegSetIterator& rhs) const {
+ return ! (rhs == *this);
+ }
+
+ Register operator*() {
+ return _regs.first();
+ }
+ };
+
+ inline RegSetIterator RegSet::begin() {
+ return RegSetIterator(*this);
+ }
+
#endif // CPU_AARCH64_REGISTER_AARCH64_HPP
< prev index next >