7181 verify_FPU(0, "FPU stack must be clean on entry"); 7182 } 7183 #endif 7184 7185 #ifdef ASSERT 7186 if (VerifyStackAtCalls) { 7187 Label L; 7188 push(rax); 7189 mov(rax, rsp); 7190 andptr(rax, StackAlignmentInBytes-1); 7191 cmpptr(rax, StackAlignmentInBytes-wordSize); 7192 pop(rax); 7193 jcc(Assembler::equal, L); 7194 STOP("Stack is not properly aligned!"); 7195 bind(L); 7196 } 7197 #endif 7198 7199 } 7200 7201 void MacroAssembler::clear_mem(Register base, Register cnt, Register tmp) { 7202 // cnt - number of qwords (8-byte words). 7203 // base - start address, qword aligned. 7204 assert(base==rdi, "base register must be edi for rep stos"); 7205 assert(tmp==rax, "tmp register must be eax for rep stos"); 7206 assert(cnt==rcx, "cnt register must be ecx for rep stos"); 7207 7208 xorptr(tmp, tmp); 7209 if (UseFastStosb) { 7210 shlptr(cnt,3); // convert to number of bytes 7211 rep_stosb(); 7212 } else { 7213 NOT_LP64(shlptr(cnt,1);) // convert to number of dwords for 32-bit VM 7214 rep_stos(); 7215 } 7216 } 7217 7218 #ifdef COMPILER2 7219 7220 // IndexOf for constant substrings with size >= 8 chars 7221 // which don't need to be loaded through stack. 7222 void MacroAssembler::string_indexofC8(Register str1, Register str2, 7223 Register cnt1, Register cnt2, 7224 int int_cnt2, Register result, 7225 XMMRegister vec, Register tmp, 7226 int ae) { 7227 ShortBranchVerifier sbv(this); 7228 assert(UseSSE42Intrinsics, "SSE4.2 intrinsics are required"); 7229 assert(UseSSE >= 4, "SSE4 must be enabled for SSE4.2 intrinsics to be available"); 7230 assert(ae != StrIntrinsicNode::LU, "Invalid encoding"); 7231 7232 // This method uses the pcmpestri instruction with bound registers 7233 // inputs: 7234 // xmm - substring 7235 // rax - substring length (elements count) | 7181 verify_FPU(0, "FPU stack must be clean on entry"); 7182 } 7183 #endif 7184 7185 #ifdef ASSERT 7186 if (VerifyStackAtCalls) { 7187 Label L; 7188 push(rax); 7189 mov(rax, rsp); 7190 andptr(rax, StackAlignmentInBytes-1); 7191 cmpptr(rax, StackAlignmentInBytes-wordSize); 7192 pop(rax); 7193 jcc(Assembler::equal, L); 7194 STOP("Stack is not properly aligned!"); 7195 bind(L); 7196 } 7197 #endif 7198 7199 } 7200 7201 void MacroAssembler::clear_mem(Register base, Register cnt, Register tmp, bool is_large) { 7202 // cnt - number of qwords (8-byte words). 7203 // base - start address, qword aligned. 7204 // is_large - if optimizers know cnt is larger than InitArrayShortSize 7205 assert(base==rdi, "base register must be edi for rep stos"); 7206 assert(tmp==rax, "tmp register must be eax for rep stos"); 7207 assert(cnt==rcx, "cnt register must be ecx for rep stos"); 7208 assert(InitArrayShortSize % BytesPerLong == 0, 7209 "InitArrayShortSize should be the multiple of BytesPerLong"); 7210 7211 Label DONE; 7212 7213 xorptr(tmp, tmp); 7214 7215 if (!is_large) { 7216 Label LOOP, LONG; 7217 cmpptr(cnt, InitArrayShortSize/BytesPerLong); 7218 jccb(Assembler::greater, LONG); 7219 7220 NOT_LP64(shlptr(cnt, 1);) // convert to number of 32-bit words for 32-bit VM 7221 7222 decrement(cnt); 7223 jccb(Assembler::negative, DONE); // Zero length 7224 7225 // Use individual pointer-sized stores for small counts: 7226 BIND(LOOP); 7227 movptr(Address(base, cnt, Address::times_ptr), tmp); 7228 decrement(cnt); 7229 jccb(Assembler::greaterEqual, LOOP); 7230 jmpb(DONE); 7231 7232 BIND(LONG); 7233 } 7234 7235 // Use longer rep-prefixed ops for non-small counts: 7236 if (UseFastStosb) { 7237 shlptr(cnt, 3); // convert to number of bytes 7238 rep_stosb(); 7239 } else { 7240 NOT_LP64(shlptr(cnt, 1);) // convert to number of 32-bit words for 32-bit VM 7241 rep_stos(); 7242 } 7243 7244 BIND(DONE); 7245 } 7246 7247 #ifdef COMPILER2 7248 7249 // IndexOf for constant substrings with size >= 8 chars 7250 // which don't need to be loaded through stack. 7251 void MacroAssembler::string_indexofC8(Register str1, Register str2, 7252 Register cnt1, Register cnt2, 7253 int int_cnt2, Register result, 7254 XMMRegister vec, Register tmp, 7255 int ae) { 7256 ShortBranchVerifier sbv(this); 7257 assert(UseSSE42Intrinsics, "SSE4.2 intrinsics are required"); 7258 assert(UseSSE >= 4, "SSE4 must be enabled for SSE4.2 intrinsics to be available"); 7259 assert(ae != StrIntrinsicNode::LU, "Invalid encoding"); 7260 7261 // This method uses the pcmpestri instruction with bound registers 7262 // inputs: 7263 // xmm - substring 7264 // rax - substring length (elements count) |