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 }
|