Mercurial > hg > graal-compiler
changeset 22804:078298728607
Add 1.9 versions of crypto and crc32 intrinsification points
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Mon, 12 Oct 2015 18:17:24 -0700 |
parents | f67bef7309ad |
children | b058d6325c2e |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AESCryptSubstitutions.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CRC32Substitutions.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java |
diffstat | 4 files changed, 66 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Tue Oct 13 00:19:28 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java Mon Oct 12 18:17:24 2015 -0700 @@ -278,14 +278,24 @@ Class<?> c = MethodSubstitutionPlugin.resolveClass("com.sun.crypto.provider.CipherBlockChaining", true); if (c != null) { Registration r = new Registration(plugins, c); - r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, "encrypt", Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class); - r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, "decrypt", Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class); + if (jdkMajorVersion() >= 1 && jdkMinorVersion() <= 8) { + r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, "encrypt", Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class); + r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, "decrypt", Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class); + } else { + r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, "implEncrypt", Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class); + r.registerMethodSubstitution(CipherBlockChainingSubstitutions.class, "implDecrypt", Receiver.class, byte[].class, int.class, int.class, byte[].class, int.class); + } } c = MethodSubstitutionPlugin.resolveClass("com.sun.crypto.provider.AESCrypt", true); if (c != null) { Registration r = new Registration(plugins, c); - r.registerMethodSubstitution(AESCryptSubstitutions.class, "encryptBlock", Receiver.class, byte[].class, int.class, byte[].class, int.class); - r.registerMethodSubstitution(AESCryptSubstitutions.class, "decryptBlock", Receiver.class, byte[].class, int.class, byte[].class, int.class); + if (jdkMajorVersion() >= 1 && jdkMinorVersion() <= 8) { + r.registerMethodSubstitution(AESCryptSubstitutions.class, "encryptBlock", Receiver.class, byte[].class, int.class, byte[].class, int.class); + r.registerMethodSubstitution(AESCryptSubstitutions.class, "decryptBlock", Receiver.class, byte[].class, int.class, byte[].class, int.class); + } else { + r.registerMethodSubstitution(AESCryptSubstitutions.class, "implEncryptBlock", Receiver.class, byte[].class, int.class, byte[].class, int.class); + r.registerMethodSubstitution(AESCryptSubstitutions.class, "implDecryptBlock", Receiver.class, byte[].class, int.class, byte[].class, int.class); + } } } } @@ -298,8 +308,13 @@ assert config.cipherBlockChainingDecryptAESCryptStub != 0L; Registration r = new Registration(plugins, CRC32.class); r.registerMethodSubstitution(CRC32Substitutions.class, "update", int.class, int.class); - r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes", int.class, byte[].class, int.class, int.class); - r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer", int.class, long.class, int.class, int.class); + if (jdkMajorVersion() >= 1 && jdkMinorVersion() <= 8) { + r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes", int.class, byte[].class, int.class, int.class); + r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer", int.class, long.class, int.class, int.class); + } else { + r.registerMethodSubstitution(CRC32Substitutions.class, "updateBytes0", int.class, byte[].class, int.class, int.class); + r.registerMethodSubstitution(CRC32Substitutions.class, "updateByteBuffer0", int.class, long.class, int.class, int.class); + } } } }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AESCryptSubstitutions.java Tue Oct 13 00:19:28 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/AESCryptSubstitutions.java Mon Oct 12 18:17:24 2015 -0700 @@ -78,10 +78,18 @@ crypt(rcvr, in, inOffset, out, outOffset, true); } + static void implEncryptBlock(Object rcvr, byte[] in, int inOffset, byte[] out, int outOffset) { + crypt(rcvr, in, inOffset, out, outOffset, true); + } + static void decryptBlock(Object rcvr, byte[] in, int inOffset, byte[] out, int outOffset) { crypt(rcvr, in, inOffset, out, outOffset, false); } + static void implDecryptBlock(Object rcvr, byte[] in, int inOffset, byte[] out, int outOffset) { + crypt(rcvr, in, inOffset, out, outOffset, false); + } + private static void crypt(Object rcvr, byte[] in, int inOffset, byte[] out, int outOffset, boolean encrypt) { checkArgs(in, inOffset, out, outOffset); Object realReceiver = PiNode.piCastNonNull(rcvr, AESCryptClass);
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CRC32Substitutions.java Tue Oct 13 00:19:28 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CRC32Substitutions.java Mon Oct 12 18:17:24 2015 -0700 @@ -63,16 +63,26 @@ static int updateBytes(int crc, byte[] buf, int off, int len) { Word bufAddr = Word.unsigned(ComputeObjectAddressNode.get(buf, arrayBaseOffset(JavaKind.Byte) + off)); - return updateBytes(UPDATE_BYTES_CRC32, crc, bufAddr, len); + return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); + } + + static int updateBytes0(int crc, byte[] buf, int off, int len) { + Word bufAddr = Word.unsigned(ComputeObjectAddressNode.get(buf, arrayBaseOffset(JavaKind.Byte) + off)); + return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); } static int updateByteBuffer(int crc, long addr, int off, int len) { Word bufAddr = Word.unsigned(addr).add(off); - return updateBytes(UPDATE_BYTES_CRC32, crc, bufAddr, len); + return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); + } + + static int updateByteBuffer0(int crc, long addr, int off, int len) { + Word bufAddr = Word.unsigned(addr).add(off); + return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); } public static final ForeignCallDescriptor UPDATE_BYTES_CRC32 = new ForeignCallDescriptor("updateBytesCRC32", int.class, int.class, Word.class, int.class); @NodeIntrinsic(ForeignCallNode.class) - public static native int updateBytes(@ConstantNodeParameter ForeignCallDescriptor descriptor, int crc, Word buf, int length); + public static native int updateBytesCRC32(@ConstantNodeParameter ForeignCallDescriptor descriptor, int crc, Word buf, int length); }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java Tue Oct 13 00:19:28 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CipherBlockChainingSubstitutions.java Mon Oct 12 18:17:24 2015 -0700 @@ -86,6 +86,18 @@ } } + static int implEncrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { + Object realReceiver = PiNode.piCastNonNull(rcvr, cipherBlockChainingClass); + Object embeddedCipher = UnsafeLoadNode.load(realReceiver, embeddedCipherOffset, JavaKind.Object, LocationIdentity.any()); + if (getAESCryptClass().isInstance(embeddedCipher)) { + Object aesCipher = PiNode.piCastNonNull(embeddedCipher, AESCryptSubstitutions.AESCryptClass); + crypt(realReceiver, in, inOffset, inLength, out, outOffset, aesCipher, true); + return inLength; + } else { + return implEncrypt(realReceiver, in, inOffset, inLength, out, outOffset); + } + } + static int decrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { Object realReceiver = PiNode.piCastNonNull(rcvr, cipherBlockChainingClass); Object embeddedCipher = UnsafeLoadNode.load(realReceiver, embeddedCipherOffset, JavaKind.Object, LocationIdentity.any()); @@ -98,6 +110,18 @@ } } + static int implDecrypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset) { + Object realReceiver = PiNode.piCastNonNull(rcvr, cipherBlockChainingClass); + Object embeddedCipher = UnsafeLoadNode.load(realReceiver, embeddedCipherOffset, JavaKind.Object, LocationIdentity.any()); + if (in != out && getAESCryptClass().isInstance(embeddedCipher)) { + Object aesCipher = PiNode.piCastNonNull(embeddedCipher, AESCryptSubstitutions.AESCryptClass); + crypt(realReceiver, in, inOffset, inLength, out, outOffset, aesCipher, false); + return inLength; + } else { + return implDecrypt(realReceiver, in, inOffset, inLength, out, outOffset); + } + } + private static void crypt(Object rcvr, byte[] in, int inOffset, int inLength, byte[] out, int outOffset, Object embeddedCipher, boolean encrypt) { AESCryptSubstitutions.checkArgs(in, inOffset, out, outOffset); Object realReceiver = PiNode.piCastNonNull(rcvr, cipherBlockChainingClass);