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());
|