@@ -4368,6 +4368,95 @@ class StubGenerator: public StubCodeGenerator {
4368
4368
return start;
4369
4369
}
4370
4370
4371
+ address ghash_polynomial512_addr () {
4372
+ __ align (CodeEntryAlignment);
4373
+ StubCodeMark mark (this , " StubRoutines" , " _ghash_poly512_addr" );
4374
+ address start = __ pc ();
4375
+ __ emit_data64 (0x00000001C2000000 , relocInfo::none); // POLY for reduction
4376
+ __ emit_data64 (0xC200000000000000 , relocInfo::none);
4377
+ __ emit_data64 (0x00000001C2000000 , relocInfo::none);
4378
+ __ emit_data64 (0xC200000000000000 , relocInfo::none);
4379
+ __ emit_data64 (0x00000001C2000000 , relocInfo::none);
4380
+ __ emit_data64 (0xC200000000000000 , relocInfo::none);
4381
+ __ emit_data64 (0x00000001C2000000 , relocInfo::none);
4382
+ __ emit_data64 (0xC200000000000000 , relocInfo::none);
4383
+ __ emit_data64 (0x0000000000000001 , relocInfo::none); // POLY
4384
+ __ emit_data64 (0xC200000000000000 , relocInfo::none);
4385
+ __ emit_data64 (0x0000000000000001 , relocInfo::none); // TWOONE
4386
+ __ emit_data64 (0x0000000100000000 , relocInfo::none);
4387
+ return start;
4388
+ }
4389
+
4390
+ // Vector AES Galois Counter Mode implementation. Parameters:
4391
+ // Windows regs | Linux regs
4392
+ // in = c_rarg0 (rcx) | c_rarg0 (rsi)
4393
+ // len = c_rarg1 (rdx) | c_rarg1 (rdi)
4394
+ // ct = c_rarg2 (r8) | c_rarg2 (rdx)
4395
+ // out = c_rarg3 (r9) | c_rarg3 (rcx)
4396
+ // key = r10 | c_rarg4 (r8)
4397
+ // state = r13 | c_rarg5 (r9)
4398
+ // subkeyHtbl = r14 | r11
4399
+ // counter = rsi | r12
4400
+ // return - number of processed bytes
4401
+ address generate_galoisCounterMode_AESCrypt () {
4402
+ __ align (CodeEntryAlignment);
4403
+ StubCodeMark mark (this , " StubRoutines" , " galoisCounterMode_AESCrypt" );
4404
+ address start = __ pc ();
4405
+ const Register in = c_rarg0;
4406
+ const Register len = c_rarg1;
4407
+ const Register ct = c_rarg2;
4408
+ const Register out = c_rarg3;
4409
+ // and updated with the incremented counter in the end
4410
+ #ifndef _WIN64
4411
+ const Register key = c_rarg4;
4412
+ const Register state = c_rarg5;
4413
+ const Address subkeyH_mem (rbp, 2 * wordSize);
4414
+ const Register subkeyHtbl = r11;
4415
+ const Address counter_mem (rbp, 3 * wordSize);
4416
+ const Register counter = r12;
4417
+ #else
4418
+ const Address key_mem (rbp, 6 * wordSize);
4419
+ const Register key = r10;
4420
+ const Address state_mem (rbp, 7 * wordSize);
4421
+ const Register state = r13;
4422
+ const Address subkeyH_mem (rbp, 8 * wordSize);
4423
+ const Register subkeyHtbl = r14;
4424
+ const Address counter_mem (rbp, 9 * wordSize);
4425
+ const Register counter = rsi;
4426
+ #endif
4427
+ __ enter ();
4428
+ // Save state before entering routine
4429
+ __ push (r12);
4430
+ __ push (r13);
4431
+ __ push (r14);
4432
+ __ push (r15);
4433
+ __ push (rbx);
4434
+ #ifdef _WIN64
4435
+ // on win64, fill len_reg from stack position
4436
+ __ push (rsi);
4437
+ __ movptr (key, key_mem);
4438
+ __ movptr (state, state_mem);
4439
+ #endif
4440
+ __ movptr (subkeyHtbl, subkeyH_mem);
4441
+ __ movptr (counter, counter_mem);
4442
+
4443
+ __ aesgcm_encrypt (in, len, ct, out, key, state, subkeyHtbl, counter);
4444
+
4445
+ // Restore state before leaving routine
4446
+ #ifdef _WIN64
4447
+ __ pop (rsi);
4448
+ #endif
4449
+ __ pop (rbx);
4450
+ __ pop (r15);
4451
+ __ pop (r14);
4452
+ __ pop (r13);
4453
+ __ pop (r12);
4454
+
4455
+ __ leave (); // required for proper stackwalking of RuntimeStub frame
4456
+ __ ret (0 );
4457
+ return start;
4458
+ }
4459
+
4371
4460
// This mask is used for incrementing counter value(linc0, linc4, etc.)
4372
4461
address counter_mask_addr () {
4373
4462
__ align (64 );
@@ -7618,13 +7707,20 @@ address generate_avx_ghash_processBlocks() {
7618
7707
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptVectorAESCrypt ();
7619
7708
StubRoutines::_electronicCodeBook_encryptAESCrypt = generate_electronicCodeBook_encryptAESCrypt ();
7620
7709
StubRoutines::_electronicCodeBook_decryptAESCrypt = generate_electronicCodeBook_decryptAESCrypt ();
7710
+ StubRoutines::x86::_counter_mask_addr = counter_mask_addr ();
7711
+ StubRoutines::x86::_ghash_poly512_addr = ghash_polynomial512_addr ();
7712
+ StubRoutines::x86::_ghash_long_swap_mask_addr = generate_ghash_long_swap_mask ();
7713
+ StubRoutines::_galoisCounterMode_AESCrypt = generate_galoisCounterMode_AESCrypt ();
7621
7714
} else {
7622
7715
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel ();
7623
7716
}
7624
7717
}
7718
+
7625
7719
if (UseAESCTRIntrinsics) {
7626
7720
if (VM_Version::supports_avx512_vaes () && VM_Version::supports_avx512bw () && VM_Version::supports_avx512vl ()) {
7627
- StubRoutines::x86::_counter_mask_addr = counter_mask_addr ();
7721
+ if (StubRoutines::x86::_counter_mask_addr == NULL ) {
7722
+ StubRoutines::x86::_counter_mask_addr = counter_mask_addr ();
7723
+ }
7628
7724
StubRoutines::_counterMode_AESCrypt = generate_counterMode_VectorAESCrypt ();
7629
7725
} else {
7630
7726
StubRoutines::x86::_counter_shuffle_mask_addr = generate_counter_shuffle_mask ();
@@ -7664,7 +7760,9 @@ address generate_avx_ghash_processBlocks() {
7664
7760
7665
7761
// Generate GHASH intrinsics code
7666
7762
if (UseGHASHIntrinsics) {
7667
- StubRoutines::x86::_ghash_long_swap_mask_addr = generate_ghash_long_swap_mask ();
7763
+ if (StubRoutines::x86::_ghash_long_swap_mask_addr == NULL ) {
7764
+ StubRoutines::x86::_ghash_long_swap_mask_addr = generate_ghash_long_swap_mask ();
7765
+ }
7668
7766
StubRoutines::x86::_ghash_byte_swap_mask_addr = generate_ghash_byte_swap_mask ();
7669
7767
if (VM_Version::supports_avx ()) {
7670
7768
StubRoutines::x86::_ghash_shuffmask_addr = ghash_shufflemask_addr ();
0 commit comments