src/cpu/x86/vm/interpreterRT_x86_32.cpp

Print this page




  37 void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
  38    move(offset(), jni_offset() + 2);
  39    move(offset() + 1, jni_offset() + 1);
  40 }
  41 
  42 void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
  43   box (offset(), jni_offset() + 1);
  44 }
  45 
  46 void InterpreterRuntime::SignatureHandlerGenerator::move(int from_offset, int to_offset) {
  47   __ movl(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
  48   __ movl(Address(to(), to_offset * wordSize), temp());
  49 }
  50 
  51 
  52 void InterpreterRuntime::SignatureHandlerGenerator::box(int from_offset, int to_offset) {
  53   __ lea(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
  54   __ cmpptr(Address(from(), Interpreter::local_offset_in_bytes(from_offset)), (int32_t)NULL_WORD); // do not use temp() to avoid AGI
  55   Label L;
  56   __ jcc(Assembler::notZero, L);
  57   __ movptr(temp(), ((int32_t)NULL_WORD));
  58   __ bind(L);
  59   __ movptr(Address(to(), to_offset * wordSize), temp());
  60 }
  61 
  62 
  63 void InterpreterRuntime::SignatureHandlerGenerator::generate( uint64_t fingerprint) {
  64   // generate code to handle arguments
  65   iterate(fingerprint);
  66   // return result handler
  67   __ lea(rax,
  68          ExternalAddress((address)Interpreter::result_handler(method()->result_type())));
  69   // return
  70   __ ret(0);
  71   __ flush();
  72 }
  73 
  74 
  75 Register InterpreterRuntime::SignatureHandlerGenerator::from()       { return rdi; }
  76 Register InterpreterRuntime::SignatureHandlerGenerator::to()         { return rsp; }
  77 Register InterpreterRuntime::SignatureHandlerGenerator::temp()       { return rcx; }




  37 void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
  38    move(offset(), jni_offset() + 2);
  39    move(offset() + 1, jni_offset() + 1);
  40 }
  41 
  42 void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
  43   box (offset(), jni_offset() + 1);
  44 }
  45 
  46 void InterpreterRuntime::SignatureHandlerGenerator::move(int from_offset, int to_offset) {
  47   __ movl(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
  48   __ movl(Address(to(), to_offset * wordSize), temp());
  49 }
  50 
  51 
  52 void InterpreterRuntime::SignatureHandlerGenerator::box(int from_offset, int to_offset) {
  53   __ lea(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
  54   __ cmpptr(Address(from(), Interpreter::local_offset_in_bytes(from_offset)), (int32_t)NULL_WORD); // do not use temp() to avoid AGI
  55   Label L;
  56   __ jcc(Assembler::notZero, L);
  57   __ movptr(temp(), NULL_WORD);
  58   __ bind(L);
  59   __ movptr(Address(to(), to_offset * wordSize), temp());
  60 }
  61 
  62 
  63 void InterpreterRuntime::SignatureHandlerGenerator::generate( uint64_t fingerprint) {
  64   // generate code to handle arguments
  65   iterate(fingerprint);
  66   // return result handler
  67   __ lea(rax,
  68          ExternalAddress((address)Interpreter::result_handler(method()->result_type())));
  69   // return
  70   __ ret(0);
  71   __ flush();
  72 }
  73 
  74 
  75 Register InterpreterRuntime::SignatureHandlerGenerator::from()       { return rdi; }
  76 Register InterpreterRuntime::SignatureHandlerGenerator::to()         { return rsp; }
  77 Register InterpreterRuntime::SignatureHandlerGenerator::temp()       { return rcx; }