176 }
177 }
178 }
179
180 public class HotSpotFrameContext implements FrameContext {
181
182 final boolean isStub;
183
184 HotSpotFrameContext(boolean isStub) {
185 this.isStub = isStub;
186 }
187
188 @Override
189 public boolean hasFrame() {
190 return true;
191 }
192
193 @Override
194 public void enter(CompilationResultBuilder crb) {
195 final int frameSize = crb.frameMap.totalFrameSize();
196 final int stackpoinerChange = -frameSize;
197 SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm;
198 if (!isStub) {
199 emitStackOverflowCheck(crb);
200 }
201
202 if (SPARCAssembler.isSimm13(stackpoinerChange)) {
203 masm.save(sp, stackpoinerChange, sp);
204 } else {
205 try (ScratchRegister sc = masm.getScratchRegister()) {
206 Register scratch = sc.getRegister();
207 assert isGlobalRegister(scratch) : "Only global registers are allowed before save. Got register " + scratch;
208 masm.setx(stackpoinerChange, scratch, false);
209 masm.save(sp, scratch, sp);
210 }
211 }
212
213 if (ZapStackOnMethodEntry.getValue(crb.getOptions())) {
214 final int slotSize = 8;
215 for (int i = 0; i < frameSize / slotSize; ++i) {
216 // 0xC1C1C1C1
217 masm.stx(g0, new SPARCAddress(sp, i * slotSize));
218 }
219 }
220 }
221
222 @Override
223 public void leave(CompilationResultBuilder crb) {
224 SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm;
225 masm.restoreWindow();
226 }
227 }
228
|
176 }
177 }
178 }
179
180 public class HotSpotFrameContext implements FrameContext {
181
182 final boolean isStub;
183
184 HotSpotFrameContext(boolean isStub) {
185 this.isStub = isStub;
186 }
187
188 @Override
189 public boolean hasFrame() {
190 return true;
191 }
192
193 @Override
194 public void enter(CompilationResultBuilder crb) {
195 final int frameSize = crb.frameMap.totalFrameSize();
196 final int stackpointerChange = -frameSize;
197 SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm;
198 if (!isStub) {
199 emitStackOverflowCheck(crb);
200 }
201
202 if (SPARCAssembler.isSimm13(stackpointerChange)) {
203 masm.save(sp, stackpointerChange, sp);
204 } else {
205 try (ScratchRegister sc = masm.getScratchRegister()) {
206 Register scratch = sc.getRegister();
207 assert isGlobalRegister(scratch) : "Only global registers are allowed before save. Got register " + scratch;
208 masm.setx(stackpointerChange, scratch, false);
209 masm.save(sp, scratch, sp);
210 }
211 }
212
213 if (ZapStackOnMethodEntry.getValue(crb.getOptions())) {
214 final int slotSize = 8;
215 for (int i = 0; i < frameSize / slotSize; ++i) {
216 // 0xC1C1C1C1
217 masm.stx(g0, new SPARCAddress(sp, i * slotSize));
218 }
219 }
220 }
221
222 @Override
223 public void leave(CompilationResultBuilder crb) {
224 SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm;
225 masm.restoreWindow();
226 }
227 }
228
|