src/cpu/zero/vm/interpreterRT_zero.hpp

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * Copyright 2007, 2008 Red Hat, Inc.
aoqi@0 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 5 *
aoqi@0 6 * This code is free software; you can redistribute it and/or modify it
aoqi@0 7 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 8 * published by the Free Software Foundation.
aoqi@0 9 *
aoqi@0 10 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 13 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 14 * accompanied this code).
aoqi@0 15 *
aoqi@0 16 * You should have received a copy of the GNU General Public License version
aoqi@0 17 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 19 *
aoqi@0 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 21 * or visit www.oracle.com if you need additional information or have any
aoqi@0 22 * questions.
aoqi@0 23 *
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 #ifndef CPU_ZERO_VM_INTERPRETERRT_ZERO_HPP
aoqi@0 27 #define CPU_ZERO_VM_INTERPRETERRT_ZERO_HPP
aoqi@0 28
aoqi@0 29 #include "memory/allocation.hpp"
aoqi@0 30
aoqi@0 31 class SignatureHandler {
aoqi@0 32 public:
aoqi@0 33 static SignatureHandler *from_handlerAddr(address handlerAddr) {
aoqi@0 34 return (SignatureHandler *) handlerAddr;
aoqi@0 35 }
aoqi@0 36
aoqi@0 37 public:
aoqi@0 38 ffi_cif* cif() const {
aoqi@0 39 return (ffi_cif *) this;
aoqi@0 40 }
aoqi@0 41
aoqi@0 42 int argument_count() const {
aoqi@0 43 return cif()->nargs;
aoqi@0 44 }
aoqi@0 45
aoqi@0 46 ffi_type** argument_types() const {
aoqi@0 47 return (ffi_type**) (cif() + 1);
aoqi@0 48 }
aoqi@0 49
aoqi@0 50 ffi_type* argument_type(int i) const {
aoqi@0 51 return argument_types()[i];
aoqi@0 52 }
aoqi@0 53
aoqi@0 54 ffi_type* result_type() const {
aoqi@0 55 return *(argument_types() + argument_count());
aoqi@0 56 }
aoqi@0 57
aoqi@0 58 protected:
aoqi@0 59 friend class InterpreterRuntime;
aoqi@0 60 friend class SignatureHandlerLibrary;
aoqi@0 61
aoqi@0 62 void finalize();
aoqi@0 63 };
aoqi@0 64
aoqi@0 65 class SignatureHandlerGeneratorBase : public NativeSignatureIterator {
aoqi@0 66 private:
aoqi@0 67 ffi_cif* _cif;
aoqi@0 68
aoqi@0 69 protected:
aoqi@0 70 SignatureHandlerGeneratorBase(methodHandle method, ffi_cif *cif)
aoqi@0 71 : NativeSignatureIterator(method), _cif(cif) {
aoqi@0 72 _cif->nargs = 0;
aoqi@0 73 }
aoqi@0 74
aoqi@0 75 ffi_cif *cif() const {
aoqi@0 76 return _cif;
aoqi@0 77 }
aoqi@0 78
aoqi@0 79 public:
aoqi@0 80 void generate(uint64_t fingerprint);
aoqi@0 81
aoqi@0 82 private:
aoqi@0 83 void pass_int();
aoqi@0 84 void pass_long();
aoqi@0 85 void pass_float();
aoqi@0 86 void pass_double();
aoqi@0 87 void pass_object();
aoqi@0 88
aoqi@0 89 private:
aoqi@0 90 void push(BasicType type);
aoqi@0 91 virtual void push(intptr_t value) = 0;
aoqi@0 92 };
aoqi@0 93
aoqi@0 94 class SignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
aoqi@0 95 private:
aoqi@0 96 CodeBuffer* _cb;
aoqi@0 97
aoqi@0 98 public:
aoqi@0 99 SignatureHandlerGenerator(methodHandle method, CodeBuffer* buffer)
aoqi@0 100 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buffer->insts_end()),
aoqi@0 101 _cb(buffer) {
aoqi@0 102 _cb->set_insts_end((address) (cif() + 1));
aoqi@0 103 }
aoqi@0 104
aoqi@0 105 private:
aoqi@0 106 void push(intptr_t value) {
aoqi@0 107 intptr_t *dst = (intptr_t *) _cb->insts_end();
aoqi@0 108 _cb->set_insts_end((address) (dst + 1));
aoqi@0 109 *dst = value;
aoqi@0 110 }
aoqi@0 111 };
aoqi@0 112
aoqi@0 113 class SlowSignatureHandlerGenerator : public SignatureHandlerGeneratorBase {
aoqi@0 114 private:
aoqi@0 115 intptr_t *_dst;
aoqi@0 116
aoqi@0 117 public:
aoqi@0 118 SlowSignatureHandlerGenerator(methodHandle method, intptr_t* buf)
aoqi@0 119 : SignatureHandlerGeneratorBase(method, (ffi_cif *) buf) {
aoqi@0 120 _dst = (intptr_t *) (cif() + 1);
aoqi@0 121 }
aoqi@0 122
aoqi@0 123 private:
aoqi@0 124 void push(intptr_t value) {
aoqi@0 125 *(_dst++) = value;
aoqi@0 126 }
aoqi@0 127
aoqi@0 128 public:
aoqi@0 129 SignatureHandler *handler() const {
aoqi@0 130 return (SignatureHandler *) cif();
aoqi@0 131 }
aoqi@0 132 };
aoqi@0 133
aoqi@0 134 #endif // CPU_ZERO_VM_INTERPRETERRT_ZERO_HPP

mercurial