hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp
changeset 30299 1f6f7d1e0c1e
parent 29325 0e86e64c66e5
child 30305 b92a97e1e9cb
equal deleted inserted replaced
30298:00461a39b519 30299:1f6f7d1e0c1e
  6655     jccb(Assembler::notZero, VECTOR_NOT_EQUAL);
  6655     jccb(Assembler::notZero, VECTOR_NOT_EQUAL);
  6656     addptr(result, stride2);
  6656     addptr(result, stride2);
  6657     subl(cnt2, stride2);
  6657     subl(cnt2, stride2);
  6658     jccb(Assembler::notZero, COMPARE_WIDE_VECTORS_LOOP);
  6658     jccb(Assembler::notZero, COMPARE_WIDE_VECTORS_LOOP);
  6659     // clean upper bits of YMM registers
  6659     // clean upper bits of YMM registers
  6660     vzeroupper();
  6660     vpxor(vec1, vec1);
  6661 
  6661 
  6662     // compare wide vectors tail
  6662     // compare wide vectors tail
  6663     bind(COMPARE_WIDE_TAIL);
  6663     bind(COMPARE_WIDE_TAIL);
  6664     testptr(result, result);
  6664     testptr(result, result);
  6665     jccb(Assembler::zero, LENGTH_DIFF_LABEL);
  6665     jccb(Assembler::zero, LENGTH_DIFF_LABEL);
  6670     jmpb(COMPARE_WIDE_VECTORS_LOOP);
  6670     jmpb(COMPARE_WIDE_VECTORS_LOOP);
  6671 
  6671 
  6672     // Identifies the mismatching (higher or lower)16-bytes in the 32-byte vectors.
  6672     // Identifies the mismatching (higher or lower)16-bytes in the 32-byte vectors.
  6673     bind(VECTOR_NOT_EQUAL);
  6673     bind(VECTOR_NOT_EQUAL);
  6674     // clean upper bits of YMM registers
  6674     // clean upper bits of YMM registers
  6675     vzeroupper();
  6675     vpxor(vec1, vec1);
  6676     lea(str1, Address(str1, result, scale));
  6676     lea(str1, Address(str1, result, scale));
  6677     lea(str2, Address(str2, result, scale));
  6677     lea(str2, Address(str2, result, scale));
  6678     jmp(COMPARE_16_CHARS);
  6678     jmp(COMPARE_16_CHARS);
  6679 
  6679 
  6680     // Compare tail chars, length between 1 to 15 chars
  6680     // Compare tail chars, length between 1 to 15 chars
  6929 
  6929 
  6930   // That's it
  6930   // That's it
  6931   bind(DONE);
  6931   bind(DONE);
  6932   if (UseAVX >= 2) {
  6932   if (UseAVX >= 2) {
  6933     // clean upper bits of YMM registers
  6933     // clean upper bits of YMM registers
  6934     vzeroupper();
  6934     vpxor(vec1, vec1);
       
  6935     vpxor(vec2, vec2);
  6935   }
  6936   }
  6936 }
  6937 }
  6937 
  6938 
  6938 void MacroAssembler::generate_fill(BasicType t, bool aligned,
  6939 void MacroAssembler::generate_fill(BasicType t, bool aligned,
  6939                                    Register to, Register value, Register count,
  6940                                    Register to, Register value, Register count,
  7063         addptr(to, 32);
  7064         addptr(to, 32);
  7064         subl(count, 8 << shift);
  7065         subl(count, 8 << shift);
  7065 
  7066 
  7066         BIND(L_check_fill_8_bytes);
  7067         BIND(L_check_fill_8_bytes);
  7067         // clean upper bits of YMM registers
  7068         // clean upper bits of YMM registers
  7068         vzeroupper();
  7069         movdl(xtmp, value);
       
  7070         pshufd(xtmp, xtmp, 0);
  7069       } else {
  7071       } else {
  7070         // Fill 32-byte chunks
  7072         // Fill 32-byte chunks
  7071         pshufd(xtmp, xtmp, 0);
  7073         pshufd(xtmp, xtmp, 0);
  7072 
  7074 
  7073         subl(count, 8 << shift);
  7075         subl(count, 8 << shift);
  7226     jccb(Assembler::lessEqual, L_copy_16_chars);
  7228     jccb(Assembler::lessEqual, L_copy_16_chars);
  7227 
  7229 
  7228     bind(L_copy_16_chars_exit);
  7230     bind(L_copy_16_chars_exit);
  7229     if (UseAVX >= 2) {
  7231     if (UseAVX >= 2) {
  7230       // clean upper bits of YMM registers
  7232       // clean upper bits of YMM registers
  7231       vzeroupper();
  7233       vpxor(tmp2Reg, tmp2Reg);
       
  7234       vpxor(tmp3Reg, tmp3Reg);
       
  7235       vpxor(tmp4Reg, tmp4Reg);
       
  7236       movdl(tmp1Reg, tmp5);
       
  7237       pshufd(tmp1Reg, tmp1Reg, 0);
  7232     }
  7238     }
  7233     subptr(len, 8);
  7239     subptr(len, 8);
  7234     jccb(Assembler::greater, L_copy_8_chars_exit);
  7240     jccb(Assembler::greater, L_copy_8_chars_exit);
  7235 
  7241 
  7236     bind(L_copy_8_chars);
  7242     bind(L_copy_8_chars);