< prev index next >

src/cpu/x86/vm/macroAssembler_x86.cpp

Print this page




8764   // That's it
8765   bind(DONE);
8766   if (UseAVX >= 2 && UseSSE >= 2) {
8767     // clean upper bits of YMM registers
8768     vpxor(vec1, vec1);
8769     vpxor(vec2, vec2);
8770   }
8771 }
8772 // Compare char[] or byte[] arrays aligned to 4 bytes or substrings.
8773 void MacroAssembler::arrays_equals(bool is_array_equ, Register ary1, Register ary2,
8774                                    Register limit, Register result, Register chr,
8775                                    XMMRegister vec1, XMMRegister vec2, bool is_char) {
8776   ShortBranchVerifier sbv(this);
8777   Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR, COMPARE_BYTE;
8778 
8779   int length_offset  = arrayOopDesc::length_offset_in_bytes();
8780   int base_offset    = arrayOopDesc::base_offset_in_bytes(is_char ? T_CHAR : T_BYTE);
8781 
8782   if (is_array_equ) {
8783     // Check the input args
8784     cmpoopptr(ary1, ary2);
8785     jcc(Assembler::equal, TRUE_LABEL);
8786 
8787     // Need additional checks for arrays_equals.
8788     testptr(ary1, ary1);
8789     jcc(Assembler::zero, FALSE_LABEL);
8790     testptr(ary2, ary2);
8791     jcc(Assembler::zero, FALSE_LABEL);
8792 
8793     // Check the lengths
8794     movl(limit, Address(ary1, length_offset));
8795     cmpl(limit, Address(ary2, length_offset));
8796     jcc(Assembler::notEqual, FALSE_LABEL);
8797   }
8798 
8799   // count == 0
8800   testl(limit, limit);
8801   jcc(Assembler::zero, TRUE_LABEL);
8802 
8803   if (is_array_equ) {
8804     // Load array address


11783     addptr(rsp, 16*num_xmm_regs);
11784 
11785 #ifdef COMPILER2
11786     if (MaxVectorSize > 16) {
11787       // Restore upper half of YMM registers.
11788       for (int n = 0; n < num_xmm_regs; n++) {
11789         vinsertf128_high(as_XMMRegister(n), Address(rsp, n*16));
11790       }
11791       addptr(rsp, 16*num_xmm_regs);
11792       if(UseAVX > 2) {
11793         for (int n = 0; n < num_xmm_regs; n++) {
11794           vinsertf64x4_high(as_XMMRegister(n), Address(rsp, n*32));
11795         }
11796         addptr(rsp, 32*num_xmm_regs);
11797       }
11798     }
11799 #endif
11800   }
11801 }
11802 
11803 void MacroAssembler::cmpoopptr(Register src1, Register src2) {
11804   cmpptr(src1, src2);
11805   oopDesc::bs()->asm_acmp_barrier(this, src1, src2);
11806 }
11807 
11808 void MacroAssembler::cmpoopptr(Register src1, Address src2) {
11809   cmpptr(src1, src2);
11810   if (UseShenandoahGC && ShenandoahAcmpBarrier) {
11811     Label done;
11812     jccb(Assembler::equal, done);
11813     movptr(rscratch2, src2);
11814     oopDesc::bs()->interpreter_read_barrier(this, src1);
11815     oopDesc::bs()->interpreter_read_barrier(this, rscratch2);
11816     cmpptr(src1, rscratch2);
11817     bind(done);
11818   }
11819 }


8764   // That's it
8765   bind(DONE);
8766   if (UseAVX >= 2 && UseSSE >= 2) {
8767     // clean upper bits of YMM registers
8768     vpxor(vec1, vec1);
8769     vpxor(vec2, vec2);
8770   }
8771 }
8772 // Compare char[] or byte[] arrays aligned to 4 bytes or substrings.
8773 void MacroAssembler::arrays_equals(bool is_array_equ, Register ary1, Register ary2,
8774                                    Register limit, Register result, Register chr,
8775                                    XMMRegister vec1, XMMRegister vec2, bool is_char) {
8776   ShortBranchVerifier sbv(this);
8777   Label TRUE_LABEL, FALSE_LABEL, DONE, COMPARE_VECTORS, COMPARE_CHAR, COMPARE_BYTE;
8778 
8779   int length_offset  = arrayOopDesc::length_offset_in_bytes();
8780   int base_offset    = arrayOopDesc::base_offset_in_bytes(is_char ? T_CHAR : T_BYTE);
8781 
8782   if (is_array_equ) {
8783     // Check the input args
8784     cmpoops(ary1, ary2);
8785     jcc(Assembler::equal, TRUE_LABEL);
8786 
8787     // Need additional checks for arrays_equals.
8788     testptr(ary1, ary1);
8789     jcc(Assembler::zero, FALSE_LABEL);
8790     testptr(ary2, ary2);
8791     jcc(Assembler::zero, FALSE_LABEL);
8792 
8793     // Check the lengths
8794     movl(limit, Address(ary1, length_offset));
8795     cmpl(limit, Address(ary2, length_offset));
8796     jcc(Assembler::notEqual, FALSE_LABEL);
8797   }
8798 
8799   // count == 0
8800   testl(limit, limit);
8801   jcc(Assembler::zero, TRUE_LABEL);
8802 
8803   if (is_array_equ) {
8804     // Load array address


11783     addptr(rsp, 16*num_xmm_regs);
11784 
11785 #ifdef COMPILER2
11786     if (MaxVectorSize > 16) {
11787       // Restore upper half of YMM registers.
11788       for (int n = 0; n < num_xmm_regs; n++) {
11789         vinsertf128_high(as_XMMRegister(n), Address(rsp, n*16));
11790       }
11791       addptr(rsp, 16*num_xmm_regs);
11792       if(UseAVX > 2) {
11793         for (int n = 0; n < num_xmm_regs; n++) {
11794           vinsertf64x4_high(as_XMMRegister(n), Address(rsp, n*32));
11795         }
11796         addptr(rsp, 32*num_xmm_regs);
11797       }
11798     }
11799 #endif
11800   }
11801 }
11802 
11803 void MacroAssembler::cmpoops(Register src1, Register src2) {
11804   cmpptr(src1, src2);
11805   oopDesc::bs()->asm_acmp_barrier(this, src1, src2);
11806 }
11807 
11808 void MacroAssembler::cmpoops(Register src1, Address src2) {
11809   cmpptr(src1, src2);
11810   if (UseShenandoahGC && ShenandoahAcmpBarrier) {
11811     Label done;
11812     jccb(Assembler::equal, done);
11813     movptr(rscratch2, src2);
11814     oopDesc::bs()->interpreter_read_barrier(this, src1);
11815     oopDesc::bs()->interpreter_read_barrier(this, rscratch2);
11816     cmpptr(src1, rscratch2);
11817     bind(done);
11818   }
11819 }
< prev index next >