44 _masm = new MacroAssembler(buffer);
45 }
46
47 void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
48 move(offset(), jni_offset() + 1);
49 }
50
51 void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
52 move(offset(), jni_offset() + 1);
53 }
54
55 void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
56 move(offset(), jni_offset() + 2);
57 move(offset() + 1, jni_offset() + 1);
58 }
59
60 void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
61 box (offset(), jni_offset() + 1);
62 }
63
64 void InterpreterRuntime::SignatureHandlerGenerator::move(int from_offset, int to_offset) {
65 __ movl(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
66 __ movl(Address(to(), to_offset * wordSize), temp());
67 }
68
69
70 void InterpreterRuntime::SignatureHandlerGenerator::box(int from_offset, int to_offset) {
71 __ lea(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
72 __ cmpptr(Address(from(), Interpreter::local_offset_in_bytes(from_offset)), NULL_WORD); // do not use temp() to avoid AGI
73 Label L;
74 __ jcc(Assembler::notZero, L);
75 __ movptr(temp(), NULL_WORD);
76 __ bind(L);
77 __ movptr(Address(to(), to_offset * wordSize), temp());
78 }
79
80
81 void InterpreterRuntime::SignatureHandlerGenerator::generate( uint64_t fingerprint) {
82 // generate code to handle arguments
83 iterate(fingerprint);
111
112 virtual void pass_float() {
113 *_to++ = *(jint *)(_from+Interpreter::local_offset_in_bytes(0));
114 _from -= Interpreter::stackElementSize;
115 }
116
117 virtual void pass_long() {
118 _to[0] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
119 _to[1] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(0));
120 _to += 2;
121 _from -= 2*Interpreter::stackElementSize;
122 }
123
124 virtual void pass_object() {
125 // pass address of from
126 intptr_t from_addr = (intptr_t)(_from + Interpreter::local_offset_in_bytes(0));
127 *_to++ = (*(intptr_t*)from_addr == 0) ? NULL_WORD : from_addr;
128 _from -= Interpreter::stackElementSize;
129 }
130
131 public:
132 SlowSignatureHandler(const methodHandle& method, address from, intptr_t* to) :
133 NativeSignatureIterator(method) {
134 _from = from;
135 _to = to + (is_static() ? 2 : 1);
136 }
137 };
138
139 JRT_ENTRY(address, InterpreterRuntime::slow_signature_handler(JavaThread* current, Method* method, intptr_t* from, intptr_t* to))
140 methodHandle m(current, (Method*)method);
141 assert(m->is_native(), "sanity check");
142 // handle arguments
143 SlowSignatureHandler(m, (address)from, to + 1).iterate((uint64_t)CONST64(-1));
144 // return result handler
145 return Interpreter::result_handler(m->result_type());
146 JRT_END
|
44 _masm = new MacroAssembler(buffer);
45 }
46
47 void InterpreterRuntime::SignatureHandlerGenerator::pass_int() {
48 move(offset(), jni_offset() + 1);
49 }
50
51 void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
52 move(offset(), jni_offset() + 1);
53 }
54
55 void InterpreterRuntime::SignatureHandlerGenerator::pass_long() {
56 move(offset(), jni_offset() + 2);
57 move(offset() + 1, jni_offset() + 1);
58 }
59
60 void InterpreterRuntime::SignatureHandlerGenerator::pass_object() {
61 box (offset(), jni_offset() + 1);
62 }
63
64 void InterpreterRuntime::SignatureHandlerGenerator::pass_valuetype() {
65 box (offset(), jni_offset() + 1);
66 }
67
68 void InterpreterRuntime::SignatureHandlerGenerator::move(int from_offset, int to_offset) {
69 __ movl(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
70 __ movl(Address(to(), to_offset * wordSize), temp());
71 }
72
73
74 void InterpreterRuntime::SignatureHandlerGenerator::box(int from_offset, int to_offset) {
75 __ lea(temp(), Address(from(), Interpreter::local_offset_in_bytes(from_offset)));
76 __ cmpptr(Address(from(), Interpreter::local_offset_in_bytes(from_offset)), NULL_WORD); // do not use temp() to avoid AGI
77 Label L;
78 __ jcc(Assembler::notZero, L);
79 __ movptr(temp(), NULL_WORD);
80 __ bind(L);
81 __ movptr(Address(to(), to_offset * wordSize), temp());
82 }
83
84
85 void InterpreterRuntime::SignatureHandlerGenerator::generate( uint64_t fingerprint) {
86 // generate code to handle arguments
87 iterate(fingerprint);
115
116 virtual void pass_float() {
117 *_to++ = *(jint *)(_from+Interpreter::local_offset_in_bytes(0));
118 _from -= Interpreter::stackElementSize;
119 }
120
121 virtual void pass_long() {
122 _to[0] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(1));
123 _to[1] = *(intptr_t*)(_from+Interpreter::local_offset_in_bytes(0));
124 _to += 2;
125 _from -= 2*Interpreter::stackElementSize;
126 }
127
128 virtual void pass_object() {
129 // pass address of from
130 intptr_t from_addr = (intptr_t)(_from + Interpreter::local_offset_in_bytes(0));
131 *_to++ = (*(intptr_t*)from_addr == 0) ? NULL_WORD : from_addr;
132 _from -= Interpreter::stackElementSize;
133 }
134
135 virtual void pass_valuetype() {
136 // pass address of from
137 intptr_t from_addr = (intptr_t)(_from + Interpreter::local_offset_in_bytes(0));
138 *_to++ = (*(intptr_t*)from_addr == 0) ? NULL_WORD : from_addr;
139 _from -= Interpreter::stackElementSize;
140 }
141
142 public:
143 SlowSignatureHandler(const methodHandle& method, address from, intptr_t* to) :
144 NativeSignatureIterator(method) {
145 _from = from;
146 _to = to + (is_static() ? 2 : 1);
147 }
148 };
149
150 JRT_ENTRY(address, InterpreterRuntime::slow_signature_handler(JavaThread* current, Method* method, intptr_t* from, intptr_t* to))
151 methodHandle m(current, (Method*)method);
152 assert(m->is_native(), "sanity check");
153 // handle arguments
154 SlowSignatureHandler(m, (address)from, to + 1).iterate((uint64_t)CONST64(-1));
155 // return result handler
156 return Interpreter::result_handler(m->result_type());
157 JRT_END
|