< prev index next >

src/cpu/ppc/vm/c1_Runtime1_ppc.cpp

Print this page




 234   __ mtlr(R0);
 235 }
 236 
 237 
 238 void Runtime1::initialize_pd() {
 239   int i;
 240   int sp_offset = frame::abi_reg_args_size;
 241 
 242   for (i = 0; i < FrameMap::nof_cpu_regs; i++) {
 243     Register r = as_Register(i);
 244     if (FrameMap::reg_needs_save(r)) {
 245       cpu_reg_save_offsets[i] = sp_offset;
 246       sp_offset += BytesPerWord;
 247     }
 248   }
 249 
 250   for (i = 0; i < FrameMap::nof_fpu_regs; i++) {
 251     fpu_reg_save_offsets[i] = sp_offset;
 252     sp_offset += BytesPerWord;
 253   }
 254   frame_size_in_bytes = align_size_up(sp_offset, frame::alignment_in_bytes);
 255 }
 256 
 257 
 258 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
 259   // Make a frame and preserve the caller's caller-save registers.
 260   OopMap* oop_map = save_live_registers(sasm);
 261 
 262   int call_offset;
 263   if (!has_argument) {
 264     call_offset = __ call_RT(noreg, noreg, target);
 265   } else {
 266     call_offset = __ call_RT(noreg, noreg, target, R4_ARG2);
 267   }
 268   OopMapSet* oop_maps = new OopMapSet();
 269   oop_maps->add_gc_map(call_offset, oop_map);
 270 
 271   __ should_not_reach_here();
 272   return oop_maps;
 273 }
 274 
 275 static OopMapSet* generate_exception_throw_with_stack_parms(StubAssembler* sasm, address target,
 276                                                             int stack_parms) {
 277   // Make a frame and preserve the caller's caller-save registers.
 278   const int parm_size_in_bytes = align_size_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
 279   const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
 280   OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
 281 
 282   int call_offset = 0;
 283   switch (stack_parms) {
 284     case 3:
 285     __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
 286     case 2:
 287     __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
 288     case 1:
 289     __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
 290     call_offset = __ call_RT(noreg, noreg, target);
 291     break;
 292     default: Unimplemented(); break;
 293   }
 294   OopMapSet* oop_maps = new OopMapSet();
 295   oop_maps->add_gc_map(call_offset, oop_map);
 296 
 297   __ should_not_reach_here();
 298   return oop_maps;


 308   if (arg1 == noreg) {
 309     call_offset = __ call_RT(result, noreg, target);
 310   } else if (arg2 == noreg) {
 311     call_offset = __ call_RT(result, noreg, target, arg1);
 312   } else if (arg3 == noreg) {
 313     call_offset = __ call_RT(result, noreg, target, arg1, arg2);
 314   } else {
 315     call_offset = __ call_RT(result, noreg, target, arg1, arg2, arg3);
 316   }
 317   OopMapSet* oop_maps = new OopMapSet();
 318   oop_maps->add_gc_map(call_offset, oop_map);
 319 
 320   restore_live_registers(sasm, result, noreg);
 321   __ blr();
 322   return oop_maps;
 323 }
 324 
 325 static OopMapSet* stub_call_with_stack_parms(StubAssembler* sasm, Register result, address target,
 326                                              int stack_parms, bool do_return = true) {
 327   // Make a frame and preserve the caller's caller-save registers.
 328   const int parm_size_in_bytes = align_size_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
 329   const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
 330   OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
 331 
 332   int call_offset = 0;
 333   switch (stack_parms) {
 334     case 3:
 335     __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
 336     case 2:
 337     __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
 338     case 1:
 339     __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
 340     call_offset = __ call_RT(result, noreg, target);
 341     break;
 342     default: Unimplemented(); break;
 343   }
 344   OopMapSet* oop_maps = new OopMapSet();
 345   oop_maps->add_gc_map(call_offset, oop_map);
 346 
 347   restore_live_registers(sasm, result, noreg);
 348   if (do_return) __ blr();




 234   __ mtlr(R0);
 235 }
 236 
 237 
 238 void Runtime1::initialize_pd() {
 239   int i;
 240   int sp_offset = frame::abi_reg_args_size;
 241 
 242   for (i = 0; i < FrameMap::nof_cpu_regs; i++) {
 243     Register r = as_Register(i);
 244     if (FrameMap::reg_needs_save(r)) {
 245       cpu_reg_save_offsets[i] = sp_offset;
 246       sp_offset += BytesPerWord;
 247     }
 248   }
 249 
 250   for (i = 0; i < FrameMap::nof_fpu_regs; i++) {
 251     fpu_reg_save_offsets[i] = sp_offset;
 252     sp_offset += BytesPerWord;
 253   }
 254   frame_size_in_bytes = align_up(sp_offset, frame::alignment_in_bytes);
 255 }
 256 
 257 
 258 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
 259   // Make a frame and preserve the caller's caller-save registers.
 260   OopMap* oop_map = save_live_registers(sasm);
 261 
 262   int call_offset;
 263   if (!has_argument) {
 264     call_offset = __ call_RT(noreg, noreg, target);
 265   } else {
 266     call_offset = __ call_RT(noreg, noreg, target, R4_ARG2);
 267   }
 268   OopMapSet* oop_maps = new OopMapSet();
 269   oop_maps->add_gc_map(call_offset, oop_map);
 270 
 271   __ should_not_reach_here();
 272   return oop_maps;
 273 }
 274 
 275 static OopMapSet* generate_exception_throw_with_stack_parms(StubAssembler* sasm, address target,
 276                                                             int stack_parms) {
 277   // Make a frame and preserve the caller's caller-save registers.
 278   const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
 279   const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
 280   OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
 281 
 282   int call_offset = 0;
 283   switch (stack_parms) {
 284     case 3:
 285     __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
 286     case 2:
 287     __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
 288     case 1:
 289     __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
 290     call_offset = __ call_RT(noreg, noreg, target);
 291     break;
 292     default: Unimplemented(); break;
 293   }
 294   OopMapSet* oop_maps = new OopMapSet();
 295   oop_maps->add_gc_map(call_offset, oop_map);
 296 
 297   __ should_not_reach_here();
 298   return oop_maps;


 308   if (arg1 == noreg) {
 309     call_offset = __ call_RT(result, noreg, target);
 310   } else if (arg2 == noreg) {
 311     call_offset = __ call_RT(result, noreg, target, arg1);
 312   } else if (arg3 == noreg) {
 313     call_offset = __ call_RT(result, noreg, target, arg1, arg2);
 314   } else {
 315     call_offset = __ call_RT(result, noreg, target, arg1, arg2, arg3);
 316   }
 317   OopMapSet* oop_maps = new OopMapSet();
 318   oop_maps->add_gc_map(call_offset, oop_map);
 319 
 320   restore_live_registers(sasm, result, noreg);
 321   __ blr();
 322   return oop_maps;
 323 }
 324 
 325 static OopMapSet* stub_call_with_stack_parms(StubAssembler* sasm, Register result, address target,
 326                                              int stack_parms, bool do_return = true) {
 327   // Make a frame and preserve the caller's caller-save registers.
 328   const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
 329   const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
 330   OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
 331 
 332   int call_offset = 0;
 333   switch (stack_parms) {
 334     case 3:
 335     __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
 336     case 2:
 337     __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
 338     case 1:
 339     __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
 340     call_offset = __ call_RT(result, noreg, target);
 341     break;
 342     default: Unimplemented(); break;
 343   }
 344   OopMapSet* oop_maps = new OopMapSet();
 345   oop_maps->add_gc_map(call_offset, oop_map);
 346 
 347   restore_live_registers(sasm, result, noreg);
 348   if (do_return) __ blr();


< prev index next >