1 /* |
1 /* |
2 * Copyright 1998-2006 Sun Microsystems, Inc. All Rights Reserved. |
2 * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
103 Register Rtmp3 = G3_scratch; |
103 Register Rtmp3 = G3_scratch; |
104 |
104 |
105 // the handle for a receiver will never be null |
105 // the handle for a receiver will never be null |
106 bool do_NULL_check = offset() != 0 || is_static(); |
106 bool do_NULL_check = offset() != 0 || is_static(); |
107 |
107 |
108 Address h_arg = Address(Llocals, 0, Interpreter::local_offset_in_bytes(offset())); |
108 Address h_arg = Address(Llocals, Interpreter::local_offset_in_bytes(offset())); |
109 __ ld_ptr(h_arg, Rtmp1); |
109 __ ld_ptr(h_arg, Rtmp1); |
110 #ifdef ASSERT |
110 #ifdef ASSERT |
111 if (TaggedStackInterpreter) { |
111 if (TaggedStackInterpreter) { |
112 // check we have the obj and not the tag |
112 // check we have the obj and not the tag |
113 Label ok; |
113 Label ok; |
118 __ stop("Native object passed tag by mistake"); |
118 __ stop("Native object passed tag by mistake"); |
119 __ bind(ok); |
119 __ bind(ok); |
120 } |
120 } |
121 #endif // ASSERT |
121 #endif // ASSERT |
122 if (!do_NULL_check) { |
122 if (!do_NULL_check) { |
123 __ add(h_arg, Rtmp2); |
123 __ add(h_arg.base(), h_arg.disp(), Rtmp2); |
124 } else { |
124 } else { |
125 if (Rtmp1 == Rtmp2) |
125 if (Rtmp1 == Rtmp2) |
126 __ tst(Rtmp1); |
126 __ tst(Rtmp1); |
127 else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair |
127 else __ addcc(G0, Rtmp1, Rtmp2); // optimize mov/test pair |
128 Label L; |
128 Label L; |
129 __ brx(Assembler::notZero, true, Assembler::pt, L); |
129 __ brx(Assembler::notZero, true, Assembler::pt, L); |
130 __ delayed()->add(h_arg, Rtmp2); |
130 __ delayed()->add(h_arg.base(), h_arg.disp(), Rtmp2); |
131 __ bind(L); |
131 __ bind(L); |
132 } |
132 } |
133 __ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op |
133 __ store_ptr_argument(Rtmp2, jni_arg); // this is often a no-op |
134 } |
134 } |
135 |
135 |
138 |
138 |
139 // generate code to handle arguments |
139 // generate code to handle arguments |
140 iterate(fingerprint); |
140 iterate(fingerprint); |
141 |
141 |
142 // return result handler |
142 // return result handler |
143 Address result_handler(Lscratch, Interpreter::result_handler(method()->result_type())); |
143 AddressLiteral result_handler(Interpreter::result_handler(method()->result_type())); |
144 __ sethi(result_handler); |
144 __ sethi(result_handler, Lscratch); |
145 __ retl(); |
145 __ retl(); |
146 __ delayed()->add(result_handler, result_handler.base()); |
146 __ delayed()->add(Lscratch, result_handler.low10(), Lscratch); |
147 |
147 |
148 __ flush(); |
148 __ flush(); |
149 } |
149 } |
150 |
150 |
151 |
151 |