Mercurial > hg > graal-jvmci-8
comparison src/cpu/zero/vm/cppInterpreter_zero.cpp @ 1256:c09ee209b65c
6926048: Improve Zero performance
Summary: Make Zero figure out result types in a similar way to C++ interpreter implementation.
Reviewed-by: kvn
Contributed-by: gbenson@redhat.com
author | kvn |
---|---|
date | Fri, 12 Feb 2010 10:34:11 -0800 |
parents | b6f06e395428 |
children | 747d26efc5fa |
comparison
equal
deleted
inserted
replaced
1255:e3a4305c6bc3 | 1256:c09ee209b65c |
---|---|
1 /* | 1 /* |
2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. |
3 * Copyright 2007, 2008, 2009 Red Hat, Inc. | 3 * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc. |
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5 * | 5 * |
6 * This code is free software; you can redistribute it and/or modify it | 6 * This code is free software; you can redistribute it and/or modify it |
7 * under the terms of the GNU General Public License version 2 only, as | 7 * under the terms of the GNU General Public License version 2 only, as |
8 * published by the Free Software Foundation. | 8 * published by the Free Software Foundation. |
143 // Resume the interpreter | 143 // Resume the interpreter |
144 istate->set_msg(BytecodeInterpreter::got_monitors); | 144 istate->set_msg(BytecodeInterpreter::got_monitors); |
145 } | 145 } |
146 else if (istate->msg() == BytecodeInterpreter::return_from_method) { | 146 else if (istate->msg() == BytecodeInterpreter::return_from_method) { |
147 // Copy the result into the caller's frame | 147 // Copy the result into the caller's frame |
148 result_slots = type2size[method->result_type()]; | 148 result_slots = type2size[result_type_of(method)]; |
149 assert(result_slots >= 0 && result_slots <= 2, "what?"); | 149 assert(result_slots >= 0 && result_slots <= 2, "what?"); |
150 result = istate->stack() + result_slots; | 150 result = istate->stack() + result_slots; |
151 break; | 151 break; |
152 } | 152 } |
153 else if (istate->msg() == BytecodeInterpreter::throwing_exception) { | 153 else if (istate->msg() == BytecodeInterpreter::throwing_exception) { |
392 // Pop our parameters | 392 // Pop our parameters |
393 stack->set_sp(stack->sp() + method->size_of_parameters()); | 393 stack->set_sp(stack->sp() + method->size_of_parameters()); |
394 | 394 |
395 // Push our result | 395 // Push our result |
396 if (!HAS_PENDING_EXCEPTION) { | 396 if (!HAS_PENDING_EXCEPTION) { |
397 stack->set_sp(stack->sp() - type2size[method->result_type()]); | 397 BasicType type = result_type_of(method); |
398 | 398 stack->set_sp(stack->sp() - type2size[type]); |
399 switch (method->result_type()) { | 399 |
400 switch (type) { | |
400 case T_VOID: | 401 case T_VOID: |
401 break; | 402 break; |
402 | 403 |
403 case T_BOOLEAN: | 404 case T_BOOLEAN: |
404 #ifndef VM_LITTLE_ENDIAN | 405 #ifndef VM_LITTLE_ENDIAN |
703 default : ShouldNotReachHere(); | 704 default : ShouldNotReachHere(); |
704 } | 705 } |
705 assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, | 706 assert(0 <= i && i < AbstractInterpreter::number_of_result_handlers, |
706 "index out of bounds"); | 707 "index out of bounds"); |
707 return i; | 708 return i; |
709 } | |
710 | |
711 BasicType CppInterpreter::result_type_of(methodOop method) { | |
712 BasicType t; | |
713 switch (method->result_index()) { | |
714 case 0 : t = T_BOOLEAN; break; | |
715 case 1 : t = T_CHAR; break; | |
716 case 2 : t = T_BYTE; break; | |
717 case 3 : t = T_SHORT; break; | |
718 case 4 : t = T_INT; break; | |
719 case 5 : t = T_LONG; break; | |
720 case 6 : t = T_VOID; break; | |
721 case 7 : t = T_FLOAT; break; | |
722 case 8 : t = T_DOUBLE; break; | |
723 case 9 : t = T_OBJECT; break; | |
724 default: ShouldNotReachHere(); | |
725 } | |
726 assert(AbstractInterpreter::BasicType_as_index(t) == method->result_index(), | |
727 "out of step with AbstractInterpreter::BasicType_as_index"); | |
728 return t; | |
708 } | 729 } |
709 | 730 |
710 address InterpreterGenerator::generate_empty_entry() { | 731 address InterpreterGenerator::generate_empty_entry() { |
711 if (!UseFastEmptyMethods) | 732 if (!UseFastEmptyMethods) |
712 return NULL; | 733 return NULL; |