src/cpu/zero/vm/interpreterRT_zero.hpp

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

author
never
date
Tue, 13 Oct 2009 12:04:21 -0700
changeset 1445
354d3184f6b2
child 1907
c18cbe5936b8
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 class SignatureHandler {
never@1445 27 public:
never@1445 28 static SignatureHandler *from_handlerAddr(address handlerAddr) {
never@1445 29 return (SignatureHandler *) handlerAddr;
never@1445 30 }
never@1445 31
never@1445 32 public:
never@1445 33 ffi_cif* cif() const {
never@1445 34 return (ffi_cif *) this;
never@1445 35 }
never@1445 36
never@1445 37 int argument_count() const {
never@1445 38 return cif()->nargs;
never@1445 39 }
never@1445 40
never@1445 41 ffi_type** argument_types() const {
never@1445 42 return (ffi_type**) (cif() + 1);
never@1445 43 }
never@1445 44
never@1445 45 ffi_type* argument_type(int i) const {
never@1445 46 return argument_types()[i];
never@1445 47 }
never@1445 48
never@1445 49 ffi_type* result_type() const {
never@1445 50 return *(argument_types() + argument_count());
never@1445 51 }
never@1445 52
never@1445 53 protected:
never@1445 54 friend class InterpreterRuntime;
never@1445 55 friend class SignatureHandlerLibrary;
never@1445 56
never@1445 57 void finalize();
never@1445 58 };
never@1445 59
never@1445 60 class SignatureHandlerGeneratorBase : public NativeSignatureIterator {
never@1445 61 private:
never@1445 62 ffi_cif* _cif;
never@1445 63
never@1445 64 protected:
never@1445 65 SignatureHandlerGeneratorBase(methodHandle method, ffi_cif *cif)
never@1445 66 : NativeSignatureIterator(method), _cif(cif) {
never@1445 67 _cif->nargs = 0;
never@1445 68 }
never@1445 69
never@1445 70 ffi_cif *cif() const {
never@1445 71 return _cif;
never@1445 72 }
never@1445 73
never@1445 74 public:
never@1445 75 void generate(uint64_t fingerprint);
never@1445 76
never@1445 77 private:
never@1445 78 void pass_int();
never@1445 79 void pass_long();
never@1445 80 void pass_float();
never@1445 81 void pass_double();
never@1445 82 void pass_object();
never@1445 83
never@1445 84 private:
never@1445 85 void push(BasicType type);
never@1445 86 virtual void push(intptr_t value) = 0;
never@1445 87 };
never@1445 88
never@1445 89 class SignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
never@1445 90 private:
never@1445 91 CodeBuffer* _cb;
never@1445 92
never@1445 93 public:
never@1445 94 SignatureHandlerGenerator(methodHandle method, CodeBuffer* buffer)
never@1445 95 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buffer->code_end()),
never@1445 96 _cb(buffer) {
never@1445 97 _cb->set_code_end((address) (cif() + 1));
never@1445 98 }
never@1445 99
never@1445 100 private:
never@1445 101 void push(intptr_t value) {
never@1445 102 intptr_t *dst = (intptr_t *) _cb->code_end();
never@1445 103 _cb->set_code_end((address) (dst + 1));
never@1445 104 *dst = value;
never@1445 105 }
never@1445 106 };
never@1445 107
never@1445 108 class SlowSignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
never@1445 109 private:
never@1445 110 intptr_t *_dst;
never@1445 111
never@1445 112 public:
never@1445 113 SlowSignatureHandlerGenerator(methodHandle method, intptr_t* buf)
never@1445 114 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buf) {
never@1445 115 _dst = (intptr_t *) (cif() + 1);
never@1445 116 }
never@1445 117
never@1445 118 private:
never@1445 119 void push(intptr_t value) {
never@1445 120 *(_dst++) = value;
never@1445 121 }
never@1445 122
never@1445 123 public:
never@1445 124 SignatureHandler *handler() const {
never@1445 125 return (SignatureHandler *) cif();
never@1445 126 }
never@1445 127 };

mercurial