@@ -193,9 +193,26 @@ void FrameMap::initialize() {
193193 map_register (i, r25); r25_opr = LIR_OprFact::single_cpu (i); i++;
194194 map_register (i, r26); r26_opr = LIR_OprFact::single_cpu (i); i++;
195195
196- map_register (i, r27); r27_opr = LIR_OprFact::single_cpu (i); i++; // rheapbase
196+ // r27 is allocated conditionally. With compressed oops it holds
197+ // the heapbase value and is not visible to the allocator.
198+ bool preserve_rheapbase = i >= nof_caller_save_cpu_regs ();
199+ if (!preserve_rheapbase) {
200+ map_register (i, r27); r27_opr = LIR_OprFact::single_cpu (i); i++; // rheapbase
201+ }
202+
203+ if (!PreserveFramePointer) {
204+ map_register (i, r29); r29_opr = LIR_OprFact::single_cpu (i); i++;
205+ }
206+
207+ // The unallocatable registers are at the end
208+
209+ if (preserve_rheapbase) {
210+ map_register (i, r27); r27_opr = LIR_OprFact::single_cpu (i); i++; // rheapbase
211+ }
197212 map_register (i, r28); r28_opr = LIR_OprFact::single_cpu (i); i++; // rthread
198- map_register (i, r29); r29_opr = LIR_OprFact::single_cpu (i); i++; // rfp
213+ if (PreserveFramePointer) {
214+ map_register (i, r29); r29_opr = LIR_OprFact::single_cpu (i); i++; // rfp
215+ }
199216 map_register (i, r30); r30_opr = LIR_OprFact::single_cpu (i); i++; // lr
200217 map_register (i, r31_sp); sp_opr = LIR_OprFact::single_cpu (i); i++; // sp
201218 map_register (i, r8); r8_opr = LIR_OprFact::single_cpu (i); i++; // rscratch1
@@ -239,6 +256,19 @@ void FrameMap::initialize() {
239256 _caller_save_cpu_regs[16 ] = r18_opr;
240257#endif
241258
259+ _caller_save_cpu_regs[17 R18_RESERVED_ONLY (-1 )] = r19_opr;
260+ _caller_save_cpu_regs[18 R18_RESERVED_ONLY (-1 )] = r20_opr;
261+ _caller_save_cpu_regs[19 R18_RESERVED_ONLY (-1 )] = r21_opr;
262+ _caller_save_cpu_regs[20 R18_RESERVED_ONLY (-1 )] = r22_opr;
263+ _caller_save_cpu_regs[21 R18_RESERVED_ONLY (-1 )] = r23_opr;
264+ _caller_save_cpu_regs[22 R18_RESERVED_ONLY (-1 )] = r24_opr;
265+ _caller_save_cpu_regs[23 R18_RESERVED_ONLY (-1 )] = r25_opr;
266+ _caller_save_cpu_regs[24 R18_RESERVED_ONLY (-1 )] = r26_opr;
267+
268+ if (nof_caller_save_cpu_regs () > 25 R18_RESERVED_ONLY (-1 )) {
269+ _caller_save_cpu_regs[25 R18_RESERVED_ONLY (-1 )] = r27_opr;
270+ }
271+
242272 for (int i = 0 ; i < 8 ; i++) {
243273 _caller_save_fpu_regs[i] = LIR_OprFact::single_fpu (i);
244274 }
0 commit comments