src/cpu/zero/vm/interpreterRT_zero.hpp

Fri, 08 Oct 2010 02:42:17 -0700

author
twisti
date
Fri, 08 Oct 2010 02:42:17 -0700
changeset 2200
a222fcfba398
parent 1907
c18cbe5936b8
child 2314
f95d63e2154a
permissions
-rw-r--r--

6990549: Zero and Shark fixes after 6978355 and 6953144
Reviewed-by: twisti
Contributed-by: Gary Benson <gbenson@redhat.com>

never@1445 1 /*
trims@1907 2 * Copyright (c) 2003, 2005, Oracle and/or its affiliates. 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 *
trims@1907 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 21 * or visit www.oracle.com if you need additional information or have any
trims@1907 22 * 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)
twisti@2200 95 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buffer->insts_end()),
never@1445 96 _cb(buffer) {
twisti@2200 97 _cb->set_insts_end((address) (cif() + 1));
never@1445 98 }
never@1445 99
never@1445 100 private:
never@1445 101 void push(intptr_t value) {
twisti@2200 102 intptr_t *dst = (intptr_t *) _cb->insts_end();
twisti@2200 103 _cb->set_insts_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