src/cpu/mips/vm/interpreterRT_mips_64.cpp

Tue, 31 May 2016 00:22:06 -0400

author
aoqi
date
Tue, 31 May 2016 00:22:06 -0400
changeset 16
3cedde979d75
parent 1
2d8a650513c2
child 425
c3b0b3c41ffc
permissions
-rw-r--r--

[Code Reorganization] load_two_bytes_from_at_bcp -> get_2_byte_integer_at_bcp
remove useless MacroAssembler::store_two_byts_to_at_bcp
change MacroAssembler::load_two_bytes_from_at_bcp to InterpreterMacroAssembler::get_2_byte_integer_at_bcp
change MacroAssembler::get_4_byte_integer_at_bcp to InterpreterMacroAssembler::get_4_byte_integer_at_bcp

aoqi@1 1 /*
aoqi@1 2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
aoqi@1 3 * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved.
aoqi@1 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@1 5 *
aoqi@1 6 * This code is free software; you can redistribute it and/or modify it
aoqi@1 7 * under the terms of the GNU General Public License version 2 only, as
aoqi@1 8 * published by the Free Software Foundation.
aoqi@1 9 *
aoqi@1 10 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@1 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@1 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@1 13 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@1 14 * accompanied this code).
aoqi@1 15 *
aoqi@1 16 * You should have received a copy of the GNU General Public License version
aoqi@1 17 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@1 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@1 19 *
aoqi@1 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@1 21 * or visit www.oracle.com if you need additional information or have any
aoqi@1 22 * questions.
aoqi@1 23 *
aoqi@1 24 */
aoqi@1 25
aoqi@1 26 #include "precompiled.hpp"
aoqi@1 27 #include "interpreter/interpreter.hpp"
aoqi@1 28 #include "interpreter/interpreterRuntime.hpp"
aoqi@1 29 #include "memory/allocation.inline.hpp"
aoqi@1 30 #include "memory/universe.inline.hpp"
aoqi@1 31 #include "oops/method.hpp"
aoqi@1 32 #include "oops/oop.inline.hpp"
aoqi@1 33 #include "runtime/handles.inline.hpp"
aoqi@1 34 #include "runtime/icache.hpp"
aoqi@1 35 #include "runtime/interfaceSupport.hpp"
aoqi@1 36 #include "runtime/signature.hpp"
aoqi@1 37
aoqi@1 38
aoqi@1 39 #define __ _masm->
aoqi@1 40
aoqi@1 41 // Implementation of SignatureHandlerGenerator
aoqi@1 42
aoqi@1 43 //#define aoqi_test
aoqi@1 44 void InterpreterRuntime::SignatureHandlerGenerator::move(int from_offset, int to_offset) {
aoqi@1 45 __ ld(temp(), from(), Interpreter::local_offset_in_bytes(from_offset));
aoqi@1 46 __ sd(temp(), to(), to_offset * longSize);
aoqi@1 47 }
aoqi@1 48
aoqi@1 49 void InterpreterRuntime::SignatureHandlerGenerator::box(int from_offset, int to_offset) {
aoqi@1 50 __ addi(temp(), from(),Interpreter::local_offset_in_bytes(from_offset) );
aoqi@1 51 __ lw(AT, from(), Interpreter::local_offset_in_bytes(from_offset) );
aoqi@1 52
aoqi@1 53 Label L;
aoqi@1 54 __ bne(AT, R0, L);
aoqi@1 55 __ delayed()->nop();
aoqi@1 56 __ move(temp(), R0);
aoqi@1 57 __ bind(L);
aoqi@1 58 __ sw(temp(), to(), to_offset * wordSize);
aoqi@1 59 }
aoqi@1 60
aoqi@1 61 void InterpreterRuntime::SignatureHandlerGenerator::generate(uint64_t fingerprint) {
aoqi@1 62 // generate code to handle arguments
aoqi@1 63 iterate(fingerprint);
aoqi@1 64 // return result handler
aoqi@1 65 __ li(V0, AbstractInterpreter::result_handler(method()->result_type()));
aoqi@1 66 // return
aoqi@1 67 __ jr(RA);
aoqi@1 68 __ delayed()->nop();
aoqi@1 69
aoqi@1 70 __ flush();
aoqi@1 71 }
aoqi@1 72
aoqi@1 73 void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
aoqi@1 74 Argument jni_arg(jni_offset());
aoqi@1 75 __ lw(temp(), from(), Interpreter::local_offset_in_bytes(offset()));
aoqi@1 76 __ store_int_argument(temp(), jni_arg);
aoqi@1 77 }
aoqi@1 78
aoqi@1 79 void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
aoqi@1 80 Argument jni_arg(jni_offset());
aoqi@1 81
aoqi@1 82 Register Rtmp1 = temp();
aoqi@1 83
aoqi@1 84 // the handle for a receiver will never be null
aoqi@1 85 bool do_NULL_check = offset() != 0 || is_static();
aoqi@1 86 __ ld(Rtmp1, from(), Interpreter::local_offset_in_bytes(offset()));
aoqi@1 87
aoqi@1 88 Label L;
aoqi@1 89 __ bne(Rtmp1, R0, L);
aoqi@1 90 __ addu_long(Rtmp1, from(), Interpreter::local_offset_in_bytes(offset()));
aoqi@1 91 __ move(Rtmp1, R0);
aoqi@1 92 __ bind(L);
aoqi@1 93
aoqi@1 94 __ store_ptr_argument(Rtmp1, jni_arg);
aoqi@1 95 }
aoqi@1 96
aoqi@1 97 //the jvm specifies that long type takes 2 stack spaces, so in do_long(), _offset += 2.
aoqi@1 98 void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
aoqi@1 99 Argument jni_arg(jni_offset());
aoqi@1 100 /*
aoqi@1 101 __ lw(temp(), from(), Interpreter::local_offset_in_bytes(offset()));
aoqi@1 102 __ dsll32(temp(), temp(), 0);
aoqi@1 103 __ lw(AT, from(), Interpreter::local_offset_in_bytes(offset() + 1));
aoqi@1 104 __ daddu(temp(), temp(), AT);
aoqi@1 105 __ sd(temp(), to(), jni_offset() * longSize);
aoqi@1 106 */
aoqi@1 107 __ ld(temp(), from(), Interpreter::local_offset_in_bytes(offset() + 1));
aoqi@1 108 //__ store_long_argument(temp(), jni_arg);
aoqi@1 109 if(jni_arg.is_Register()) {
aoqi@1 110 __ move(jni_arg.as_Register(), temp());
aoqi@1 111 } else {
aoqi@1 112 __ sd(temp(), jni_arg.as_caller_address());
aoqi@1 113 }
aoqi@1 114 }
aoqi@1 115
aoqi@1 116 #if (defined _LP64) || (defined N32)
aoqi@1 117 void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
aoqi@1 118 Argument jni_arg(jni_offset());
aoqi@1 119 __ lwc1(F4, from(), Interpreter::local_offset_in_bytes(offset()));
aoqi@1 120 // __ sdc1(F4, to(), jni_offset() * longSize);
aoqi@1 121 __ store_float_argument(F4, jni_arg);
aoqi@1 122 }
aoqi@1 123
aoqi@1 124
aoqi@1 125 //the jvm specifies that double type takes 2 stack spaces, so in do_double(), _offset += 2.
aoqi@1 126 void InterpreterRuntime::SignatureHandlerGenerator::pass_double() {
aoqi@1 127 Argument jni_arg(jni_offset());
aoqi@1 128 __ ldc1(F4, from(), Interpreter::local_offset_in_bytes(offset() + 1));
aoqi@1 129 __ store_double_argument(F4, jni_arg);
aoqi@1 130 }
aoqi@1 131 #endif
aoqi@1 132
aoqi@1 133
aoqi@1 134 inline Register InterpreterRuntime::SignatureHandlerGenerator::from() { return LVP; }
aoqi@1 135 inline Register InterpreterRuntime::SignatureHandlerGenerator::to() { return SP; }
aoqi@1 136 inline Register InterpreterRuntime::SignatureHandlerGenerator::temp() { return RT4; }
aoqi@1 137
aoqi@1 138 // Implementation of SignatureHandlerLibrary
aoqi@1 139
aoqi@1 140 void SignatureHandlerLibrary::pd_set_handler(address handler) {}
aoqi@1 141
aoqi@1 142
aoqi@1 143 class SlowSignatureHandler
aoqi@1 144 : public NativeSignatureIterator {
aoqi@1 145 private:
aoqi@1 146 address _from;
aoqi@1 147 intptr_t* _to;
aoqi@1 148 intptr_t* _reg_args;
aoqi@1 149 intptr_t* _fp_identifiers;
aoqi@1 150 unsigned int _num_args;
aoqi@1 151 //bool _align;
aoqi@1 152
aoqi@1 153 virtual void pass_int()
aoqi@1 154 {
aoqi@1 155 jint from_obj = *(jint *)(_from+Interpreter::local_offset_in_bytes(0));
aoqi@1 156 _from -= Interpreter::stackElementSize;
aoqi@1 157
aoqi@1 158 if (_num_args < Argument::n_register_parameters) {
aoqi@1 159 *_reg_args++ = from_obj;
aoqi@1 160 _num_args++;
aoqi@1 161 } else {
aoqi@1 162 *_to++ = from_obj;
aoqi@1 163 }
aoqi@1 164 }
aoqi@1 165
aoqi@1 166 virtual void pass_long()
aoqi@1 167 {
aoqi@1 168 intptr_t from_obj = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
aoqi@1 169 _from -= 2 * Interpreter::stackElementSize;
aoqi@1 170
aoqi@1 171 if (_num_args < Argument::n_register_parameters) {
aoqi@1 172 *_reg_args++ = from_obj;
aoqi@1 173 _num_args++;
aoqi@1 174 } else {
aoqi@1 175 *_to++ = from_obj;
aoqi@1 176 }
aoqi@1 177 }
aoqi@1 178
aoqi@1 179 virtual void pass_object()
aoqi@1 180 {
aoqi@1 181 intptr_t *from_addr = (intptr_t*)(_from + Interpreter::local_offset_in_bytes(0));
aoqi@1 182 _from -= Interpreter::stackElementSize;
aoqi@1 183 if (_num_args < Argument::n_register_parameters) {
aoqi@1 184 *_reg_args++ = (*from_addr == 0) ? NULL : (intptr_t) from_addr;
aoqi@1 185 _num_args++;
aoqi@1 186 } else {
aoqi@1 187 *_to++ = (*from_addr == 0) ? NULL : (intptr_t) from_addr;
aoqi@1 188 }
aoqi@1 189 }
aoqi@1 190
aoqi@1 191 virtual void pass_float()
aoqi@1 192 {
aoqi@1 193 jint from_obj = *(jint *)(_from+Interpreter::local_offset_in_bytes(0));
aoqi@1 194 _from -= Interpreter::stackElementSize;
aoqi@1 195
aoqi@1 196 if (_num_args < Argument::n_float_register_parameters) {
aoqi@1 197 *_reg_args++ = from_obj;
aoqi@1 198 *_fp_identifiers |= (0x01 << (_num_args*2)); // mark as float
aoqi@1 199 _num_args++;
aoqi@1 200 } else {
aoqi@1 201 *_to++ = from_obj;
aoqi@1 202 }
aoqi@1 203 }
aoqi@1 204
aoqi@1 205 virtual void pass_double()
aoqi@1 206 {
aoqi@1 207 intptr_t from_obj = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
aoqi@1 208 _from -= 2*Interpreter::stackElementSize;
aoqi@1 209
aoqi@1 210 if (_num_args < Argument::n_float_register_parameters) {
aoqi@1 211 *_reg_args++ = from_obj;
aoqi@1 212 *_fp_identifiers |= (0x3 << (_num_args*2)); // mark as double
aoqi@1 213 _num_args++;
aoqi@1 214 } else {
aoqi@1 215 *_to++ = from_obj;
aoqi@1 216 }
aoqi@1 217 }
aoqi@1 218
aoqi@1 219 public:
aoqi@1 220 SlowSignatureHandler(methodHandle method, address from, intptr_t* to)
aoqi@1 221 : NativeSignatureIterator(method)
aoqi@1 222 {
aoqi@1 223 _from = from;
aoqi@1 224 _to = to;
aoqi@1 225
aoqi@1 226 //_reg_args = to - (method->is_static() ? 8 : 9);
aoqi@1 227 _reg_args = to - Argument::n_register_parameters + jni_offset() - 1;
aoqi@1 228 _fp_identifiers = to - 1;
aoqi@1 229 // _to = _to + 4; // Windows reserves stack space for register arguments
aoqi@1 230 *(int*) _fp_identifiers = 0;
aoqi@1 231 //_num_args = (method->is_static() ? 1 : 0);
aoqi@1 232 _num_args = jni_offset();
aoqi@1 233 }
aoqi@1 234 };
aoqi@1 235
aoqi@1 236
aoqi@1 237 IRT_ENTRY(address,
aoqi@1 238 InterpreterRuntime::slow_signature_handler(JavaThread* thread,
aoqi@1 239 Method* method,
aoqi@1 240 intptr_t* from,
aoqi@1 241 intptr_t* to))
aoqi@1 242 methodHandle m(thread, (Method*)method);
aoqi@1 243 assert(m->is_native(), "sanity check");
aoqi@1 244
aoqi@1 245 // handle arguments
aoqi@1 246 SlowSignatureHandler(m, (address)from, to).iterate(UCONST64(-1));
aoqi@1 247
aoqi@1 248 // return result handler
aoqi@1 249 return Interpreter::result_handler(m->result_type());
aoqi@1 250 IRT_END

mercurial