@@ -1759,25 +1759,43 @@ void StubGenerator::roundDeclast(XMMRegister xmm_reg) {
17591759 __ vaesdeclast (xmm8, xmm8, xmm_reg, Assembler::AVX_512bit);
17601760}
17611761
1762+ // Check incoming byte offset against the int[] len. key is the pointer to the int[0].
1763+ // This check happens often, so it is important for it to be very compact.
1764+ void StubGenerator::check_key_offset (Register key, int offset, int load_size) {
1765+ #ifdef ASSERT
1766+ Address key_length (key, arrayOopDesc::length_offset_in_bytes () - arrayOopDesc::base_offset_in_bytes (T_INT));
1767+ assert ((offset + load_size) % 4 == 0 , " Alignment is good: %d + %d" , offset, load_size);
1768+ int end_offset = (offset + load_size) / 4 ;
1769+ Label L_good;
1770+ __ cmpl (key_length, end_offset);
1771+ __ jccb (Assembler::greaterEqual, L_good);
1772+ __ hlt ();
1773+ __ bind (L_good);
1774+ #endif
1775+ }
17621776
17631777// Utility routine for loading a 128-bit key word in little endian format
17641778void StubGenerator::load_key (XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask) {
1779+ check_key_offset (key, offset, 16 );
17651780 __ movdqu (xmmdst, Address (key, offset));
17661781 __ pshufb (xmmdst, xmm_shuf_mask);
17671782}
17681783
17691784void StubGenerator::load_key (XMMRegister xmmdst, Register key, int offset, Register rscratch) {
1785+ check_key_offset (key, offset, 16 );
17701786 __ movdqu (xmmdst, Address (key, offset));
17711787 __ pshufb (xmmdst, ExternalAddress (key_shuffle_mask_addr ()), rscratch);
17721788}
17731789
17741790void StubGenerator::ev_load_key (XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask) {
1791+ check_key_offset (key, offset, 16 );
17751792 __ movdqu (xmmdst, Address (key, offset));
17761793 __ pshufb (xmmdst, xmm_shuf_mask);
17771794 __ evshufi64x2 (xmmdst, xmmdst, xmmdst, 0x0 , Assembler::AVX_512bit);
17781795}
17791796
17801797void StubGenerator::ev_load_key (XMMRegister xmmdst, Register key, int offset, Register rscratch) {
1798+ check_key_offset (key, offset, 16 );
17811799 __ movdqu (xmmdst, Address (key, offset));
17821800 __ pshufb (xmmdst, ExternalAddress (key_shuffle_mask_addr ()), rscratch);
17831801 __ evshufi64x2 (xmmdst, xmmdst, xmmdst, 0x0 , Assembler::AVX_512bit);
@@ -3205,12 +3223,12 @@ void StubGenerator::ghash16_encrypt_parallel16_avx512(Register in, Register out,
32053223
32063224 // AES round 9
32073225 roundEncode (AESKEY2, B00_03, B04_07, B08_11, B12_15);
3208- ev_load_key (AESKEY2, key, 11 * 16 , rbx);
32093226 // AES rounds up to 11 (AES192) or 13 (AES256)
32103227 // AES128 is done
32113228 __ cmpl (NROUNDS, 52 );
32123229 __ jcc (Assembler::less, last_aes_rnd);
32133230 __ bind (aes_192);
3231+ ev_load_key (AESKEY2, key, 11 * 16 , rbx);
32143232 roundEncode (AESKEY1, B00_03, B04_07, B08_11, B12_15);
32153233 ev_load_key (AESKEY1, key, 12 * 16 , rbx);
32163234 roundEncode (AESKEY2, B00_03, B04_07, B08_11, B12_15);
0 commit comments