6336 stubName = "sha1_implCompress";
6337 break;
6338 case vmIntrinsics::_sha2_implCompress:
6339 assert(UseSHA256Intrinsics, "need SHA256 instruction support");
6340 state = get_state_from_sha_object(sha_obj);
6341 stubAddr = StubRoutines::sha256_implCompress();
6342 stubName = "sha256_implCompress";
6343 break;
6344 case vmIntrinsics::_sha5_implCompress:
6345 assert(UseSHA512Intrinsics, "need SHA512 instruction support");
6346 state = get_state_from_sha5_object(sha_obj);
6347 stubAddr = StubRoutines::sha512_implCompress();
6348 stubName = "sha512_implCompress";
6349 break;
6350 default:
6351 fatal_unexpected_iid(id);
6352 return false;
6353 }
6354 if (state == NULL) return false;
6355
6356 // Call the stub.
6357 Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::sha_implCompress_Type(),
6358 stubAddr, stubName, TypePtr::BOTTOM,
6359 src_start, state);
6360
6361 return true;
6362 }
6363
6364 //------------------------------inline_digestBase_implCompressMB-----------------------
6365 //
6366 // Calculate SHA/SHA2/SHA5 for multi-block byte[] array.
6367 // int com.sun.security.provider.DigestBase.implCompressMultiBlock(byte[] b, int ofs, int limit)
6368 //
6369 bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
6370 assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics,
6371 "need SHA1/SHA256/SHA512 instruction support");
6372 assert((uint)predicate < 3, "sanity");
6373 assert(callee()->signature()->size() == 3, "digestBase_implCompressMB has 3 parameters");
6374
6375 Node* digestBase_obj = argument(0); // The receiver was checked for NULL already.
6408 break;
6409 case 1:
6410 if (UseSHA256Intrinsics) {
6411 klass_SHA_name = "sun/security/provider/SHA2";
6412 stub_name = "sha256_implCompressMB";
6413 stub_addr = StubRoutines::sha256_implCompressMB();
6414 }
6415 break;
6416 case 2:
6417 if (UseSHA512Intrinsics) {
6418 klass_SHA_name = "sun/security/provider/SHA5";
6419 stub_name = "sha512_implCompressMB";
6420 stub_addr = StubRoutines::sha512_implCompressMB();
6421 long_state = true;
6422 }
6423 break;
6424 default:
6425 fatal("unknown SHA intrinsic predicate: %d", predicate);
6426 }
6427 if (klass_SHA_name != NULL) {
6428 // get DigestBase klass to lookup for SHA klass
6429 const TypeInstPtr* tinst = _gvn.type(digestBase_obj)->isa_instptr();
6430 assert(tinst != NULL, "digestBase_obj is not instance???");
6431 assert(tinst->klass()->is_loaded(), "DigestBase is not loaded");
6432
6433 ciKlass* klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name));
6434 assert(klass_SHA->is_loaded(), "predicate checks that this class is loaded");
6435 ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass();
6436 return inline_sha_implCompressMB(digestBase_obj, instklass_SHA, long_state, stub_addr, stub_name, src_start, ofs, limit);
6437 }
6438 return false;
6439 }
6440 //------------------------------inline_sha_implCompressMB-----------------------
6441 bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_SHA,
6442 bool long_state, address stubAddr, const char *stubName,
6443 Node* src_start, Node* ofs, Node* limit) {
6444 const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_SHA);
6445 const TypeOopPtr* xtype = aklass->as_instance_type();
6446 Node* sha_obj = new CheckCastPPNode(control(), digestBase_obj, xtype);
6447 sha_obj = _gvn.transform(sha_obj);
|
6336 stubName = "sha1_implCompress";
6337 break;
6338 case vmIntrinsics::_sha2_implCompress:
6339 assert(UseSHA256Intrinsics, "need SHA256 instruction support");
6340 state = get_state_from_sha_object(sha_obj);
6341 stubAddr = StubRoutines::sha256_implCompress();
6342 stubName = "sha256_implCompress";
6343 break;
6344 case vmIntrinsics::_sha5_implCompress:
6345 assert(UseSHA512Intrinsics, "need SHA512 instruction support");
6346 state = get_state_from_sha5_object(sha_obj);
6347 stubAddr = StubRoutines::sha512_implCompress();
6348 stubName = "sha512_implCompress";
6349 break;
6350 default:
6351 fatal_unexpected_iid(id);
6352 return false;
6353 }
6354 if (state == NULL) return false;
6355
6356 assert(stubAddr != NULL, "Stub is generated");
6357 if (stubAddr == NULL) return false;
6358
6359 // Call the stub.
6360 Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::sha_implCompress_Type(),
6361 stubAddr, stubName, TypePtr::BOTTOM,
6362 src_start, state);
6363
6364 return true;
6365 }
6366
6367 //------------------------------inline_digestBase_implCompressMB-----------------------
6368 //
6369 // Calculate SHA/SHA2/SHA5 for multi-block byte[] array.
6370 // int com.sun.security.provider.DigestBase.implCompressMultiBlock(byte[] b, int ofs, int limit)
6371 //
6372 bool LibraryCallKit::inline_digestBase_implCompressMB(int predicate) {
6373 assert(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics,
6374 "need SHA1/SHA256/SHA512 instruction support");
6375 assert((uint)predicate < 3, "sanity");
6376 assert(callee()->signature()->size() == 3, "digestBase_implCompressMB has 3 parameters");
6377
6378 Node* digestBase_obj = argument(0); // The receiver was checked for NULL already.
6411 break;
6412 case 1:
6413 if (UseSHA256Intrinsics) {
6414 klass_SHA_name = "sun/security/provider/SHA2";
6415 stub_name = "sha256_implCompressMB";
6416 stub_addr = StubRoutines::sha256_implCompressMB();
6417 }
6418 break;
6419 case 2:
6420 if (UseSHA512Intrinsics) {
6421 klass_SHA_name = "sun/security/provider/SHA5";
6422 stub_name = "sha512_implCompressMB";
6423 stub_addr = StubRoutines::sha512_implCompressMB();
6424 long_state = true;
6425 }
6426 break;
6427 default:
6428 fatal("unknown SHA intrinsic predicate: %d", predicate);
6429 }
6430 if (klass_SHA_name != NULL) {
6431 assert(stub_addr != NULL, "Stub is generated");
6432 if (stub_addr == NULL) return false;
6433
6434 // get DigestBase klass to lookup for SHA klass
6435 const TypeInstPtr* tinst = _gvn.type(digestBase_obj)->isa_instptr();
6436 assert(tinst != NULL, "digestBase_obj is not instance???");
6437 assert(tinst->klass()->is_loaded(), "DigestBase is not loaded");
6438
6439 ciKlass* klass_SHA = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make(klass_SHA_name));
6440 assert(klass_SHA->is_loaded(), "predicate checks that this class is loaded");
6441 ciInstanceKlass* instklass_SHA = klass_SHA->as_instance_klass();
6442 return inline_sha_implCompressMB(digestBase_obj, instklass_SHA, long_state, stub_addr, stub_name, src_start, ofs, limit);
6443 }
6444 return false;
6445 }
6446 //------------------------------inline_sha_implCompressMB-----------------------
6447 bool LibraryCallKit::inline_sha_implCompressMB(Node* digestBase_obj, ciInstanceKlass* instklass_SHA,
6448 bool long_state, address stubAddr, const char *stubName,
6449 Node* src_start, Node* ofs, Node* limit) {
6450 const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_SHA);
6451 const TypeOopPtr* xtype = aklass->as_instance_type();
6452 Node* sha_obj = new CheckCastPPNode(control(), digestBase_obj, xtype);
6453 sha_obj = _gvn.transform(sha_obj);
|