Skip to content

Commit de7c373

Browse files
committed
restore the orginal contents of rax
1 parent 2dba6e3 commit de7c373

File tree

1 file changed

+51
-70
lines changed

1 file changed

+51
-70
lines changed

src/hotspot/cpu/x86/assembler_x86.cpp

Lines changed: 51 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -15617,7 +15617,7 @@ void Assembler::precompute_instructions() {
1561715617
ResourceMark rm;
1561815618

1561915619
// Make a temporary buffer big enough for the routines we're capturing
15620-
int size = UseAPX ? 1024 : 256;
15620+
int size = UseAPX ? 512 : 256;
1562115621
char* tmp_code = NEW_RESOURCE_ARRAY(char, size);
1562215622
CodeBuffer buffer((address)tmp_code, size);
1562315623
MacroAssembler masm(&buffer);
@@ -15672,41 +15672,34 @@ void Assembler::pusha() { // 64bit
1567215672
// The slot for rsp just contains an arbitrary value.
1567315673
void Assembler::pusha_uncached() { // 64bit
1567415674
if (UseAPX) {
15675-
subq(rsp, 32 * wordSize);
15676-
movq(Address(rsp, 31 * wordSize), rax);
15677-
movq(Address(rsp, 30 * wordSize), rcx);
15678-
movq(Address(rsp, 29 * wordSize), rdx);
15679-
movq(Address(rsp, 28 * wordSize), rbx);
15680-
// Skip rsp as the value is normally not used. There are a few places where
15681-
// the original value of rsp needs to be known but that can be computed
15682-
// from the value of rsp immediately after pusha (rsp + 32 * wordSize).
15683-
movq(Address(rsp, 26 * wordSize), rbp);
15684-
movq(Address(rsp, 25 * wordSize), rsi);
15685-
movq(Address(rsp, 24 * wordSize), rdi);
15686-
movq(Address(rsp, 23 * wordSize), r8);
15687-
movq(Address(rsp, 22 * wordSize), r9);
15688-
movq(Address(rsp, 21 * wordSize), r10);
15689-
movq(Address(rsp, 20 * wordSize), r11);
15690-
movq(Address(rsp, 19 * wordSize), r12);
15691-
movq(Address(rsp, 18 * wordSize), r13);
15692-
movq(Address(rsp, 17 * wordSize), r14);
15693-
movq(Address(rsp, 16 * wordSize), r15);
15694-
movq(Address(rsp, 15 * wordSize), r16);
15695-
movq(Address(rsp, 14 * wordSize), r17);
15696-
movq(Address(rsp, 13 * wordSize), r18);
15697-
movq(Address(rsp, 12 * wordSize), r19);
15698-
movq(Address(rsp, 11 * wordSize), r20);
15699-
movq(Address(rsp, 10 * wordSize), r21);
15700-
movq(Address(rsp, 9 * wordSize), r22);
15701-
movq(Address(rsp, 8 * wordSize), r23);
15702-
movq(Address(rsp, 7 * wordSize), r24);
15703-
movq(Address(rsp, 6 * wordSize), r25);
15704-
movq(Address(rsp, 5 * wordSize), r26);
15705-
movq(Address(rsp, 4 * wordSize), r27);
15706-
movq(Address(rsp, 3 * wordSize), r28);
15707-
movq(Address(rsp, 2 * wordSize), r29);
15708-
movq(Address(rsp, wordSize), r30);
15709-
movq(Address(rsp, 0), r31);
15675+
// Data being pushed by PUSH2 must be 16B-aligned on the stack, for this push rax upfront
15676+
// and use it as a temporary register for stack alignment.
15677+
pushp(rax);
15678+
// Move original stack pointer to RAX and align stack pointer to 16B boundary.
15679+
movq(rax, rsp);
15680+
andq(rsp, -(StackAlignmentInBytes));
15681+
// Push pair of original stack pointer along with remaining registers
15682+
// at 16B aligned boundary.
15683+
push2p(rax, r31);
15684+
// Restore the original contents of RAX register.
15685+
movq(rax, Address(rax));
15686+
push2p(r30, r29);
15687+
push2p(r28, r27);
15688+
push2p(r26, r25);
15689+
push2p(r24, r23);
15690+
push2p(r22, r21);
15691+
push2p(r20, r19);
15692+
push2p(r18, r17);
15693+
push2p(r16, r15);
15694+
push2p(r14, r13);
15695+
push2p(r12, r11);
15696+
push2p(r10, r9);
15697+
push2p(r8, rdi);
15698+
push2p(rsi, rbp);
15699+
push2p(rbx, rdx);
15700+
// To maintain 16 byte alignment after rcx is pushed.
15701+
subq(rsp, 8);
15702+
pushp(rcx);
1571015703
} else {
1571115704
subq(rsp, 16 * wordSize);
1571215705
movq(Address(rsp, 15 * wordSize), rax);
@@ -15738,40 +15731,28 @@ void Assembler::popa() { // 64bit
1573815731

1573915732
void Assembler::popa_uncached() { // 64bit
1574015733
if (UseAPX) {
15741-
movq(r31, Address(rsp, 0));
15742-
movq(r30, Address(rsp, wordSize));
15743-
movq(r29, Address(rsp, 2 * wordSize));
15744-
movq(r28, Address(rsp, 3 * wordSize));
15745-
movq(r27, Address(rsp, 4 * wordSize));
15746-
movq(r26, Address(rsp, 5 * wordSize));
15747-
movq(r25, Address(rsp, 6 * wordSize));
15748-
movq(r24, Address(rsp, 7 * wordSize));
15749-
movq(r23, Address(rsp, 8 * wordSize));
15750-
movq(r22, Address(rsp, 9 * wordSize));
15751-
movq(r21, Address(rsp, 10 * wordSize));
15752-
movq(r20, Address(rsp, 11 * wordSize));
15753-
movq(r19, Address(rsp, 12 * wordSize));
15754-
movq(r18, Address(rsp, 13 * wordSize));
15755-
movq(r17, Address(rsp, 14 * wordSize));
15756-
movq(r16, Address(rsp, 15 * wordSize));
15757-
movq(r15, Address(rsp, 16 * wordSize));
15758-
movq(r14, Address(rsp, 17 * wordSize));
15759-
movq(r13, Address(rsp, 18 * wordSize));
15760-
movq(r12, Address(rsp, 19 * wordSize));
15761-
movq(r11, Address(rsp, 20 * wordSize));
15762-
movq(r10, Address(rsp, 21 * wordSize));
15763-
movq(r9, Address(rsp, 22 * wordSize));
15764-
movq(r8, Address(rsp, 23 * wordSize));
15765-
movq(rdi, Address(rsp, 24 * wordSize));
15766-
movq(rsi, Address(rsp, 25 * wordSize));
15767-
movq(rbp, Address(rsp, 26 * wordSize));
15768-
// Skip rsp as it is restored automatically to the value
15769-
// before the corresponding pusha when popa is done.
15770-
movq(rbx, Address(rsp, 28 * wordSize));
15771-
movq(rdx, Address(rsp, 29 * wordSize));
15772-
movq(rcx, Address(rsp, 30 * wordSize));
15773-
movq(rax, Address(rsp, 31 * wordSize));
15774-
addq(rsp, 32 * wordSize);
15734+
popp(rcx);
15735+
addq(rsp, 8);
15736+
// Data being popped by POP2 must be 16B-aligned on the stack.
15737+
pop2p(rdx, rbx);
15738+
pop2p(rbp, rsi);
15739+
pop2p(rdi, r8);
15740+
pop2p(r9, r10);
15741+
pop2p(r11, r12);
15742+
pop2p(r13, r14);
15743+
pop2p(r15, r16);
15744+
pop2p(r17, r18);
15745+
pop2p(r19, r20);
15746+
pop2p(r21, r22);
15747+
pop2p(r23, r24);
15748+
pop2p(r25, r26);
15749+
pop2p(r27, r28);
15750+
pop2p(r29, r30);
15751+
// Popped value in RAX holds original unaligned stack pointer.
15752+
pop2p(r31, rax);
15753+
// Reinstantiate original stack pointer.
15754+
movq(rsp, rax);
15755+
popp(rax);
1577515756
} else {
1577615757
movq(r15, Address(rsp, 0));
1577715758
movq(r14, Address(rsp, wordSize));

0 commit comments

Comments
 (0)