< prev index next >
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
Print this page
rev 61943 : 8248048: ZGC: AArch64: SIGILL in load barrier register spilling
Reviewed-by: adinn, aph
*** 2131,2168 ****
for (int reg = 0; reg <= 31; reg++) {
if (1 & bitset)
regs[count++] = reg;
bitset >>= 1;
}
!
! if (count == 0) {
! return 0;
! }
!
! if (count == 1) {
! strq(as_FloatRegister(regs[0]), Address(pre(stack, -wordSize * 2)));
! return 1;
! }
!
! bool odd = (count & 1) == 1;
! int push_slots = count + (odd ? 1 : 0);
// Always pushing full 128 bit registers.
! stpq(as_FloatRegister(regs[0]), as_FloatRegister(regs[1]), Address(pre(stack, -push_slots * wordSize * 2)));
words_pushed += 2;
!
! for (int i = 2; i + 1 < count; i += 2) {
stpq(as_FloatRegister(regs[i]), as_FloatRegister(regs[i+1]), Address(stack, i * wordSize * 2));
words_pushed += 2;
}
! if (odd) {
! strq(as_FloatRegister(regs[count - 1]), Address(stack, (count - 1) * wordSize * 2));
! words_pushed++;
! }
!
! assert(words_pushed == count, "oops, pushed(%d) != count(%d)", words_pushed, count);
return count;
}
int MacroAssembler::pop_fp(unsigned int bitset, Register stack) {
int words_pushed = 0;
--- 2131,2154 ----
for (int reg = 0; reg <= 31; reg++) {
if (1 & bitset)
regs[count++] = reg;
bitset >>= 1;
}
! regs[count++] = zr->encoding_nocheck();
! count &= ~1; // Only push an even number of regs
// Always pushing full 128 bit registers.
! if (count) {
! stpq(as_FloatRegister(regs[0]), as_FloatRegister(regs[1]), Address(pre(stack, -count * wordSize * 2)));
words_pushed += 2;
! }
! for (int i = 2; i < count; i += 2) {
stpq(as_FloatRegister(regs[i]), as_FloatRegister(regs[i+1]), Address(stack, i * wordSize * 2));
words_pushed += 2;
}
! assert(words_pushed == count, "oops, pushed != count");
return count;
}
int MacroAssembler::pop_fp(unsigned int bitset, Register stack) {
int words_pushed = 0;
*** 2173,2209 ****
for (int reg = 0; reg <= 31; reg++) {
if (1 & bitset)
regs[count++] = reg;
bitset >>= 1;
}
! if (count == 0) {
! return 0;
! }
!
! if (count == 1) {
! ldrq(as_FloatRegister(regs[0]), Address(post(stack, wordSize * 2)));
! return 1;
! }
!
! bool odd = (count & 1) == 1;
! int push_slots = count + (odd ? 1 : 0);
!
! if (odd) {
! ldrq(as_FloatRegister(regs[count - 1]), Address(stack, (count - 1) * wordSize * 2));
! words_pushed++;
! }
!
! for (int i = 2; i + 1 < count; i += 2) {
ldpq(as_FloatRegister(regs[i]), as_FloatRegister(regs[i+1]), Address(stack, i * wordSize * 2));
words_pushed += 2;
}
!
! ldpq(as_FloatRegister(regs[0]), as_FloatRegister(regs[1]), Address(post(stack, push_slots * wordSize * 2)));
words_pushed += 2;
! assert(words_pushed == count, "oops, pushed(%d) != count(%d)", words_pushed, count);
return count;
}
#ifdef ASSERT
--- 2159,2181 ----
for (int reg = 0; reg <= 31; reg++) {
if (1 & bitset)
regs[count++] = reg;
bitset >>= 1;
}
+ regs[count++] = zr->encoding_nocheck();
+ count &= ~1;
! for (int i = 2; i < count; i += 2) {
ldpq(as_FloatRegister(regs[i]), as_FloatRegister(regs[i+1]), Address(stack, i * wordSize * 2));
words_pushed += 2;
}
! if (count) {
! ldpq(as_FloatRegister(regs[0]), as_FloatRegister(regs[1]), Address(post(stack, count * wordSize * 2)));
words_pushed += 2;
+ }
! assert(words_pushed == count, "oops, pushed != count");
return count;
}
#ifdef ASSERT
< prev index next >