79 public class AMD64FrameMap extends FrameMap { |
79 public class AMD64FrameMap extends FrameMap { |
80 |
80 |
81 private StackSlot rbpSpillSlot; |
81 private StackSlot rbpSpillSlot; |
82 |
82 |
83 public AMD64FrameMap(CodeCacheProvider codeCache, RegisterConfig registerConfig, ReferenceMapBuilderFactory referenceMapFactory) { |
83 public AMD64FrameMap(CodeCacheProvider codeCache, RegisterConfig registerConfig, ReferenceMapBuilderFactory referenceMapFactory) { |
|
84 this(codeCache, registerConfig, referenceMapFactory, false); |
|
85 } |
|
86 |
|
87 public AMD64FrameMap(CodeCacheProvider codeCache, RegisterConfig registerConfig, ReferenceMapBuilderFactory referenceMapFactory, boolean useBasePointer) { |
84 super(codeCache, registerConfig, referenceMapFactory); |
88 super(codeCache, registerConfig, referenceMapFactory); |
85 // (negative) offset relative to sp + total frame size |
89 // (negative) offset relative to sp + total frame size |
86 initialSpillSize = returnAddressSize(); |
90 initialSpillSize = returnAddressSize() + (useBasePointer ? getTarget().arch.getWordSize() : 0); |
87 spillSize = initialSpillSize; |
91 spillSize = initialSpillSize; |
88 } |
92 } |
89 |
93 |
90 @Override |
94 @Override |
91 public int totalFrameSize() { |
95 public int totalFrameSize() { |
92 return frameSize() + returnAddressSize(); |
96 int result = frameSize() + initialSpillSize; |
|
97 assert result % getTarget().stackAlignment == 0 : "Total frame size not aligned: " + result; |
|
98 return result; |
93 } |
99 } |
94 |
100 |
95 @Override |
101 @Override |
96 public int currentFrameSize() { |
102 public int currentFrameSize() { |
97 return alignFrameSize(outgoingSize + spillSize - returnAddressSize()); |
103 return alignFrameSize(outgoingSize + spillSize - initialSpillSize); |
98 } |
104 } |
99 |
105 |
100 @Override |
106 @Override |
101 protected int alignFrameSize(int size) { |
107 protected int alignFrameSize(int size) { |
102 return NumUtil.roundUp(size + returnAddressSize(), getTarget().stackAlignment) - returnAddressSize(); |
108 return NumUtil.roundUp(size + initialSpillSize, getTarget().stackAlignment) - initialSpillSize; |
103 } |
109 } |
104 |
110 |
105 @Override |
111 @Override |
106 public int offsetForStackSlot(StackSlot slot) { |
112 public int offsetForStackSlot(StackSlot slot) { |
107 // @formatter:off |
113 // @formatter:off |