< prev index next >

src/cpu/x86/vm/c1_LIRAssembler_x86.cpp

Print this page
rev 11803 : 8159611: C2: ArrayCopy elimination skips required parameter checks


3141   }
3142   if (flags & LIR_OpArrayCopy::dst_pos_positive_check) {
3143     __ testl(dst_pos, dst_pos);
3144     __ jcc(Assembler::less, *stub->entry());
3145   }
3146 
3147   if (flags & LIR_OpArrayCopy::src_range_check) {
3148     __ lea(tmp, Address(src_pos, length, Address::times_1, 0));
3149     __ cmpl(tmp, src_length_addr);
3150     __ jcc(Assembler::above, *stub->entry());
3151   }
3152   if (flags & LIR_OpArrayCopy::dst_range_check) {
3153     __ lea(tmp, Address(dst_pos, length, Address::times_1, 0));
3154     __ cmpl(tmp, dst_length_addr);
3155     __ jcc(Assembler::above, *stub->entry());
3156   }
3157 
3158   if (flags & LIR_OpArrayCopy::length_positive_check) {
3159     __ testl(length, length);
3160     __ jcc(Assembler::less, *stub->entry());
3161     __ jcc(Assembler::zero, *stub->continuation());
3162   }
3163 
3164 #ifdef _LP64
3165   __ movl2ptr(src_pos, src_pos); //higher 32bits must be null
3166   __ movl2ptr(dst_pos, dst_pos); //higher 32bits must be null
3167 #endif
3168 
3169   if (flags & LIR_OpArrayCopy::type_check) {
3170     // We don't know the array types are compatible
3171     if (basic_type != T_OBJECT) {
3172       // Simple test for basic type arrays
3173       if (UseCompressedClassPointers) {
3174         __ movl(tmp, src_klass_addr);
3175         __ cmpl(tmp, dst_klass_addr);
3176       } else {
3177         __ movptr(tmp, src_klass_addr);
3178         __ cmpptr(tmp, dst_klass_addr);
3179       }
3180       __ jcc(Assembler::notEqual, *stub->entry());
3181     } else {




3141   }
3142   if (flags & LIR_OpArrayCopy::dst_pos_positive_check) {
3143     __ testl(dst_pos, dst_pos);
3144     __ jcc(Assembler::less, *stub->entry());
3145   }
3146 
3147   if (flags & LIR_OpArrayCopy::src_range_check) {
3148     __ lea(tmp, Address(src_pos, length, Address::times_1, 0));
3149     __ cmpl(tmp, src_length_addr);
3150     __ jcc(Assembler::above, *stub->entry());
3151   }
3152   if (flags & LIR_OpArrayCopy::dst_range_check) {
3153     __ lea(tmp, Address(dst_pos, length, Address::times_1, 0));
3154     __ cmpl(tmp, dst_length_addr);
3155     __ jcc(Assembler::above, *stub->entry());
3156   }
3157 
3158   if (flags & LIR_OpArrayCopy::length_positive_check) {
3159     __ testl(length, length);
3160     __ jcc(Assembler::less, *stub->entry());

3161   }
3162 
3163 #ifdef _LP64
3164   __ movl2ptr(src_pos, src_pos); //higher 32bits must be null
3165   __ movl2ptr(dst_pos, dst_pos); //higher 32bits must be null
3166 #endif
3167 
3168   if (flags & LIR_OpArrayCopy::type_check) {
3169     // We don't know the array types are compatible
3170     if (basic_type != T_OBJECT) {
3171       // Simple test for basic type arrays
3172       if (UseCompressedClassPointers) {
3173         __ movl(tmp, src_klass_addr);
3174         __ cmpl(tmp, dst_klass_addr);
3175       } else {
3176         __ movptr(tmp, src_klass_addr);
3177         __ cmpptr(tmp, dst_klass_addr);
3178       }
3179       __ jcc(Assembler::notEqual, *stub->entry());
3180     } else {


< prev index next >