comparison src/share/vm/asm/assembler.hpp @ 622:56aae7be60d4

6812678: macro assembler needs delayed binding of a few constants (for 6655638) Summary: minor assembler enhancements preparing for method handles Reviewed-by: kvn
author jrose
date Wed, 04 Mar 2009 09:58:39 -0800
parents 98cb887364d3
children c89f86385056
comparison
equal deleted inserted replaced
621:19f25e603e7b 622:56aae7be60d4
138 Label() { 138 Label() {
139 init(); 139 init();
140 } 140 }
141 }; 141 };
142 142
143 // A union type for code which has to assemble both constant and
144 // non-constant operands, when the distinction cannot be made
145 // statically.
146 class RegisterConstant VALUE_OBJ_CLASS_SPEC {
147 private:
148 Register _r;
149 intptr_t _c;
150
151 public:
152 RegisterConstant(): _r(noreg), _c(0) {}
153 RegisterConstant(Register r): _r(r), _c(0) {}
154 RegisterConstant(intptr_t c): _r(noreg), _c(c) {}
155
156 Register as_register() const { assert(is_register(),""); return _r; }
157 intptr_t as_constant() const { assert(is_constant(),""); return _c; }
158
159 Register register_or_noreg() const { return _r; }
160 intptr_t constant_or_zero() const { return _c; }
161
162 bool is_register() const { return _r != noreg; }
163 bool is_constant() const { return _r == noreg; }
164 };
143 165
144 // The Abstract Assembler: Pure assembler doing NO optimizations on the 166 // The Abstract Assembler: Pure assembler doing NO optimizations on the
145 // instruction level; i.e., what you write is what you get. 167 // instruction level; i.e., what you write is what you get.
146 // The Assembler is generating code into a CodeBuffer. 168 // The Assembler is generating code into a CodeBuffer.
147 class AbstractAssembler : public ResourceObj { 169 class AbstractAssembler : public ResourceObj {
278 return ptr; 300 return ptr;
279 } 301 }
280 inline address address_constant(Label& L); 302 inline address address_constant(Label& L);
281 inline address address_table_constant(GrowableArray<Label*> label); 303 inline address address_table_constant(GrowableArray<Label*> label);
282 304
305 // Bootstrapping aid to cope with delayed determination of constants.
306 // Returns a static address which will eventually contain the constant.
307 // The value zero (NULL) stands instead of a constant which is still uncomputed.
308 // Thus, the eventual value of the constant must not be zero.
309 // This is fine, since this is designed for embedding object field
310 // offsets in code which must be generated before the object class is loaded.
311 // Field offsets are never zero, since an object's header (mark word)
312 // is located at offset zero.
313 RegisterConstant delayed_value(int(*value_fn)(), Register tmp, int offset = 0) {
314 return delayed_value(delayed_value_addr(value_fn), tmp, offset);
315 }
316 RegisterConstant delayed_value(address(*value_fn)(), Register tmp, int offset = 0) {
317 return delayed_value(delayed_value_addr(value_fn), tmp, offset);
318 }
319 virtual RegisterConstant delayed_value(intptr_t* delayed_value_addr, Register tmp, int offset) = 0;
320 // Last overloading is platform-dependent; look in assembler_<arch>.cpp.
321 static intptr_t* delayed_value_addr(int(*constant_fn)());
322 static intptr_t* delayed_value_addr(address(*constant_fn)());
323 static void update_delayed_values();
324
283 // Bang stack to trigger StackOverflowError at a safe location 325 // Bang stack to trigger StackOverflowError at a safe location
284 // implementation delegates to machine-specific bang_stack_with_offset 326 // implementation delegates to machine-specific bang_stack_with_offset
285 void generate_stack_overflow_check( int frame_size_in_bytes ); 327 void generate_stack_overflow_check( int frame_size_in_bytes );
286 virtual void bang_stack_with_offset(int offset) = 0; 328 virtual void bang_stack_with_offset(int offset) = 0;
287 329