src/cpu/ppc/vm/bytecodeInterpreter_ppc.hpp

Wed, 27 Nov 2013 16:16:21 -0800

author
goetz
date
Wed, 27 Nov 2013 16:16:21 -0800
changeset 6490
41b780b43b74
parent 6483
018b357638aa
child 6495
67fa91961822
permissions
-rw-r--r--

8029015: PPC64 (part 216): opto: trap based null and range checks
Summary: On PPC64 use tdi instruction that does a compare and raises SIGTRAP for NULL and range checks.
Reviewed-by: kvn

goetz@6458 1 /*
goetz@6458 2 * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
goetz@6458 3 * Copyright 2012, 2013 SAP AG. All rights reserved.
goetz@6458 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
goetz@6458 5 *
goetz@6458 6 * This code is free software; you can redistribute it and/or modify it
goetz@6458 7 * under the terms of the GNU General Public License version 2 only, as
goetz@6458 8 * published by the Free Software Foundation.
goetz@6458 9 *
goetz@6458 10 * This code is distributed in the hope that it will be useful, but WITHOUT
goetz@6458 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
goetz@6458 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
goetz@6458 13 * version 2 for more details (a copy is included in the LICENSE file that
goetz@6458 14 * accompanied this code).
goetz@6458 15 *
goetz@6458 16 * You should have received a copy of the GNU General Public License version
goetz@6458 17 * 2 along with this work; if not, write to the Free Software Foundation,
goetz@6458 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
goetz@6458 19 *
goetz@6458 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
goetz@6458 21 * or visit www.oracle.com if you need additional information or have any
goetz@6458 22 * questions.
goetz@6458 23 *
goetz@6458 24 */
goetz@6458 25
goetz@6458 26 #ifndef CPU_PPC_VM_BYTECODEINTERPRETER_PPC_HPP
goetz@6458 27 #define CPU_PPC_VM_BYTECODEINTERPRETER_PPC_HPP
goetz@6458 28
goetz@6458 29 // Platform specific for C++ based Interpreter
goetz@6458 30 #define LOTS_OF_REGS /* Lets interpreter use plenty of registers */
goetz@6458 31
goetz@6458 32 private:
goetz@6458 33
goetz@6458 34 // Save the bottom of the stack after frame manager setup. For ease of restoration after return
goetz@6458 35 // from recursive interpreter call.
goetz@6458 36 intptr_t* _frame_bottom; // Saved bottom of frame manager frame.
goetz@6458 37 address _last_Java_pc; // Pc to return to in frame manager.
goetz@6458 38 intptr_t* _last_Java_fp; // frame pointer
goetz@6458 39 intptr_t* _last_Java_sp; // stack pointer
goetz@6458 40 interpreterState _self_link; // Previous interpreter state // sometimes points to self???
goetz@6458 41 double _native_fresult; // Save result of native calls that might return floats.
goetz@6458 42 intptr_t _native_lresult; // Save result of native calls that might return handle/longs.
goetz@6458 43
goetz@6458 44 public:
goetz@6458 45 address last_Java_pc(void) { return _last_Java_pc; }
goetz@6458 46 intptr_t* last_Java_fp(void) { return _last_Java_fp; }
goetz@6458 47
goetz@6458 48 static ByteSize native_lresult_offset() {
goetz@6458 49 return byte_offset_of(BytecodeInterpreter, _native_lresult);
goetz@6458 50 }
goetz@6458 51
goetz@6458 52 static ByteSize native_fresult_offset() {
goetz@6458 53 return byte_offset_of(BytecodeInterpreter, _native_fresult);
goetz@6458 54 }
goetz@6458 55
goetz@6458 56 static void pd_layout_interpreterState(interpreterState istate, address last_Java_pc, intptr_t* last_Java_fp);
goetz@6458 57
goetz@6458 58 #define SET_LAST_JAVA_FRAME() THREAD->frame_anchor()->set(istate->_last_Java_sp, istate->_last_Java_pc);
goetz@6458 59 #define RESET_LAST_JAVA_FRAME() THREAD->frame_anchor()->clear();
goetz@6458 60
goetz@6458 61
goetz@6458 62 // Macros for accessing the stack.
goetz@6458 63 #undef STACK_INT
goetz@6458 64 #undef STACK_FLOAT
goetz@6458 65 #undef STACK_ADDR
goetz@6458 66 #undef STACK_OBJECT
goetz@6458 67 #undef STACK_DOUBLE
goetz@6458 68 #undef STACK_LONG
goetz@6458 69
goetz@6458 70 // JavaStack Implementation
goetz@6458 71 #define STACK_SLOT(offset) ((address) &topOfStack[-(offset)])
goetz@6458 72 #define STACK_INT(offset) (*((jint*) &topOfStack[-(offset)]))
goetz@6458 73 #define STACK_FLOAT(offset) (*((jfloat *) &topOfStack[-(offset)]))
goetz@6458 74 #define STACK_OBJECT(offset) (*((oop *) &topOfStack [-(offset)]))
goetz@6458 75 #define STACK_DOUBLE(offset) (((VMJavaVal64*) &topOfStack[-(offset)])->d)
goetz@6458 76 #define STACK_LONG(offset) (((VMJavaVal64 *) &topOfStack[-(offset)])->l)
goetz@6458 77
goetz@6458 78 #define SET_STACK_SLOT(value, offset) (*(intptr_t*)&topOfStack[-(offset)] = *(intptr_t*)(value))
goetz@6458 79 #define SET_STACK_ADDR(value, offset) (*((address *)&topOfStack[-(offset)]) = (value))
goetz@6458 80 #define SET_STACK_INT(value, offset) (*((jint *)&topOfStack[-(offset)]) = (value))
goetz@6458 81 #define SET_STACK_FLOAT(value, offset) (*((jfloat *)&topOfStack[-(offset)]) = (value))
goetz@6458 82 #define SET_STACK_OBJECT(value, offset) (*((oop *)&topOfStack[-(offset)]) = (value))
goetz@6458 83 #define SET_STACK_DOUBLE(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = (value))
goetz@6458 84 #define SET_STACK_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->d = \
goetz@6458 85 ((VMJavaVal64*)(addr))->d)
goetz@6458 86 #define SET_STACK_LONG(value, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = (value))
goetz@6458 87 #define SET_STACK_LONG_FROM_ADDR(addr, offset) (((VMJavaVal64*)&topOfStack[-(offset)])->l = \
goetz@6458 88 ((VMJavaVal64*)(addr))->l)
goetz@6458 89 // JavaLocals implementation
goetz@6458 90
goetz@6458 91 #define LOCALS_SLOT(offset) ((intptr_t*)&locals[-(offset)])
goetz@6458 92 #define LOCALS_ADDR(offset) ((address)locals[-(offset)])
goetz@6458 93 #define LOCALS_INT(offset) (*(jint*)&(locals[-(offset)]))
simonis@6483 94 #define LOCALS_OBJECT(offset) (cast_to_oop(locals[-(offset)]))
goetz@6458 95 #define LOCALS_LONG_AT(offset) (((address)&locals[-((offset) + 1)]))
goetz@6458 96 #define LOCALS_DOUBLE_AT(offset) (((address)&locals[-((offset) + 1)]))
goetz@6458 97
goetz@6458 98 #define SET_LOCALS_SLOT(value, offset) (*(intptr_t*)&locals[-(offset)] = *(intptr_t *)(value))
goetz@6458 99 #define SET_LOCALS_INT(value, offset) (*((jint *)&locals[-(offset)]) = (value))
goetz@6458 100 #define SET_LOCALS_DOUBLE(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = (value))
goetz@6458 101 #define SET_LOCALS_LONG(value, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->l = (value))
goetz@6458 102 #define SET_LOCALS_DOUBLE_FROM_ADDR(addr, offset) (((VMJavaVal64*)&locals[-((offset)+1)])->d = \
goetz@6458 103
goetz@6458 104
goetz@6458 105 #endif // CPU_PPC_VM_BYTECODEINTERPRETER_PPC_PP

mercurial