267 case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break; 268 case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break; 269 case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break; 270 default: ShouldNotReachHere(); 271 } 272 } 273 static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) { 274 switch (type) { 275 case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break; 276 case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break; 277 case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break; 278 case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break; 279 case T_INT: *int_addr_in_slot(slot_addr) = value->i; break; 280 case T_LONG: set_long_in_slot(slot_addr, value->j); break; 281 case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break; 282 case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break; 283 case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break; 284 default: ShouldNotReachHere(); 285 } 286 } 287 }; 288 289 //------------------------------------------------------------------------------------------------------------------------ 290 // The interpreter generator. 291 292 class Template; 293 class AbstractInterpreterGenerator: public StackObj { 294 protected: 295 InterpreterMacroAssembler* _masm; 296 297 // shared code sequences 298 // Converter for native abi result to tosca result 299 address generate_result_handler_for(BasicType type); 300 address generate_slow_signature_handler(); 301 302 void bang_stack_shadow_pages(bool native_call); 303 304 void generate_all(); 305 void initialize_method_handle_entries(); 306 307 public: 308 AbstractInterpreterGenerator(StubQueue* _code); 309 }; 310 311 #endif // SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP | 267 case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break; 268 case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break; 269 case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break; 270 default: ShouldNotReachHere(); 271 } 272 } 273 static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) { 274 switch (type) { 275 case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break; 276 case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break; 277 case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break; 278 case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break; 279 case T_INT: *int_addr_in_slot(slot_addr) = value->i; break; 280 case T_LONG: set_long_in_slot(slot_addr, value->j); break; 281 case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break; 282 case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break; 283 case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break; 284 default: ShouldNotReachHere(); 285 } 286 } 287 288 static void initialize_method_handle_entries(); 289 290 // PPC-only: Support abs and sqrt like in compiler. 291 // For others we can use a normal (native) entry. 292 static bool math_entry_available(MethodKind kind); 293 }; 294 295 //------------------------------------------------------------------------------------------------------------------------ 296 // The interpreter generator. 297 298 class Template; 299 class AbstractInterpreterGenerator: public StackObj { 300 protected: 301 InterpreterMacroAssembler* _masm; 302 303 public: 304 AbstractInterpreterGenerator(StubQueue* _code); 305 }; 306 307 #endif // SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP |