< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Print this page
rev 53399 : Redo: Avoid stub when calling to write-barrier from C2, remove all related code


2571   // printf("start = %lx\n", start);
2572   int byteCount =  aarch64_stub_prolog_size();
2573   // printf("byteCount = %x\n", byteCount);
2574   int instructionCount = (byteCount + 3)/ 4;
2575   // printf("instructionCount = %x\n", instructionCount);
2576   for (int i = 0; i < instructionCount; i++) {
2577     nop();
2578   }
2579 
2580   memcpy(start, (void*)aarch64_stub_prolog, byteCount);
2581 
2582   // write the address of the setup routine and the call format at the
2583   // end of into the copied code
2584   u_int64_t *patch_end = (u_int64_t *)(start + byteCount);
2585   if (prolog_ptr)
2586     patch_end[-2] = (u_int64_t)prolog_ptr;
2587   patch_end[-1] = calltype;
2588 }
2589 #endif
2590 
2591 void MacroAssembler::push_call_clobbered_fp_registers() {
2592   int step = 4 * wordSize;

2593   sub(sp, sp, step);
2594   mov(rscratch1, -step);
2595   // Push v0-v7, v16-v31.
2596   for (int i = 31; i>= 4; i -= 4) {
2597     if (i <= v7->encoding() || i >= v16->encoding())
2598       st1(as_FloatRegister(i-3), as_FloatRegister(i-2), as_FloatRegister(i-1),
2599           as_FloatRegister(i), T1D, Address(post(sp, rscratch1)));
2600   }
2601   st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2),
2602       as_FloatRegister(3), T1D, Address(sp));
2603 }
2604 
2605 void MacroAssembler::pop_call_clobbered_fp_registers() {
2606   for (int i = 0; i < 32; i += 4) {
2607     if (i <= v7->encoding() || i >= v16->encoding())
2608       ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
2609           as_FloatRegister(i+3), T1D, Address(post(sp, 4 * wordSize)));
2610   }
2611 }
2612 
2613 void MacroAssembler::push_call_clobbered_registers() {
2614   push(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2), sp);
2615   push_call_clobbered_fp_registers();
2616 }
2617 
2618 void MacroAssembler::pop_call_clobbered_registers() {
2619   pop_call_clobbered_fp_registers();
2620   pop(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2), sp);
2621 }
2622 
2623 void MacroAssembler::push_CPU_state(bool save_vectors) {
2624   int step = (save_vectors ? 8 : 4) * wordSize;
2625   push(0x3fffffff, sp);         // integer registers except lr & sp
2626   mov(rscratch1, -step);
2627   sub(sp, sp, step);
2628   for (int i = 28; i >= 4; i -= 4) {
2629     st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
2630         as_FloatRegister(i+3), save_vectors ? T2D : T1D, Address(post(sp, rscratch1)));
2631   }
2632   st1(v0, v1, v2, v3, save_vectors ? T2D : T1D, sp);
2633 }
2634 
2635 void MacroAssembler::pop_CPU_state(bool restore_vectors) {
2636   int step = (restore_vectors ? 8 : 4) * wordSize;
2637   for (int i = 0; i <= 28; i += 4)
2638     ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
2639         as_FloatRegister(i+3), restore_vectors ? T2D : T1D, Address(post(sp, step)));




2571   // printf("start = %lx\n", start);
2572   int byteCount =  aarch64_stub_prolog_size();
2573   // printf("byteCount = %x\n", byteCount);
2574   int instructionCount = (byteCount + 3)/ 4;
2575   // printf("instructionCount = %x\n", instructionCount);
2576   for (int i = 0; i < instructionCount; i++) {
2577     nop();
2578   }
2579 
2580   memcpy(start, (void*)aarch64_stub_prolog, byteCount);
2581 
2582   // write the address of the setup routine and the call format at the
2583   // end of into the copied code
2584   u_int64_t *patch_end = (u_int64_t *)(start + byteCount);
2585   if (prolog_ptr)
2586     patch_end[-2] = (u_int64_t)prolog_ptr;
2587   patch_end[-1] = calltype;
2588 }
2589 #endif
2590 
2591 void MacroAssembler::push_call_clobbered_registers() {
2592   int step = 4 * wordSize;
2593   push(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2), sp);
2594   sub(sp, sp, step);
2595   mov(rscratch1, -step);
2596   // Push v0-v7, v16-v31.
2597   for (int i = 31; i>= 4; i -= 4) {
2598     if (i <= v7->encoding() || i >= v16->encoding())
2599       st1(as_FloatRegister(i-3), as_FloatRegister(i-2), as_FloatRegister(i-1),
2600           as_FloatRegister(i), T1D, Address(post(sp, rscratch1)));
2601   }
2602   st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2),
2603       as_FloatRegister(3), T1D, Address(sp));
2604 }
2605 
2606 void MacroAssembler::pop_call_clobbered_registers() {
2607   for (int i = 0; i < 32; i += 4) {
2608     if (i <= v7->encoding() || i >= v16->encoding())
2609       ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
2610           as_FloatRegister(i+3), T1D, Address(post(sp, 4 * wordSize)));
2611   }

2612 







2613   pop(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2), sp);
2614 }
2615 
2616 void MacroAssembler::push_CPU_state(bool save_vectors) {
2617   int step = (save_vectors ? 8 : 4) * wordSize;
2618   push(0x3fffffff, sp);         // integer registers except lr & sp
2619   mov(rscratch1, -step);
2620   sub(sp, sp, step);
2621   for (int i = 28; i >= 4; i -= 4) {
2622     st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
2623         as_FloatRegister(i+3), save_vectors ? T2D : T1D, Address(post(sp, rscratch1)));
2624   }
2625   st1(v0, v1, v2, v3, save_vectors ? T2D : T1D, sp);
2626 }
2627 
2628 void MacroAssembler::pop_CPU_state(bool restore_vectors) {
2629   int step = (restore_vectors ? 8 : 4) * wordSize;
2630   for (int i = 0; i <= 28; i += 4)
2631     ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
2632         as_FloatRegister(i+3), restore_vectors ? T2D : T1D, Address(post(sp, step)));


< prev index next >