< prev index next >

src/hotspot/cpu/arm/c1_LIRAssembler_arm.cpp

Print this page




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


< prev index next >