src/cpu/zero/vm/interpreterRT_zero.cpp

Tue, 13 Oct 2009 12:04:21 -0700

author
never
date
Tue, 13 Oct 2009 12:04:21 -0700
changeset 1445
354d3184f6b2
child 1814
f9271ff9d324
permissions
-rw-r--r--

6890308: integrate zero assembler hotspot changes
Reviewed-by: never
Contributed-by: gbenson@redhat.com

never@1445 1 /*
never@1445 2 * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
never@1445 3 * Copyright 2007, 2008 Red Hat, Inc.
never@1445 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
never@1445 5 *
never@1445 6 * This code is free software; you can redistribute it and/or modify it
never@1445 7 * under the terms of the GNU General Public License version 2 only, as
never@1445 8 * published by the Free Software Foundation.
never@1445 9 *
never@1445 10 * This code is distributed in the hope that it will be useful, but WITHOUT
never@1445 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
never@1445 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
never@1445 13 * version 2 for more details (a copy is included in the LICENSE file that
never@1445 14 * accompanied this code).
never@1445 15 *
never@1445 16 * You should have received a copy of the GNU General Public License version
never@1445 17 * 2 along with this work; if not, write to the Free Software Foundation,
never@1445 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
never@1445 19 *
never@1445 20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
never@1445 21 * CA 95054 USA or visit www.sun.com if you need additional information or
never@1445 22 * have any questions.
never@1445 23 *
never@1445 24 */
never@1445 25
never@1445 26 #include "incls/_precompiled.incl"
never@1445 27 #include "incls/_interpreterRT_zero.cpp.incl"
never@1445 28
never@1445 29 void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_int() {
never@1445 30 push(T_INT);
never@1445 31 _cif->nargs++;
never@1445 32 }
never@1445 33
never@1445 34 void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_long() {
never@1445 35 push(T_LONG);
never@1445 36 _cif->nargs++;
never@1445 37 }
never@1445 38
never@1445 39 void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_float() {
never@1445 40 push(T_FLOAT);
never@1445 41 _cif->nargs++;
never@1445 42 }
never@1445 43
never@1445 44 void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_double() {
never@1445 45 push(T_DOUBLE);
never@1445 46 _cif->nargs++;
never@1445 47 }
never@1445 48
never@1445 49 void InterpreterRuntime::SignatureHandlerGeneratorBase::pass_object() {
never@1445 50 push(T_OBJECT);
never@1445 51 _cif->nargs++;
never@1445 52 }
never@1445 53
never@1445 54 void InterpreterRuntime::SignatureHandlerGeneratorBase::push(BasicType type) {
never@1445 55 ffi_type *ftype;
never@1445 56 switch (type) {
never@1445 57 case T_VOID:
never@1445 58 ftype = &ffi_type_void;
never@1445 59 break;
never@1445 60
never@1445 61 case T_BOOLEAN:
never@1445 62 ftype = &ffi_type_uint8;
never@1445 63 break;
never@1445 64
never@1445 65 case T_CHAR:
never@1445 66 ftype = &ffi_type_uint16;
never@1445 67 break;
never@1445 68
never@1445 69 case T_BYTE:
never@1445 70 ftype = &ffi_type_sint8;
never@1445 71 break;
never@1445 72
never@1445 73 case T_SHORT:
never@1445 74 ftype = &ffi_type_sint16;
never@1445 75 break;
never@1445 76
never@1445 77 case T_INT:
never@1445 78 ftype = &ffi_type_sint32;
never@1445 79 break;
never@1445 80
never@1445 81 case T_LONG:
never@1445 82 ftype = &ffi_type_sint64;
never@1445 83 break;
never@1445 84
never@1445 85 case T_FLOAT:
never@1445 86 ftype = &ffi_type_float;
never@1445 87 break;
never@1445 88
never@1445 89 case T_DOUBLE:
never@1445 90 ftype = &ffi_type_double;
never@1445 91 break;
never@1445 92
never@1445 93 case T_OBJECT:
never@1445 94 case T_ARRAY:
never@1445 95 ftype = &ffi_type_pointer;
never@1445 96 break;
never@1445 97
never@1445 98 default:
never@1445 99 ShouldNotReachHere();
never@1445 100 }
never@1445 101 push((intptr_t) ftype);
never@1445 102 }
never@1445 103
never@1445 104 // For fast signature handlers the "signature handler" is generated
never@1445 105 // into a temporary buffer. It is then copied to its final location,
never@1445 106 // and pd_set_handler is called on it. We have this two stage thing
never@1445 107 // to accomodate this.
never@1445 108
never@1445 109 void InterpreterRuntime::SignatureHandlerGeneratorBase::generate(
never@1445 110 uint64_t fingerprint) {
never@1445 111
never@1445 112 // Build the argument types list
never@1445 113 pass_object();
never@1445 114 if (method()->is_static())
never@1445 115 pass_object();
never@1445 116 iterate(fingerprint);
never@1445 117
never@1445 118 // Tack on the result type
never@1445 119 push(method()->result_type());
never@1445 120 }
never@1445 121
never@1445 122 void InterpreterRuntime::SignatureHandler::finalize() {
never@1445 123 ffi_status status =
never@1445 124 ffi_prep_cif(cif(),
never@1445 125 FFI_DEFAULT_ABI,
never@1445 126 argument_count(),
never@1445 127 result_type(),
never@1445 128 argument_types());
never@1445 129
never@1445 130 assert(status == FFI_OK, "should be");
never@1445 131 }
never@1445 132
never@1445 133 IRT_ENTRY(address,
never@1445 134 InterpreterRuntime::slow_signature_handler(JavaThread* thread,
never@1445 135 methodOop method,
never@1445 136 intptr_t* unused1,
never@1445 137 intptr_t* unused2))
never@1445 138 ZeroStack *stack = thread->zero_stack();
never@1445 139
never@1445 140 int required_words =
never@1445 141 (align_size_up(sizeof(ffi_cif), wordSize) >> LogBytesPerWord) +
never@1445 142 (method->is_static() ? 2 : 1) + method->size_of_parameters() + 1;
never@1445 143 if (required_words > stack->available_words()) {
never@1445 144 Unimplemented();
never@1445 145 }
never@1445 146
never@1445 147 intptr_t *buf = (intptr_t *) stack->alloc(required_words * wordSize);
never@1445 148 SlowSignatureHandlerGenerator sshg(methodHandle(thread, method), buf);
never@1445 149 sshg.generate(UCONST64(-1));
never@1445 150
never@1445 151 SignatureHandler *handler = sshg.handler();
never@1445 152 handler->finalize();
never@1445 153
never@1445 154 return (address) handler;
never@1445 155 IRT_END
never@1445 156
never@1445 157 void SignatureHandlerLibrary::pd_set_handler(address handlerAddr) {
never@1445 158 InterpreterRuntime::SignatureHandler *handler =
never@1445 159 InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr);
never@1445 160
never@1445 161 handler->finalize();
never@1445 162 }

mercurial