src/cpu/ppc/vm/bytecodeInterpreter_ppc.hpp

Wed, 15 Apr 2020 11:49:55 +0800

author
aoqi
date
Wed, 15 Apr 2020 11:49:55 +0800
changeset 9852
70aa912cebe5
parent 6876
710a3c8b516e
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * Copyright 2012, 2013 SAP AG. All rights reserved.
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_PPC_VM_BYTECODEINTERPRETER_PPC_HPP
aoqi@0 27 #define CPU_PPC_VM_BYTECODEINTERPRETER_PPC_HPP
aoqi@0 28
aoqi@0 29 // Platform specific for C++ based Interpreter
aoqi@0 30 #define LOTS_OF_REGS /* Lets interpreter use plenty of registers */
aoqi@0 31
aoqi@0 32 private:
aoqi@0 33
aoqi@0 34 // Save the bottom of the stack after frame manager setup. For ease of restoration after return
aoqi@0 35 // from recursive interpreter call.
aoqi@0 36 intptr_t* _frame_bottom; // Saved bottom of frame manager frame.
aoqi@0 37 address _last_Java_pc; // Pc to return to in frame manager.
aoqi@0 38 intptr_t* _last_Java_fp; // frame pointer
aoqi@0 39 intptr_t* _last_Java_sp; // stack pointer
aoqi@0 40 interpreterState _self_link; // Previous interpreter state // sometimes points to self???
aoqi@0 41 double _native_fresult; // Save result of native calls that might return floats.
aoqi@0 42 intptr_t _native_lresult; // Save result of native calls that might return handle/longs.
aoqi@0 43
aoqi@0 44 public:
aoqi@0 45 address last_Java_pc(void) { return _last_Java_pc; }
aoqi@0 46 intptr_t* last_Java_fp(void) { return _last_Java_fp; }
aoqi@0 47
aoqi@0 48 static ByteSize native_lresult_offset() {
aoqi@0 49 return byte_offset_of(BytecodeInterpreter, _native_lresult);
aoqi@0 50 }
aoqi@0 51
aoqi@0 52 static ByteSize native_fresult_offset() {
aoqi@0 53 return byte_offset_of(BytecodeInterpreter, _native_fresult);
aoqi@0 54 }
aoqi@0 55
aoqi@0 56 static void pd_layout_interpreterState(interpreterState istate, address last_Java_pc, intptr_t* last_Java_fp);
aoqi@0 57
aoqi@0 58 #define SET_LAST_JAVA_FRAME() THREAD->frame_anchor()->set(istate->_last_Java_sp, istate->_last_Java_pc);
aoqi@0 59 #define RESET_LAST_JAVA_FRAME() THREAD->frame_anchor()->clear();
aoqi@0 60
aoqi@0 61
aoqi@0 62 // Macros for accessing the stack.
aoqi@0 63 #undef STACK_INT
aoqi@0 64 #undef STACK_FLOAT
aoqi@0 65 #undef STACK_ADDR
aoqi@0 66 #undef STACK_OBJECT
aoqi@0 67 #undef STACK_DOUBLE
aoqi@0 68 #undef STACK_LONG
aoqi@0 69
aoqi@0 70 // JavaStack Implementation
aoqi@0 71 #define STACK_SLOT(offset) ((address) &topOfStack[-(offset)])
aoqi@0 72 #define STACK_INT(offset) (*((jint*) &topOfStack[-(offset)]))
aoqi@0 73 #define STACK_FLOAT(offset) (*((jfloat *) &topOfStack[-(offset)]))
aoqi@0 74 #define STACK_OBJECT(offset) (*((oop *) &topOfStack [-(offset)]))
aoqi@0 75 #define STACK_DOUBLE(offset) (((VMJavaVal64*) &topOfStack[-(offset)])->d)
aoqi@0 76 #define STACK_LONG(offset) (((VMJavaVal64 *) &topOfStack[-(offset)])->l)
aoqi@0 77
aoqi@0 78 #define SET_STACK_SLOT(value, offset) (*(intptr_t*)&topOfStack[-(offset)] = *(intptr_t*)(value))
aoqi@0 79 #define SET_STACK_ADDR(value, offset) (*((address *)&topOfStack[-(offset)]) = (value))
aoqi@0 80 #define SET_STACK_INT(value, offset) (*((jint *)&topOfStack[-(offset)]) = (value))
aoqi@0 81 #define SET_STACK_FLOAT(value, offset) (*((jfloat *)&topOfStack[-(offset)]) = (value))
aoqi@0 82 #define SET_STACK_OBJECT(value, offset) (*((oop *)&topOfStack[-(offset)]) = (value))
aoqi@0 83 #define SET_STACK_DOUBLE(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = (value))
aoqi@0 84 #define SET_STACK_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = \
aoqi@0 85 ((VMJavaVal64*)(addr))->d)
aoqi@0 86 #define SET_STACK_LONG(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = (value))
aoqi@0 87 #define SET_STACK_LONG_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = \
aoqi@0 88 ((VMJavaVal64*)(addr))->l)
aoqi@0 89 // JavaLocals implementation
aoqi@0 90
aoqi@0 91 #define LOCALS_SLOT(offset) ((intptr_t*)&locals[-(offset)])
aoqi@0 92 #define LOCALS_ADDR(offset) ((address)locals[-(offset)])
aoqi@0 93 #define LOCALS_INT(offset) (*(jint*)&(locals[-(offset)]))
aoqi@0 94 #define LOCALS_OBJECT(offset) (cast_to_oop(locals[-(offset)]))
aoqi@0 95 #define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)]))
aoqi@0 96 #define LOCALS_DOUBLE_AT(offset) (((address)&locals[-((offset) + 1)]))
aoqi@0 97
aoqi@0 98 #define SET_LOCALS_SLOT(value, offset) (*(intptr_t*)&locals[-(offset)] = *(intptr_t *)(value))
aoqi@0 99 #define SET_LOCALS_INT(value, offset) (*((jint *)&locals[-(offset)]) = (value))
aoqi@0 100 #define SET_LOCALS_DOUBLE(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = (value))
aoqi@0 101 #define SET_LOCALS_LONG(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->l = (value))
aoqi@0 102 #define SET_LOCALS_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = \
aoqi@0 103 ((VMJavaVal64*)(addr))->d)
aoqi@0 104
aoqi@0 105
aoqi@0 106 #endif // CPU_PPC_VM_BYTECODEINTERPRETER_PPC_PP

mercurial