@@ -15617,7 +15617,7 @@ void Assembler::precompute_instructions() {
15617
15617
ResourceMark rm;
15618
15618
15619
15619
// Make a temporary buffer big enough for the routines we're capturing
15620
- int size = UseAPX ? 1024 : 256;
15620
+ int size = UseAPX ? 512 : 256;
15621
15621
char* tmp_code = NEW_RESOURCE_ARRAY(char, size);
15622
15622
CodeBuffer buffer((address)tmp_code, size);
15623
15623
MacroAssembler masm(&buffer);
@@ -15672,41 +15672,34 @@ void Assembler::pusha() { // 64bit
15672
15672
// The slot for rsp just contains an arbitrary value.
15673
15673
void Assembler::pusha_uncached() { // 64bit
15674
15674
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);
15710
15703
} else {
15711
15704
subq(rsp, 16 * wordSize);
15712
15705
movq(Address(rsp, 15 * wordSize), rax);
@@ -15738,40 +15731,28 @@ void Assembler::popa() { // 64bit
15738
15731
15739
15732
void Assembler::popa_uncached() { // 64bit
15740
15733
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);
15775
15756
} else {
15776
15757
movq(r15, Address(rsp, 0));
15777
15758
movq(r14, Address(rsp, wordSize));
0 commit comments