10BC0 [loong64][codegen] Avoid memory access under stack pointer · v8/v8@6b1b9bc · GitHub
[go: up one dir, main page]

Skip to content

Commit 6b1b9bc

Browse files
zjiazV8 LUCI CQ
authored andcommitted
[loong64][codegen] Avoid memory access under stack pointer
According to LoongArch ABI doc chapter 8.2: "Procedures must not assume the persistence on-stack data of which the addresses lie below the stack pointer." Change-Id: I92735e052227495ac9884c4290b57eaffbf905e1 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6786372 Auto-Submit: Zhao Jiazhong <zhaojiazhong-hf@loongson.cn> Reviewed-by: Matthias Liedtke <mliedtke@chromium.org> Commit-Queue: Matthias Liedtke <mliedtke@chromium.org> Cr-Commit-Position: refs/heads/main@{#101634}
1 parent 72c6f13 commit 6b1b9bc

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

src/codegen/loong64/macro-assembler-loong64.cc

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,21 +1627,24 @@ void MacroAssembler::LoadIsolateField(Register dst, IsolateFieldId id) {
16271627
}
16281628

16291629
void MacroAssembler::MultiPush(RegList regs) {
1630-
int16_t stack_offset = 0;
1630+
int16_t num_to_push = regs.Count();
1631+
int16_t stack_offset = num_to_push * kSystemPointerSize;
16311632

1633+
Sub_d(sp, sp, Operand(stack_offset));
16321634
for (int16_t i = kNumRegisters - 1; i >= 0; i--) {
16331635
if ((regs.bits() & (1 << i)) != 0) {
16341636
stack_offset -= kSystemPointerSize;
16351637
St_d(ToRegister(i), MemOperand(sp, stack_offset));
16361638
}
16371639
}
1638-
addi_d(sp, sp, stack_offset);
16391640
}
16401641

16411642
void MacroAssembler::MultiPush(RegList regs1, RegList regs2) {
16421643
DCHECK((regs1 & regs2).is_empty());
1643-
int16_t stack_offset = 0;
1644+
int16_t num_to_push = regs1.Count() + regs2.Count();
1645+
int16_t stack_offset = num_to_push * kSystemPointerSize;
16441646

1647+
Sub_d(sp, sp, Operand(stack_offset));
16451648
for (int16_t i = kNumRegisters - 1; i >= 0; i--) {
16461649
if ((regs1.bits() & (1 << i)) != 0) {
16471650
stack_offset -= kSystemPointerSize;
@@ -1654,15 +1657,16 @@ void MacroAssembler::MultiPush(RegList regs1, RegList regs2) {
16541657
St_d(ToRegister(i), MemOperand(sp, stack_offset));
16551658
}
16561659
}
1657-
addi_d(sp, sp, stack_offset);
16581660
}
16591661

16601662
void MacroAssembler::MultiPush(RegList regs1, RegList regs2, RegList regs3) {
16611663
DCHECK((regs1 & regs2).is_empty());
16621664
DCHECK((regs1 & regs3).is_empty());
16631665
DCHECK((regs2 & regs3).is_empty());
1664-
int16_t stack_offset = 0;
1666+
int16_t num_to_push = regs1.Count() + regs2.Count() + regs3.Count();
1667+
int16_t stack_offset = num_to_push * kSystemPointerSize;
16651668

1669+
Sub_d(sp, sp, Operand(stack_offset));
16661670
for (int16_t i = kNumRegisters - 1; i >= 0; i--) {
16671671
if ((regs1.bits() & (1 << i)) != 0) {
16681672
stack_offset -= kSystemPointerSize;
@@ -1681,7 +1685,6 @@ void MacroAssembler::MultiPush(RegList regs1, RegList regs2, RegList regs3) {
16811685
St_d(ToRegister(i), MemOperand(sp, stack_offset));
16821686
}
16831687
}
1684-
addi_d(sp, sp, stack_offset);
16851688
}
16861689

16871690
void MacroAssembler::MultiPop(RegList regs) {
@@ -4171,9 +4174,8 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
41714174

41724175
void MacroAssembler::LeaveFrame(StackFrame::Type type) {
41734176
ASM_CODE_COMMENT(this);
4174-
addi_d(sp, fp, 2 * kSystemPointerSize);
4175-
Ld_d(ra, MemOperand(fp, 1 * kSystemPointerSize));
4176-
Ld_d(fp, MemOperand(fp, 0 * kSystemPointerSize));
4177+
Move(sp, fp);
4178+
Pop(ra, fp);
41774179
}
41784180

41794181
void MacroAssembler::EnterExitFrame(Register scratch, int stack_space,

0 commit comments

Comments
 (0)
0