2744 __ ldmia(SP, RegisterSet(r1) | RegisterSet(r2) | RegisterSet(r3) | RegisterSet(r4), no_writeback);
2745 #endif // AARCH64
2746 }
2747
2748
2749 void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
2750 ciArrayKlass* default_type = op->expected_type();
2751 Register src = op->src()->as_register();
2752 Register src_pos = op->src_pos()->as_register();
2753 Register dst = op->dst()->as_register();
2754 Register dst_pos = op->dst_pos()->as_register();
2755 Register length = op->length()->as_register();
2756 Register tmp = op->tmp()->as_register();
2757 Register tmp2 = Rtemp;
2758
2759 assert(src == R0 && src_pos == R1 && dst == R2 && dst_pos == R3, "code assumption");
2760 #ifdef AARCH64
2761 assert(length == R4, "code assumption");
2762 #endif // AARCH64
2763
2764 CodeStub* stub = op->stub();
2765
2766 int flags = op->flags();
2767 BasicType basic_type = default_type != NULL ? default_type->element_type()->basic_type() : T_ILLEGAL;
2768 if (basic_type == T_ARRAY) basic_type = T_OBJECT;
2769
2770 // If we don't know anything or it's an object array, just go through the generic arraycopy
2771 if (default_type == NULL) {
2772
2773 // save arguments, because they will be killed by a runtime call
2774 save_in_reserved_area(R0, R1, R2, R3);
2775
2776 #ifdef AARCH64
2777 // save length argument, will be killed by a runtime call
2778 __ raw_push(length, ZR);
2779 #else
2780 // pass length argument on SP[0]
2781 __ str(length, Address(SP, -2*wordSize, pre_indexed)); // 2 words for a proper stack alignment
2782 #endif // AARCH64
2783
3109 __ bind(ok);
3110 #endif // AARCH64
3111 }
3112 #endif // ASSERT
3113
3114 void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) {
3115 fatal("CRC32 intrinsic is not implemented on this platform");
3116 }
3117
3118 void LIR_Assembler::emit_lock(LIR_OpLock* op) {
3119 Register obj = op->obj_opr()->as_pointer_register();
3120 Register hdr = op->hdr_opr()->as_pointer_register();
3121 Register lock = op->lock_opr()->as_pointer_register();
3122 Register tmp = op->scratch_opr()->is_illegal() ? noreg :
3123 op->scratch_opr()->as_pointer_register();
3124
3125 if (!UseFastLocking) {
3126 __ b(*op->stub()->entry());
3127 } else if (op->code() == lir_lock) {
3128 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
3129 int null_check_offset = __ lock_object(hdr, obj, lock, tmp, *op->stub()->entry());
3130 if (op->info() != NULL) {
3131 add_debug_info_for_null_check(null_check_offset, op->info());
3132 }
3133 } else if (op->code() == lir_unlock) {
3134 __ unlock_object(hdr, obj, lock, tmp, *op->stub()->entry());
3135 } else {
3136 ShouldNotReachHere();
3137 }
3138 __ bind(*op->stub()->continuation());
3139 }
3140
3141
3142 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
3143 ciMethod* method = op->profiled_method();
3144 int bci = op->profiled_bci();
3145 ciMethod* callee = op->profiled_callee();
3146
3147 // Update counter for all call types
3148 ciMethodData* md = method->method_data_or_null();
|
2744 __ ldmia(SP, RegisterSet(r1) | RegisterSet(r2) | RegisterSet(r3) | RegisterSet(r4), no_writeback);
2745 #endif // AARCH64
2746 }
2747
2748
2749 void LIR_Assembler::emit_arraycopy(LIR_OpArrayCopy* op) {
2750 ciArrayKlass* default_type = op->expected_type();
2751 Register src = op->src()->as_register();
2752 Register src_pos = op->src_pos()->as_register();
2753 Register dst = op->dst()->as_register();
2754 Register dst_pos = op->dst_pos()->as_register();
2755 Register length = op->length()->as_register();
2756 Register tmp = op->tmp()->as_register();
2757 Register tmp2 = Rtemp;
2758
2759 assert(src == R0 && src_pos == R1 && dst == R2 && dst_pos == R3, "code assumption");
2760 #ifdef AARCH64
2761 assert(length == R4, "code assumption");
2762 #endif // AARCH64
2763
2764 __ resolve(ACCESS_READ, src);
2765 __ resolve(ACCESS_WRITE, dst);
2766
2767 CodeStub* stub = op->stub();
2768
2769 int flags = op->flags();
2770 BasicType basic_type = default_type != NULL ? default_type->element_type()->basic_type() : T_ILLEGAL;
2771 if (basic_type == T_ARRAY) basic_type = T_OBJECT;
2772
2773 // If we don't know anything or it's an object array, just go through the generic arraycopy
2774 if (default_type == NULL) {
2775
2776 // save arguments, because they will be killed by a runtime call
2777 save_in_reserved_area(R0, R1, R2, R3);
2778
2779 #ifdef AARCH64
2780 // save length argument, will be killed by a runtime call
2781 __ raw_push(length, ZR);
2782 #else
2783 // pass length argument on SP[0]
2784 __ str(length, Address(SP, -2*wordSize, pre_indexed)); // 2 words for a proper stack alignment
2785 #endif // AARCH64
2786
3112 __ bind(ok);
3113 #endif // AARCH64
3114 }
3115 #endif // ASSERT
3116
3117 void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) {
3118 fatal("CRC32 intrinsic is not implemented on this platform");
3119 }
3120
3121 void LIR_Assembler::emit_lock(LIR_OpLock* op) {
3122 Register obj = op->obj_opr()->as_pointer_register();
3123 Register hdr = op->hdr_opr()->as_pointer_register();
3124 Register lock = op->lock_opr()->as_pointer_register();
3125 Register tmp = op->scratch_opr()->is_illegal() ? noreg :
3126 op->scratch_opr()->as_pointer_register();
3127
3128 if (!UseFastLocking) {
3129 __ b(*op->stub()->entry());
3130 } else if (op->code() == lir_lock) {
3131 assert(BasicLock::displaced_header_offset_in_bytes() == 0, "lock_reg must point to the displaced header");
3132 __ resolve(ACCESS_READ | ACCESS_WRITE, obj);
3133 int null_check_offset = __ lock_object(hdr, obj, lock, tmp, *op->stub()->entry());
3134 if (op->info() != NULL) {
3135 add_debug_info_for_null_check(null_check_offset, op->info());
3136 }
3137 } else if (op->code() == lir_unlock) {
3138 __ unlock_object(hdr, obj, lock, tmp, *op->stub()->entry());
3139 } else {
3140 ShouldNotReachHere();
3141 }
3142 __ bind(*op->stub()->continuation());
3143 }
3144
3145
3146 void LIR_Assembler::emit_profile_call(LIR_OpProfileCall* op) {
3147 ciMethod* method = op->profiled_method();
3148 int bci = op->profiled_bci();
3149 ciMethod* callee = op->profiled_callee();
3150
3151 // Update counter for all call types
3152 ciMethodData* md = method->method_data_or_null();
|