frame_sparc.cpp revision 0:a61af66fc99e
1/*
2 * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
24
25# include "incls/_precompiled.incl"
26# include "incls/_frame_sparc.cpp.incl"
27
28void RegisterMap::pd_clear() {
29  if (_thread->has_last_Java_frame()) {
30    frame fr = _thread->last_frame();
31    _window = fr.sp();
32  } else {
33    _window = NULL;
34  }
35  _younger_window = NULL;
36}
37
38
39// Unified register numbering scheme: each 32-bits counts as a register
40// number, so all the V9 registers take 2 slots.
41const static int R_L_nums[] = {0+040,2+040,4+040,6+040,8+040,10+040,12+040,14+040};
42const static int R_I_nums[] = {0+060,2+060,4+060,6+060,8+060,10+060,12+060,14+060};
43const static int R_O_nums[] = {0+020,2+020,4+020,6+020,8+020,10+020,12+020,14+020};
44const static int R_G_nums[] = {0+000,2+000,4+000,6+000,8+000,10+000,12+000,14+000};
45static RegisterMap::LocationValidType bad_mask = 0;
46static RegisterMap::LocationValidType R_LIO_mask = 0;
47static bool register_map_inited = false;
48
49static void register_map_init() {
50  if (!register_map_inited) {
51    register_map_inited = true;
52    int i;
53    for (i = 0; i < 8; i++) {
54      assert(R_L_nums[i] < RegisterMap::location_valid_type_size, "in first chunk");
55      assert(R_I_nums[i] < RegisterMap::location_valid_type_size, "in first chunk");
56      assert(R_O_nums[i] < RegisterMap::location_valid_type_size, "in first chunk");
57      assert(R_G_nums[i] < RegisterMap::location_valid_type_size, "in first chunk");
58    }
59
60    bad_mask |= (1LL << R_O_nums[6]); // SP
61    bad_mask |= (1LL << R_O_nums[7]); // cPC
62    bad_mask |= (1LL << R_I_nums[6]); // FP
63    bad_mask |= (1LL << R_I_nums[7]); // rPC
64    bad_mask |= (1LL << R_G_nums[2]); // TLS
65    bad_mask |= (1LL << R_G_nums[7]); // reserved by libthread
66
67    for (i = 0; i < 8; i++) {
68      R_LIO_mask |= (1LL << R_L_nums[i]);
69      R_LIO_mask |= (1LL << R_I_nums[i]);
70      R_LIO_mask |= (1LL << R_O_nums[i]);
71    }
72  }
73}
74
75
76address RegisterMap::pd_location(VMReg regname) const {
77  register_map_init();
78
79  assert(regname->is_reg(), "sanity check");
80  // Only the GPRs get handled this way
81  if( !regname->is_Register())
82    return NULL;
83
84  // don't talk about bad registers
85  if ((bad_mask & ((LocationValidType)1 << regname->value())) != 0) {
86    return NULL;
87  }
88
89  // Convert to a GPR
90  Register reg;
91  int second_word = 0;
92  // 32-bit registers for in, out and local
93  if (!regname->is_concrete()) {
94    // HMM ought to return NULL for any non-concrete (odd) vmreg
95    // this all tied up in the fact we put out double oopMaps for
96    // register locations. When that is fixed we'd will return NULL
97    // (or assert here).
98    reg = regname->prev()->as_Register();
99#ifdef _LP64
100    second_word = sizeof(jint);
101#else
102    return NULL;
103#endif // _LP64
104  } else {
105    reg = regname->as_Register();
106  }
107  if (reg->is_out()) {
108    assert(_younger_window != NULL, "Younger window should be available");
109    return second_word + (address)&_younger_window[reg->after_save()->sp_offset_in_saved_window()];
110  }
111  if (reg->is_local() || reg->is_in()) {
112    assert(_window != NULL, "Window should be available");
113    return second_word + (address)&_window[reg->sp_offset_in_saved_window()];
114  }
115  // Only the window'd GPRs get handled this way; not the globals.
116  return NULL;
117}
118
119
120#ifdef ASSERT
121void RegisterMap::check_location_valid() {
122  register_map_init();
123  assert((_location_valid[0] & bad_mask) == 0, "cannot have special locations for SP,FP,TLS,etc.");
124}
125#endif
126
127// We are shifting windows.  That means we are moving all %i to %o,
128// getting rid of all current %l, and keeping all %g.  This is only
129// complicated if any of the location pointers for these are valid.
130// The normal case is that everything is in its standard register window
131// home, and _location_valid[0] is zero.  In that case, this routine
132// does exactly nothing.
133void RegisterMap::shift_individual_registers() {
134  if (!update_map())  return;  // this only applies to maps with locations
135  register_map_init();
136  check_location_valid();
137
138  LocationValidType lv = _location_valid[0];
139  LocationValidType lv0 = lv;
140
141  lv &= ~R_LIO_mask;  // clear %l, %o, %i regs
142
143  // if we cleared some non-%g locations, we may have to do some shifting
144  if (lv != lv0) {
145    // copy %i0-%i5 to %o0-%o5, if they have special locations
146    // This can happen in within stubs which spill argument registers
147    // around a dynamic link operation, such as resolve_opt_virtual_call.
148    for (int i = 0; i < 8; i++) {
149      if (lv0 & (1LL << R_I_nums[i])) {
150        _location[R_O_nums[i]] = _location[R_I_nums[i]];
151        lv |=  (1LL << R_O_nums[i]);
152      }
153    }
154  }
155
156  _location_valid[0] = lv;
157  check_location_valid();
158}
159
160
161bool frame::safe_for_sender(JavaThread *thread) {
162  address   sp = (address)_sp;
163  if (sp != NULL &&
164      (sp <= thread->stack_base() && sp >= thread->stack_base() - thread->stack_size())) {
165      // Unfortunately we can only check frame complete for runtime stubs and nmethod
166      // other generic buffer blobs are more problematic so we just assume they are
167      // ok. adapter blobs never have a frame complete and are never ok.
168      if (_cb != NULL && !_cb->is_frame_complete_at(_pc)) {
169        if (_cb->is_nmethod() || _cb->is_adapter_blob() || _cb->is_runtime_stub()) {
170          return false;
171        }
172      }
173      return true;
174  }
175  return false;
176}
177
178// constructors
179
180// Construct an unpatchable, deficient frame
181frame::frame(intptr_t* sp, unpatchable_t, address pc, CodeBlob* cb) {
182#ifdef _LP64
183  assert( (((intptr_t)sp & (wordSize-1)) == 0), "frame constructor passed an invalid sp");
184#endif
185  _sp = sp;
186  _younger_sp = NULL;
187  _pc = pc;
188  _cb = cb;
189  _sp_adjustment_by_callee = 0;
190  assert(pc == NULL && cb == NULL || pc != NULL, "can't have a cb and no pc!");
191  if (_cb == NULL && _pc != NULL ) {
192    _cb = CodeCache::find_blob(_pc);
193  }
194  _deopt_state = unknown;
195#ifdef ASSERT
196  if ( _cb != NULL && _cb->is_nmethod()) {
197    // Without a valid unextended_sp() we can't convert the pc to "original"
198    assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant broken");
199  }
200#endif // ASSERT
201}
202
203frame::frame(intptr_t* sp, intptr_t* younger_sp, bool younger_frame_adjusted_stack) {
204  _sp = sp;
205  _younger_sp = younger_sp;
206  if (younger_sp == NULL) {
207    // make a deficient frame which doesn't know where its PC is
208    _pc = NULL;
209    _cb = NULL;
210  } else {
211    _pc = (address)younger_sp[I7->sp_offset_in_saved_window()] + pc_return_offset;
212    assert( (intptr_t*)younger_sp[FP->sp_offset_in_saved_window()] == (intptr_t*)((intptr_t)sp - STACK_BIAS), "younger_sp must be valid");
213    // Any frame we ever build should always "safe" therefore we should not have to call
214    // find_blob_unsafe
215    // In case of native stubs, the pc retrieved here might be
216    // wrong.  (the _last_native_pc will have the right value)
217    // So do not put add any asserts on the _pc here.
218  }
219  if (younger_frame_adjusted_stack) {
220    // compute adjustment to this frame's SP made by its interpreted callee
221    _sp_adjustment_by_callee = (intptr_t*)((intptr_t)younger_sp[I5_savedSP->sp_offset_in_saved_window()] +
222                                             STACK_BIAS) - sp;
223  } else {
224    _sp_adjustment_by_callee = 0;
225  }
226
227  _deopt_state = unknown;
228
229  // It is important that frame be fully construct when we do this lookup
230  // as get_original_pc() needs correct value for unextended_sp()
231  if (_pc != NULL) {
232    _cb = CodeCache::find_blob(_pc);
233    if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
234      _pc = ((nmethod*)_cb)->get_original_pc(this);
235      _deopt_state = is_deoptimized;
236    } else {
237      _deopt_state = not_deoptimized;
238    }
239  }
240}
241
242bool frame::is_interpreted_frame() const  {
243  return Interpreter::contains(pc());
244}
245
246// sender_sp
247
248intptr_t* frame::interpreter_frame_sender_sp() const {
249  assert(is_interpreted_frame(), "interpreted frame expected");
250  return fp();
251}
252
253#ifndef CC_INTERP
254void frame::set_interpreter_frame_sender_sp(intptr_t* sender_sp) {
255  assert(is_interpreted_frame(), "interpreted frame expected");
256  Unimplemented();
257}
258#endif // CC_INTERP
259
260
261#ifdef ASSERT
262// Debugging aid
263static frame nth_sender(int n) {
264  frame f = JavaThread::current()->last_frame();
265
266  for(int i = 0; i < n; ++i)
267    f = f.sender((RegisterMap*)NULL);
268
269  printf("first frame %d\n",          f.is_first_frame()       ? 1 : 0);
270  printf("interpreted frame %d\n",    f.is_interpreted_frame() ? 1 : 0);
271  printf("java frame %d\n",           f.is_java_frame()        ? 1 : 0);
272  printf("entry frame %d\n",          f.is_entry_frame()       ? 1 : 0);
273  printf("native frame %d\n",         f.is_native_frame()      ? 1 : 0);
274  if (f.is_compiled_frame()) {
275    if (f.is_deoptimized_frame())
276      printf("deoptimized frame 1\n");
277    else
278      printf("compiled frame 1\n");
279  }
280
281  return f;
282}
283#endif
284
285
286frame frame::sender_for_entry_frame(RegisterMap *map) const {
287  assert(map != NULL, "map must be set");
288  // Java frame called from C; skip all C frames and return top C
289  // frame of that chunk as the sender
290  JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor();
291  assert(!entry_frame_is_first(), "next Java fp must be non zero");
292  assert(jfa->last_Java_sp() > _sp, "must be above this frame on stack");
293  intptr_t* last_Java_sp = jfa->last_Java_sp();
294  // Since we are walking the stack now this nested anchor is obviously walkable
295  // even if it wasn't when it was stacked.
296  if (!jfa->walkable()) {
297    // Capture _last_Java_pc (if needed) and mark anchor walkable.
298    jfa->capture_last_Java_pc(_sp);
299  }
300  assert(jfa->last_Java_pc() != NULL, "No captured pc!");
301  map->clear();
302  map->make_integer_regs_unsaved();
303  map->shift_window(last_Java_sp, NULL);
304  assert(map->include_argument_oops(), "should be set by clear");
305  return frame(last_Java_sp, frame::unpatchable, jfa->last_Java_pc());
306}
307
308frame frame::sender_for_interpreter_frame(RegisterMap *map) const {
309  ShouldNotCallThis();
310  return sender(map);
311}
312
313frame frame::sender_for_compiled_frame(RegisterMap *map) const {
314  ShouldNotCallThis();
315  return sender(map);
316}
317
318frame frame::sender(RegisterMap* map) const {
319  assert(map != NULL, "map must be set");
320
321  assert(CodeCache::find_blob_unsafe(_pc) == _cb, "inconsistent");
322
323  // Default is not to follow arguments; update it accordingly below
324  map->set_include_argument_oops(false);
325
326  if (is_entry_frame()) return sender_for_entry_frame(map);
327
328  intptr_t* younger_sp     = sp();
329  intptr_t* sp             = sender_sp();
330  bool      adjusted_stack = false;
331
332  // Note:  The version of this operation on any platform with callee-save
333  //        registers must update the register map (if not null).
334  //        In order to do this correctly, the various subtypes of
335  //        of frame (interpreted, compiled, glue, native),
336  //        must be distinguished.  There is no need on SPARC for
337  //        such distinctions, because all callee-save registers are
338  //        preserved for all frames via SPARC-specific mechanisms.
339  //
340  //        *** HOWEVER, *** if and when we make any floating-point
341  //        registers callee-saved, then we will have to copy over
342  //        the RegisterMap update logic from the Intel code.
343
344  // The constructor of the sender must know whether this frame is interpreted so it can set the
345  // sender's _sp_adjustment_by_callee field.  An osr adapter frame was originally
346  // interpreted but its pc is in the code cache (for c1 -> osr_frame_return_id stub), so it must be
347  // explicitly recognized.
348
349  adjusted_stack = is_interpreted_frame();
350  if (adjusted_stack) {
351    map->make_integer_regs_unsaved();
352    map->shift_window(sp, younger_sp);
353  } else if (_cb != NULL) {
354    // Update the locations of implicitly saved registers to be their
355    // addresses in the register save area.
356    // For %o registers, the addresses of %i registers in the next younger
357    // frame are used.
358    map->shift_window(sp, younger_sp);
359    if (map->update_map()) {
360      // Tell GC to use argument oopmaps for some runtime stubs that need it.
361      // For C1, the runtime stub might not have oop maps, so set this flag
362      // outside of update_register_map.
363      map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
364      if (_cb->oop_maps() != NULL) {
365        OopMapSet::update_register_map(this, map);
366      }
367    }
368  }
369  return frame(sp, younger_sp, adjusted_stack);
370}
371
372
373void frame::patch_pc(Thread* thread, address pc) {
374  if(thread == Thread::current()) {
375   StubRoutines::Sparc::flush_callers_register_windows_func()();
376  }
377  if (TracePcPatching) {
378    // QQQ this assert is invalid (or too strong anyway) sice _pc could
379    // be original pc and frame could have the deopt pc.
380    // assert(_pc == *O7_addr() + pc_return_offset, "frame has wrong pc");
381    tty->print_cr("patch_pc at address  0x%x [0x%x -> 0x%x] ", O7_addr(), _pc, pc);
382  }
383  _cb = CodeCache::find_blob(pc);
384  *O7_addr() = pc - pc_return_offset;
385  _cb = CodeCache::find_blob(_pc);
386  if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
387    address orig = ((nmethod*)_cb)->get_original_pc(this);
388    assert(orig == _pc, "expected original to be stored before patching");
389    _deopt_state = is_deoptimized;
390  } else {
391    _deopt_state = not_deoptimized;
392  }
393}
394
395
396static bool sp_is_valid(intptr_t* old_sp, intptr_t* young_sp, intptr_t* sp) {
397  return (((intptr_t)sp & (2*wordSize-1)) == 0 &&
398          sp <= old_sp &&
399          sp >= young_sp);
400}
401
402
403/*
404  Find the (biased) sp that is just younger than old_sp starting at sp.
405  If not found return NULL. Register windows are assumed to be flushed.
406*/
407intptr_t* frame::next_younger_sp_or_null(intptr_t* old_sp, intptr_t* sp) {
408
409  intptr_t* previous_sp = NULL;
410  intptr_t* orig_sp = sp;
411
412  int max_frames = (old_sp - sp) / 16; // Minimum frame size is 16
413  int max_frame2 = max_frames;
414  while(sp != old_sp && sp_is_valid(old_sp, orig_sp, sp)) {
415    if (max_frames-- <= 0)
416      // too many frames have gone by; invalid parameters given to this function
417      break;
418    previous_sp = sp;
419    sp = (intptr_t*)sp[FP->sp_offset_in_saved_window()];
420    sp = (intptr_t*)((intptr_t)sp + STACK_BIAS);
421  }
422
423  return (sp == old_sp ? previous_sp : NULL);
424}
425
426/*
427  Determine if "sp" is a valid stack pointer. "sp" is assumed to be younger than
428  "valid_sp". So if "sp" is valid itself then it should be possible to walk frames
429  from "sp" to "valid_sp". The assumption is that the registers windows for the
430  thread stack in question are flushed.
431*/
432bool frame::is_valid_stack_pointer(intptr_t* valid_sp, intptr_t* sp) {
433  return next_younger_sp_or_null(valid_sp, sp) != NULL;
434}
435
436
437bool frame::interpreter_frame_equals_unpacked_fp(intptr_t* fp) {
438  assert(is_interpreted_frame(), "must be interpreter frame");
439  return this->fp() == fp;
440}
441
442
443void frame::pd_gc_epilog() {
444  if (is_interpreted_frame()) {
445    // set constant pool cache entry for interpreter
446    methodOop m = interpreter_frame_method();
447
448    *interpreter_frame_cpoolcache_addr() = m->constants()->cache();
449  }
450}
451
452
453bool frame::is_interpreted_frame_valid() const {
454#ifdef CC_INTERP
455  // Is there anything to do?
456#else
457  assert(is_interpreted_frame(), "Not an interpreted frame");
458  // These are reasonable sanity checks
459  if (fp() == 0 || (intptr_t(fp()) & (2*wordSize-1)) != 0) {
460    return false;
461  }
462  if (sp() == 0 || (intptr_t(sp()) & (2*wordSize-1)) != 0) {
463    return false;
464  }
465  const intptr_t interpreter_frame_initial_sp_offset = interpreter_frame_vm_local_words;
466  if (fp() + interpreter_frame_initial_sp_offset < sp()) {
467    return false;
468  }
469  // These are hacks to keep us out of trouble.
470  // The problem with these is that they mask other problems
471  if (fp() <= sp()) {        // this attempts to deal with unsigned comparison above
472    return false;
473  }
474  if (fp() - sp() > 4096) {  // stack frames shouldn't be large.
475    return false;
476  }
477#endif /* CC_INTERP */
478  return true;
479}
480
481
482// Windows have been flushed on entry (but not marked). Capture the pc that
483// is the return address to the frame that contains "sp" as its stack pointer.
484// This pc resides in the called of the frame corresponding to "sp".
485// As a side effect we mark this JavaFrameAnchor as having flushed the windows.
486// This side effect lets us mark stacked JavaFrameAnchors (stacked in the
487// call_helper) as flushed when we have flushed the windows for the most
488// recent (i.e. current) JavaFrameAnchor. This saves useless flushing calls
489// and lets us find the pc just once rather than multiple times as it did
490// in the bad old _post_Java_state days.
491//
492void JavaFrameAnchor::capture_last_Java_pc(intptr_t* sp) {
493  if (last_Java_sp() != NULL && last_Java_pc() == NULL) {
494    // try and find the sp just younger than _last_Java_sp
495    intptr_t* _post_Java_sp = frame::next_younger_sp_or_null(last_Java_sp(), sp);
496    // Really this should never fail otherwise VM call must have non-standard
497    // frame linkage (bad) or stack is not properly flushed (worse).
498    guarantee(_post_Java_sp != NULL, "bad stack!");
499    _last_Java_pc = (address) _post_Java_sp[ I7->sp_offset_in_saved_window()] + frame::pc_return_offset;
500
501  }
502  set_window_flushed();
503}
504
505void JavaFrameAnchor::make_walkable(JavaThread* thread) {
506  if (walkable()) return;
507  // Eventually make an assert
508  guarantee(Thread::current() == (Thread*)thread, "only current thread can flush its registers");
509  // We always flush in case the profiler wants it but we won't mark
510  // the windows as flushed unless we have a last_Java_frame
511  intptr_t* sp = StubRoutines::Sparc::flush_callers_register_windows_func()();
512  if (last_Java_sp() != NULL ) {
513    capture_last_Java_pc(sp);
514  }
515}
516
517intptr_t* frame::entry_frame_argument_at(int offset) const {
518  // convert offset to index to deal with tsi
519  int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize);
520
521  intptr_t* LSP = (intptr_t*) sp()[Lentry_args->sp_offset_in_saved_window()];
522  return &LSP[index+1];
523}
524
525
526BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) {
527  assert(is_interpreted_frame(), "interpreted frame expected");
528  methodOop method = interpreter_frame_method();
529  BasicType type = method->result_type();
530
531  if (method->is_native()) {
532    // Prior to notifying the runtime of the method_exit the possible result
533    // value is saved to l_scratch and d_scratch.
534
535#ifdef CC_INTERP
536    interpreterState istate = get_interpreterState();
537    intptr_t* l_scratch = (intptr_t*) &istate->_native_lresult;
538    intptr_t* d_scratch = (intptr_t*) &istate->_native_fresult;
539#else /* CC_INTERP */
540    intptr_t* l_scratch = fp() + interpreter_frame_l_scratch_fp_offset;
541    intptr_t* d_scratch = fp() + interpreter_frame_d_scratch_fp_offset;
542#endif /* CC_INTERP */
543
544    address l_addr = (address)l_scratch;
545#ifdef _LP64
546    // On 64-bit the result for 1/8/16/32-bit result types is in the other
547    // word half
548    l_addr += wordSize/2;
549#endif
550
551    switch (type) {
552      case T_OBJECT:
553      case T_ARRAY: {
554#ifdef CC_INTERP
555        *oop_result = istate->_oop_temp;
556#else
557        oop obj = (oop) at(interpreter_frame_oop_temp_offset);
558        assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
559        *oop_result = obj;
560#endif // CC_INTERP
561        break;
562      }
563
564      case T_BOOLEAN : { jint* p = (jint*)l_addr; value_result->z = (jboolean)((*p) & 0x1); break; }
565      case T_BYTE    : { jint* p = (jint*)l_addr; value_result->b = (jbyte)((*p) & 0xff); break; }
566      case T_CHAR    : { jint* p = (jint*)l_addr; value_result->c = (jchar)((*p) & 0xffff); break; }
567      case T_SHORT   : { jint* p = (jint*)l_addr; value_result->s = (jshort)((*p) & 0xffff); break; }
568      case T_INT     : value_result->i = *(jint*)l_addr; break;
569      case T_LONG    : value_result->j = *(jlong*)l_scratch; break;
570      case T_FLOAT   : value_result->f = *(jfloat*)d_scratch; break;
571      case T_DOUBLE  : value_result->d = *(jdouble*)d_scratch; break;
572      case T_VOID    : /* Nothing to do */ break;
573      default        : ShouldNotReachHere();
574    }
575  } else {
576    intptr_t* tos_addr = interpreter_frame_tos_address();
577
578    switch(type) {
579      case T_OBJECT:
580      case T_ARRAY: {
581        oop obj = (oop)*tos_addr;
582        assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
583        *oop_result = obj;
584        break;
585      }
586      case T_BOOLEAN : { jint* p = (jint*)tos_addr; value_result->z = (jboolean)((*p) & 0x1); break; }
587      case T_BYTE    : { jint* p = (jint*)tos_addr; value_result->b = (jbyte)((*p) & 0xff); break; }
588      case T_CHAR    : { jint* p = (jint*)tos_addr; value_result->c = (jchar)((*p) & 0xffff); break; }
589      case T_SHORT   : { jint* p = (jint*)tos_addr; value_result->s = (jshort)((*p) & 0xffff); break; }
590      case T_INT     : value_result->i = *(jint*)tos_addr; break;
591      case T_LONG    : value_result->j = *(jlong*)tos_addr; break;
592      case T_FLOAT   : value_result->f = *(jfloat*)tos_addr; break;
593      case T_DOUBLE  : value_result->d = *(jdouble*)tos_addr; break;
594      case T_VOID    : /* Nothing to do */ break;
595      default        : ShouldNotReachHere();
596    }
597  };
598
599  return type;
600}
601
602// Lesp pointer is one word lower than the top item on the stack.
603intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
604  int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize) - 1;
605  return &interpreter_frame_tos_address()[index];
606}
607