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)));
|