< prev index next >

src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp

Print this page




2166 
2167 
2168 #ifdef ASSERT
2169   bool reg_destroyed[RegisterImpl::number_of_registers];
2170   bool freg_destroyed[XMMRegisterImpl::number_of_registers];
2171   for ( int r = 0 ; r < RegisterImpl::number_of_registers ; r++ ) {
2172     reg_destroyed[r] = false;
2173   }
2174   for ( int f = 0 ; f < XMMRegisterImpl::number_of_registers ; f++ ) {
2175     freg_destroyed[f] = false;
2176   }
2177 
2178 #endif /* ASSERT */
2179 
2180   // This may iterate in two different directions depending on the
2181   // kind of native it is.  The reason is that for regular JNI natives
2182   // the incoming and outgoing registers are offset upwards and for
2183   // critical natives they are offset down.
2184   GrowableArray<int> arg_order(2 * total_in_args);
2185   VMRegPair tmp_vmreg;
2186   tmp_vmreg.set1(rbx->as_VMReg());
2187 
2188   if (!is_critical_native) {
2189     for (int i = total_in_args - 1, c_arg = total_c_args - 1; i >= 0; i--, c_arg--) {
2190       arg_order.push(i);
2191       arg_order.push(c_arg);
2192     }
2193   } else {
2194     // Compute a valid move order, using tmp_vmreg to break any cycles
2195     ComputeMoveOrder cmo(total_in_args, in_regs, total_c_args, out_regs, in_sig_bt, arg_order, tmp_vmreg);
2196   }
2197 
2198   int temploc = -1;
2199   for (int ai = 0; ai < arg_order.length(); ai += 2) {
2200     int i = arg_order.at(ai);
2201     int c_arg = arg_order.at(ai + 1);
2202     __ block_comment(err_msg("move %d -> %d", i, c_arg));
2203     if (c_arg == -1) {
2204       assert(is_critical_native, "should only be required for critical natives");
2205       // This arg needs to be moved to a temporary
2206       __ mov(tmp_vmreg.first()->as_Register(), in_regs[i].first()->as_Register());




2166 
2167 
2168 #ifdef ASSERT
2169   bool reg_destroyed[RegisterImpl::number_of_registers];
2170   bool freg_destroyed[XMMRegisterImpl::number_of_registers];
2171   for ( int r = 0 ; r < RegisterImpl::number_of_registers ; r++ ) {
2172     reg_destroyed[r] = false;
2173   }
2174   for ( int f = 0 ; f < XMMRegisterImpl::number_of_registers ; f++ ) {
2175     freg_destroyed[f] = false;
2176   }
2177 
2178 #endif /* ASSERT */
2179 
2180   // This may iterate in two different directions depending on the
2181   // kind of native it is.  The reason is that for regular JNI natives
2182   // the incoming and outgoing registers are offset upwards and for
2183   // critical natives they are offset down.
2184   GrowableArray<int> arg_order(2 * total_in_args);
2185   VMRegPair tmp_vmreg;
2186   tmp_vmreg.set2(rbx->as_VMReg());
2187 
2188   if (!is_critical_native) {
2189     for (int i = total_in_args - 1, c_arg = total_c_args - 1; i >= 0; i--, c_arg--) {
2190       arg_order.push(i);
2191       arg_order.push(c_arg);
2192     }
2193   } else {
2194     // Compute a valid move order, using tmp_vmreg to break any cycles
2195     ComputeMoveOrder cmo(total_in_args, in_regs, total_c_args, out_regs, in_sig_bt, arg_order, tmp_vmreg);
2196   }
2197 
2198   int temploc = -1;
2199   for (int ai = 0; ai < arg_order.length(); ai += 2) {
2200     int i = arg_order.at(ai);
2201     int c_arg = arg_order.at(ai + 1);
2202     __ block_comment(err_msg("move %d -> %d", i, c_arg));
2203     if (c_arg == -1) {
2204       assert(is_critical_native, "should only be required for critical natives");
2205       // This arg needs to be moved to a temporary
2206       __ mov(tmp_vmreg.first()->as_Register(), in_regs[i].first()->as_Register());


< prev index next >