@@ -2276,6 +2276,174 @@ class StubGenerator: public StubCodeGenerator {
2276
2276
StubRoutines::_arrayof_jint_fill = generate_fill (T_INT, true , " arrayof_jint_fill" );
2277
2277
}
2278
2278
2279
+ void generate_aes_loadkeys (const Register &key, VectorRegister *working_vregs, int rounds) {
2280
+ const int step = 16 ;
2281
+ for (int i = 0 ; i < rounds; i++) {
2282
+ __ vle32_v (working_vregs[i], key);
2283
+ // The keys are stored in little-endian array, while we need
2284
+ // to operate in big-endian.
2285
+ // So performing an endian-swap here with vrev8.v instruction
2286
+ __ vrev8_v (working_vregs[i], working_vregs[i]);
2287
+ __ addi (key, key, step);
2288
+ }
2289
+ }
2290
+
2291
+ void generate_aes_encrypt (const VectorRegister &res, VectorRegister *working_vregs, int rounds) {
2292
+ assert (rounds <= 15 , " rounds should be less than or equal to working_vregs size" );
2293
+
2294
+ __ vxor_vv (res, res, working_vregs[0 ]);
2295
+ for (int i = 1 ; i < rounds - 1 ; i++) {
2296
+ __ vaesem_vv (res, working_vregs[i]);
2297
+ }
2298
+ __ vaesef_vv (res, working_vregs[rounds - 1 ]);
2299
+ }
2300
+
2301
+ // Arguments:
2302
+ //
2303
+ // Inputs:
2304
+ // c_rarg0 - source byte array address
2305
+ // c_rarg1 - destination byte array address
2306
+ // c_rarg2 - K (key) in little endian int array
2307
+ //
2308
+ address generate_aescrypt_encryptBlock () {
2309
+ assert (UseAESIntrinsics, " need AES instructions (Zvkned extension) support" );
2310
+
2311
+ __ align (CodeEntryAlignment);
2312
+ StubCodeMark mark (this , " StubRoutines" , " aescrypt_encryptBlock" );
2313
+
2314
+ Label L_aes128, L_aes192;
2315
+
2316
+ const Register from = c_rarg0; // source array address
2317
+ const Register to = c_rarg1; // destination array address
2318
+ const Register key = c_rarg2; // key array address
2319
+ const Register keylen = c_rarg3;
2320
+
2321
+ VectorRegister working_vregs[] = {
2322
+ v4, v5, v6, v7, v8, v9, v10, v11,
2323
+ v12, v13, v14, v15, v16, v17, v18
2324
+ };
2325
+ const VectorRegister res = v19;
2326
+
2327
+ address start = __ pc ();
2328
+ __ enter ();
2329
+
2330
+ __ lwu (keylen, Address (key, arrayOopDesc::length_offset_in_bytes () - arrayOopDesc::base_offset_in_bytes (T_INT)));
2331
+
2332
+ __ vsetivli (x0, 4 , Assembler::e32 , Assembler::m1);
2333
+ __ vle32_v (res, from);
2334
+
2335
+ __ mv (t2, 52 );
2336
+ __ blt (keylen, t2, L_aes128);
2337
+ __ beq (keylen, t2, L_aes192);
2338
+ // Else we fallthrough to the biggest case (256-bit key size)
2339
+
2340
+ // Note: the following function performs key += 15*16
2341
+ generate_aes_loadkeys (key, working_vregs, 15 );
2342
+ generate_aes_encrypt (res, working_vregs, 15 );
2343
+ __ vse32_v (res, to);
2344
+ __ mv (c_rarg0, 0 );
2345
+ __ leave ();
2346
+ __ ret ();
2347
+
2348
+ __ bind (L_aes192);
2349
+ // Note: the following function performs key += 13*16
2350
+ generate_aes_loadkeys (key, working_vregs, 13 );
2351
+ generate_aes_encrypt (res, working_vregs, 13 );
2352
+ __ vse32_v (res, to);
2353
+ __ mv (c_rarg0, 0 );
2354
+ __ leave ();
2355
+ __ ret ();
2356
+
2357
+ __ bind (L_aes128);
2358
+ // Note: the following function performs key += 11*16
2359
+ generate_aes_loadkeys (key, working_vregs, 11 );
2360
+ generate_aes_encrypt (res, working_vregs, 11 );
2361
+ __ vse32_v (res, to);
2362
+ __ mv (c_rarg0, 0 );
2363
+ __ leave ();
2364
+ __ ret ();
2365
+
2366
+ return start;
2367
+ }
2368
+
2369
+ void generate_aes_decrypt (const VectorRegister &res, VectorRegister *working_vregs, int rounds) {
2370
+ assert (rounds <= 15 , " rounds should be less than or equal to working_vregs size" );
2371
+
2372
+ __ vxor_vv (res, res, working_vregs[rounds - 1 ]);
2373
+ for (int i = rounds - 2 ; i > 0 ; i--) {
2374
+ __ vaesdm_vv (res, working_vregs[i]);
2375
+ }
2376
+ __ vaesdf_vv (res, working_vregs[0 ]);
2377
+ }
2378
+
2379
+ // Arguments:
2380
+ //
2381
+ // Inputs:
2382
+ // c_rarg0 - source byte array address
2383
+ // c_rarg1 - destination byte array address
2384
+ // c_rarg2 - K (key) in little endian int array
2385
+ //
2386
+ address generate_aescrypt_decryptBlock () {
2387
+ assert (UseAESIntrinsics, " need AES instructions (Zvkned extension) support" );
2388
+
2389
+ __ align (CodeEntryAlignment);
2390
+ StubCodeMark mark (this , " StubRoutines" , " aescrypt_decryptBlock" );
2391
+
2392
+ Label L_aes128, L_aes192;
2393
+
2394
+ const Register from = c_rarg0; // source array address
2395
+ const Register to = c_rarg1; // destination array address
2396
+ const Register key = c_rarg2; // key array address
2397
+ const Register keylen = c_rarg3;
2398
+
2399
+ VectorRegister working_vregs[] = {
2400
+ v4, v5, v6, v7, v8, v9, v10, v11,
2401
+ v12, v13, v14, v15, v16, v17, v18
2402
+ };
2403
+ const VectorRegister res = v19;
2404
+
2405
+ address start = __ pc ();
2406
+ __ enter (); // required for proper stackwalking of RuntimeStub frame
2407
+
2408
+ __ lwu (keylen, Address (key, arrayOopDesc::length_offset_in_bytes () - arrayOopDesc::base_offset_in_bytes (T_INT)));
2409
+
2410
+ __ vsetivli (x0, 4 , Assembler::e32 , Assembler::m1);
2411
+ __ vle32_v (res, from);
2412
+
2413
+ __ mv (t2, 52 );
2414
+ __ blt (keylen, t2, L_aes128);
2415
+ __ beq (keylen, t2, L_aes192);
2416
+ // Else we fallthrough to the biggest case (256-bit key size)
2417
+
2418
+ // Note: the following function performs key += 15*16
2419
+ generate_aes_loadkeys (key, working_vregs, 15 );
2420
+ generate_aes_decrypt (res, working_vregs, 15 );
2421
+ __ vse32_v (res, to);
2422
+ __ mv (c_rarg0, 0 );
2423
+ __ leave ();
2424
+ __ ret ();
2425
+
2426
+ __ bind (L_aes192);
2427
+ // Note: the following function performs key += 13*16
2428
+ generate_aes_loadkeys (key, working_vregs, 13 );
2429
+ generate_aes_decrypt (res, working_vregs, 13 );
2430
+ __ vse32_v (res, to);
2431
+ __ mv (c_rarg0, 0 );
2432
+ __ leave ();
2433
+ __ ret ();
2434
+
2435
+ __ bind (L_aes128);
2436
+ // Note: the following function performs key += 11*16
2437
+ generate_aes_loadkeys (key, working_vregs, 11 );
2438
+ generate_aes_decrypt (res, working_vregs, 11 );
2439
+ __ vse32_v (res, to);
2440
+ __ mv (c_rarg0, 0 );
2441
+ __ leave ();
2442
+ __ ret ();
2443
+
2444
+ return start;
2445
+ }
2446
+
2279
2447
// code for comparing 16 bytes of strings with same encoding
2280
2448
void compare_string_16_bytes_same (Label &DIFF1, Label &DIFF2) {
2281
2449
const Register result = x10, str1 = x11, cnt1 = x12, str2 = x13, tmp1 = x28, tmp2 = x29, tmp4 = x7, tmp5 = x31;
@@ -6294,6 +6462,11 @@ static const int64_t right_3_bits = right_n_bits(3);
6294
6462
StubRoutines::_montgomerySquare = g.generate_square ();
6295
6463
}
6296
6464
6465
+ if (UseAESIntrinsics) {
6466
+ StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock ();
6467
+ StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock ();
6468
+ }
6469
+
6297
6470
if (UsePoly1305Intrinsics) {
6298
6471
StubRoutines::_poly1305_processBlocks = generate_poly1305_processBlocks ();
6299
6472
}
0 commit comments