1960 void leave();
1961
1962 // V8/V9 integer multiply
1963 void mult(Register s1, Register s2, Register d);
1964 void mult(Register s1, int simm13a, Register d);
1965
1966 // V8/V9 read and write of condition codes.
1967 void read_ccr(Register d);
1968 void write_ccr(Register s);
1969
1970 // Manipulation of C++ bools
1971 // These are idioms to flag the need for care with accessing bools but on
1972 // this platform we assume byte size
1973
1974 inline void stbool( Register d, const Address& a, int offset = 0 ) { stb(d, a, offset); }
1975 inline void ldbool( const Address& a, Register d, int offset = 0 ) { ldsb( a, d, offset ); }
1976 inline void tstbool( Register s ) { tst(s); }
1977 inline void movbool( bool boolconst, Register d) { mov( (int) boolconst, d); }
1978
1979 // klass oop manipulations if compressed
1980 void load_klass(Register src_oop, Register dst);
1981 void store_klass(Register dst_oop, Register s1);
1982
1983 // oop manipulations
1984 void load_heap_oop(const Address& s, Register d, int offset = 0);
1985 void load_heap_oop(Register s1, Register s2, Register d);
1986 void load_heap_oop(Register s1, int simm13a, Register d);
1987 void store_heap_oop(Register d, Register s1, Register s2);
1988 void store_heap_oop(Register d, Register s1, int simm13a);
1989 void store_heap_oop(Register d, const Address& a, int offset = 0);
1990
1991 void encode_heap_oop(Register src, Register dst);
1992 void encode_heap_oop(Register r) {
1993 encode_heap_oop(r, r);
1994 }
1995 void decode_heap_oop(Register src, Register dst);
1996 void decode_heap_oop(Register r) {
1997 decode_heap_oop(r, r);
1998 }
1999 void encode_heap_oop_not_null(Register r);
2000 void decode_heap_oop_not_null(Register r);
2001 void encode_heap_oop_not_null(Register src, Register dst);
2086 #define verify_oop(reg) _verify_oop(reg, "broken oop " #reg, __FILE__, __LINE__)
2087 #define verify_oop_addr(addr) _verify_oop_addr(addr, "broken oop addr ", __FILE__, __LINE__)
2088
2089 // only if +VerifyOops
2090 void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
2091 // only if +VerifyFPU
2092 void stop(const char* msg); // prints msg, dumps registers and stops execution
2093 void warn(const char* msg); // prints msg, but don't stop
2094 void untested(const char* what = "");
2095 void unimplemented(const char* what = "") { char* b = new char[1024]; sprintf(b, "unimplemented: %s", what); stop(b); }
2096 void should_not_reach_here() { stop("should not reach here"); }
2097 void print_CPU_state();
2098
2099 // oops in code
2100 Address allocate_oop_address( jobject obj, Register d ); // allocate_index
2101 Address constant_oop_address( jobject obj, Register d ); // find_index
2102 inline void set_oop ( jobject obj, Register d ); // uses allocate_oop_address
2103 inline void set_oop_constant( jobject obj, Register d ); // uses constant_oop_address
2104 inline void set_oop ( Address obj_addr ); // same as load_address
2105
2106 // nop padding
2107 void align(int modulus);
2108
2109 // declare a safepoint
2110 void safepoint();
2111
2112 // factor out part of stop into subroutine to save space
2113 void stop_subroutine();
2114 // factor out part of verify_oop into subroutine to save space
2115 void verify_oop_subroutine();
2116
2117 // side-door communication with signalHandler in os_solaris.cpp
2118 static address _verify_oop_implicit_branch[3];
2119
2120 #ifndef PRODUCT
2121 static void test();
2122 #endif
2123
2124 // convert an incoming arglist to varargs format; put the pointer in d
2125 void set_varargs( Argument a, Register d );
|
1960 void leave();
1961
1962 // V8/V9 integer multiply
1963 void mult(Register s1, Register s2, Register d);
1964 void mult(Register s1, int simm13a, Register d);
1965
1966 // V8/V9 read and write of condition codes.
1967 void read_ccr(Register d);
1968 void write_ccr(Register s);
1969
1970 // Manipulation of C++ bools
1971 // These are idioms to flag the need for care with accessing bools but on
1972 // this platform we assume byte size
1973
1974 inline void stbool( Register d, const Address& a, int offset = 0 ) { stb(d, a, offset); }
1975 inline void ldbool( const Address& a, Register d, int offset = 0 ) { ldsb( a, d, offset ); }
1976 inline void tstbool( Register s ) { tst(s); }
1977 inline void movbool( bool boolconst, Register d) { mov( (int) boolconst, d); }
1978
1979 // klass oop manipulations if compressed
1980 void load_klass(Register src_oop, Register klass);
1981 void store_klass(Register klass, Register dst_oop);
1982
1983 // oop manipulations
1984 void load_heap_oop(const Address& s, Register d, int offset = 0);
1985 void load_heap_oop(Register s1, Register s2, Register d);
1986 void load_heap_oop(Register s1, int simm13a, Register d);
1987 void store_heap_oop(Register d, Register s1, Register s2);
1988 void store_heap_oop(Register d, Register s1, int simm13a);
1989 void store_heap_oop(Register d, const Address& a, int offset = 0);
1990
1991 void encode_heap_oop(Register src, Register dst);
1992 void encode_heap_oop(Register r) {
1993 encode_heap_oop(r, r);
1994 }
1995 void decode_heap_oop(Register src, Register dst);
1996 void decode_heap_oop(Register r) {
1997 decode_heap_oop(r, r);
1998 }
1999 void encode_heap_oop_not_null(Register r);
2000 void decode_heap_oop_not_null(Register r);
2001 void encode_heap_oop_not_null(Register src, Register dst);
2086 #define verify_oop(reg) _verify_oop(reg, "broken oop " #reg, __FILE__, __LINE__)
2087 #define verify_oop_addr(addr) _verify_oop_addr(addr, "broken oop addr ", __FILE__, __LINE__)
2088
2089 // only if +VerifyOops
2090 void verify_FPU(int stack_depth, const char* s = "illegal FPU state");
2091 // only if +VerifyFPU
2092 void stop(const char* msg); // prints msg, dumps registers and stops execution
2093 void warn(const char* msg); // prints msg, but don't stop
2094 void untested(const char* what = "");
2095 void unimplemented(const char* what = "") { char* b = new char[1024]; sprintf(b, "unimplemented: %s", what); stop(b); }
2096 void should_not_reach_here() { stop("should not reach here"); }
2097 void print_CPU_state();
2098
2099 // oops in code
2100 Address allocate_oop_address( jobject obj, Register d ); // allocate_index
2101 Address constant_oop_address( jobject obj, Register d ); // find_index
2102 inline void set_oop ( jobject obj, Register d ); // uses allocate_oop_address
2103 inline void set_oop_constant( jobject obj, Register d ); // uses constant_oop_address
2104 inline void set_oop ( Address obj_addr ); // same as load_address
2105
2106 void set_narrow_oop( jobject obj, Register d );
2107
2108 // nop padding
2109 void align(int modulus);
2110
2111 // declare a safepoint
2112 void safepoint();
2113
2114 // factor out part of stop into subroutine to save space
2115 void stop_subroutine();
2116 // factor out part of verify_oop into subroutine to save space
2117 void verify_oop_subroutine();
2118
2119 // side-door communication with signalHandler in os_solaris.cpp
2120 static address _verify_oop_implicit_branch[3];
2121
2122 #ifndef PRODUCT
2123 static void test();
2124 #endif
2125
2126 // convert an incoming arglist to varargs format; put the pointer in d
2127 void set_varargs( Argument a, Register d );
|