< prev index next >

src/share/vm/opto/library_call.cpp

Print this page
rev 8499 : 8086069: Adapt runtime calls to recent intrinsics to pass ints as long

@@ -5309,14 +5309,25 @@
      final_sync(ideal);
 #undef __
 
     Node* z_start = array_element_address(z, intcon(0), T_INT);
 
-    Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
+    Node* call = NULL;
+    if (CCallingConventionRequiresIntsAsLongs) {
+      Node* xlen_I2L = ConvI2L(xlen);
+      Node* ylen_I2L = ConvI2L(ylen);
+      Node* zlen_I2L = ConvI2L(zlen);
+      call = make_runtime_call(RC_LEAF|RC_NO_FP,
+                               OptoRuntime::multiplyToLen_Type(),
+                               stubAddr, stubName, TypePtr::BOTTOM,
+                               x_start, xlen_I2L XTOP, y_start, ylen_I2L XTOP, z_start, zlen_I2L XTOP);
+    } else {
+      call = make_runtime_call(RC_LEAF|RC_NO_FP,
                                    OptoRuntime::multiplyToLen_Type(),
                                    stubAddr, stubName, TypePtr::BOTTOM,
                                    x_start, xlen, y_start, ylen, z_start, zlen);
+    }
   } // original reexecute is set back here
 
   C->set_has_split_ifs(true); // Has chance for split-if optimization
   set_result(z);
   return true;

@@ -5486,13 +5497,22 @@
 
   // Call the stub.
   address stubAddr = StubRoutines::updateBytesCRC32();
   const char *stubName = "updateBytesCRC32";
 
-  Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
+  Node* call = NULL;
+  if (CCallingConventionRequiresIntsAsLongs) {
+    Node* crc_I2L    = ConvI2L(crc);
+    Node* length_I2L = ConvI2L(length);
+    call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
+                             stubAddr, stubName, TypePtr::BOTTOM,
+                             crc_I2L XTOP, src_start, length_I2L XTOP);
+  } else {
+    call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
                                  stubAddr, stubName, TypePtr::BOTTOM,
                                  crc, src_start, length);
+  }
   Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
   set_result(result);
   return true;
 }
 

@@ -5518,13 +5538,22 @@
 
   // Call the stub.
   address stubAddr = StubRoutines::updateBytesCRC32();
   const char *stubName = "updateBytesCRC32";
 
-  Node* call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
+  Node* call = NULL;
+  if (CCallingConventionRequiresIntsAsLongs) {
+    Node* crc_I2L    = ConvI2L(crc);
+    Node* length_I2L = ConvI2L(length);
+    call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
+                             stubAddr, stubName, TypePtr::BOTTOM,
+                             crc_I2L XTOP, src_start, length_I2L XTOP);
+  } else {
+    call = make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::updateBytesCRC32_Type(),
                                  stubAddr, stubName, TypePtr::BOTTOM,
                                  crc, src_start, length);
+  }
   Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
   set_result(result);
   return true;
 }
 

@@ -5757,21 +5786,37 @@
     // compatibility issues between Java key expansion and SPARC crypto instructions
     Node* original_k_start = get_original_key_start_from_aescrypt_object(aescrypt_object);
     if (original_k_start == NULL) return false;
 
     // Call the stub, passing src_start, dest_start, k_start, r_start, src_len and original_k_start
+    if (CCallingConventionRequiresIntsAsLongs) {
+      Node* len_I2L    = ConvI2L(len);
+      cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
+                                   OptoRuntime::cipherBlockChaining_aescrypt_Type(),
+                                   stubAddr, stubName, TypePtr::BOTTOM,
+                                   src_start, dest_start, k_start, r_start, len_I2L XTOP, original_k_start);
+    } else {
     cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
                                  OptoRuntime::cipherBlockChaining_aescrypt_Type(),
                                  stubAddr, stubName, TypePtr::BOTTOM,
                                  src_start, dest_start, k_start, r_start, len, original_k_start);
+    }
   } else {
     // Call the stub, passing src_start, dest_start, k_start, r_start and src_len
+    if (CCallingConventionRequiresIntsAsLongs) {
+      Node* len_I2L    = ConvI2L(len);
+      cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
+                                   OptoRuntime::cipherBlockChaining_aescrypt_Type(),
+                                   stubAddr, stubName, TypePtr::BOTTOM,
+                                   src_start, dest_start, k_start, r_start, len_I2L XTOP);
+    } else {
     cbcCrypt = make_runtime_call(RC_LEAF|RC_NO_FP,
                                  OptoRuntime::cipherBlockChaining_aescrypt_Type(),
                                  stubAddr, stubName, TypePtr::BOTTOM,
                                  src_start, dest_start, k_start, r_start, len);
   }
+  }
 
   // return cipher length (int)
   Node* retvalue = _gvn.transform(new ProjNode(cbcCrypt, TypeFunc::Parms));
   set_result(retvalue);
   return true;

@@ -6016,14 +6061,24 @@
     state = get_state_from_sha_object(sha_obj);
   }
   if (state == NULL) return false;
 
   // Call the stub.
-  Node* call = make_runtime_call(RC_LEAF|RC_NO_FP,
+  Node* call = NULL;
+  if (CCallingConventionRequiresIntsAsLongs) {
+    Node* ofs_I2L   = ConvI2L(ofs);
+    Node* limit_I2L = ConvI2L(limit);
+    call = make_runtime_call(RC_LEAF|RC_NO_FP,
+                             OptoRuntime::digestBase_implCompressMB_Type(),
+                             stubAddr, stubName, TypePtr::BOTTOM,
+                             src_start, state, ofs_I2L XTOP, limit_I2L XTOP);
+  } else {
+    call = make_runtime_call(RC_LEAF|RC_NO_FP,
                                  OptoRuntime::digestBase_implCompressMB_Type(),
                                  stubAddr, stubName, TypePtr::BOTTOM,
                                  src_start, state, ofs, limit);
+  }
   // return ofs (int)
   Node* result = _gvn.transform(new ProjNode(call, TypeFunc::Parms));
   set_result(result);
 
   return true;
< prev index next >