src/cpu/zero/vm/interpreterRT_zero.hpp

Wed, 22 Jan 2014 17:42:23 -0800

author
kvn
date
Wed, 22 Jan 2014 17:42:23 -0800
changeset 6503
a9becfeecd1b
parent 2314
f95d63e2154a
child 6876
710a3c8b516e
permissions
-rw-r--r--

Merge

never@1445 1 /*
stefank@2314 2 * Copyright (c) 2003, 2010, 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
stefank@2314 26 #ifndef CPU_ZERO_VM_INTERPRETERRT_ZERO_HPP
stefank@2314 27 #define CPU_ZERO_VM_INTERPRETERRT_ZERO_HPP
stefank@2314 28
stefank@2314 29 #include "memory/allocation.hpp"
stefank@2314 30
never@1445 31 class SignatureHandler {
never@1445 32 public:
never@1445 33 static SignatureHandler *from_handlerAddr(address handlerAddr) {
never@1445 34 return (SignatureHandler *) handlerAddr;
never@1445 35 }
never@1445 36
never@1445 37 public:
never@1445 38 ffi_cif* cif() const {
never@1445 39 return (ffi_cif *) this;
never@1445 40 }
never@1445 41
never@1445 42 int argument_count() const {
never@1445 43 return cif()->nargs;
never@1445 44 }
never@1445 45
never@1445 46 ffi_type** argument_types() const {
never@1445 47 return (ffi_type**) (cif() + 1);
never@1445 48 }
never@1445 49
never@1445 50 ffi_type* argument_type(int i) const {
never@1445 51 return argument_types()[i];
never@1445 52 }
never@1445 53
never@1445 54 ffi_type* result_type() const {
never@1445 55 return *(argument_types() + argument_count());
never@1445 56 }
never@1445 57
never@1445 58 protected:
never@1445 59 friend class InterpreterRuntime;
never@1445 60 friend class SignatureHandlerLibrary;
never@1445 61
never@1445 62 void finalize();
never@1445 63 };
never@1445 64
never@1445 65 class SignatureHandlerGeneratorBase : public NativeSignatureIterator {
never@1445 66 private:
never@1445 67 ffi_cif* _cif;
never@1445 68
never@1445 69 protected:
never@1445 70 SignatureHandlerGeneratorBase(methodHandle method, ffi_cif *cif)
never@1445 71 : NativeSignatureIterator(method), _cif(cif) {
never@1445 72 _cif->nargs = 0;
never@1445 73 }
never@1445 74
never@1445 75 ffi_cif *cif() const {
never@1445 76 return _cif;
never@1445 77 }
never@1445 78
never@1445 79 public:
never@1445 80 void generate(uint64_t fingerprint);
never@1445 81
never@1445 82 private:
never@1445 83 void pass_int();
never@1445 84 void pass_long();
never@1445 85 void pass_float();
never@1445 86 void pass_double();
never@1445 87 void pass_object();
never@1445 88
never@1445 89 private:
never@1445 90 void push(BasicType type);
never@1445 91 virtual void push(intptr_t value) = 0;
never@1445 92 };
never@1445 93
never@1445 94 class SignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
never@1445 95 private:
never@1445 96 CodeBuffer* _cb;
never@1445 97
never@1445 98 public:
never@1445 99 SignatureHandlerGenerator(methodHandle method, CodeBuffer* buffer)
twisti@2200 100 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buffer->insts_end()),
never@1445 101 _cb(buffer) {
twisti@2200 102 _cb->set_insts_end((address) (cif() + 1));
never@1445 103 }
never@1445 104
never@1445 105 private:
never@1445 106 void push(intptr_t value) {
twisti@2200 107 intptr_t *dst = (intptr_t *) _cb->insts_end();
twisti@2200 108 _cb->set_insts_end((address) (dst + 1));
never@1445 109 *dst = value;
never@1445 110 }
never@1445 111 };
never@1445 112
never@1445 113 class SlowSignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
never@1445 114 private:
never@1445 115 intptr_t *_dst;
never@1445 116
never@1445 117 public:
never@1445 118 SlowSignatureHandlerGenerator(methodHandle method, intptr_t* buf)
never@1445 119 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buf) {
never@1445 120 _dst = (intptr_t *) (cif() + 1);
never@1445 121 }
never@1445 122
never@1445 123 private:
never@1445 124 void push(intptr_t value) {
never@1445 125 *(_dst++) = value;
never@1445 126 }
never@1445 127
never@1445 128 public:
never@1445 129 SignatureHandler *handler() const {
never@1445 130 return (SignatureHandler *) cif();
never@1445 131 }
never@1445 132 };
stefank@2314 133
stefank@2314 134 #endif // CPU_ZERO_VM_INTERPRETERRT_ZERO_HPP

mercurial