Mercurial > hg > truffle
comparison src/share/vm/c1/c1_Instruction.hpp @ 1295:3cf667df43ef
6919934: JSR 292 needs to support x86 C1
Summary: This implements JSR 292 support for C1 x86.
Reviewed-by: never, jrose, kvn
author | twisti |
---|---|
date | Tue, 09 Mar 2010 20:16:19 +0100 |
parents | a61af66fc99e |
children | 9f5b60a14736 |
comparison
equal
deleted
inserted
replaced
1293:51db1e4b379d | 1295:3cf667df43ef |
---|---|
1 /* | 1 /* |
2 * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. | 2 * Copyright 1999-2010 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. |
1132 }; | 1132 }; |
1133 | 1133 |
1134 | 1134 |
1135 LEAF(Invoke, StateSplit) | 1135 LEAF(Invoke, StateSplit) |
1136 private: | 1136 private: |
1137 Bytecodes::Code _code; | 1137 Bytecodes::Code _code; |
1138 Value _recv; | 1138 Value _recv; |
1139 Values* _args; | 1139 Values* _args; |
1140 BasicTypeList* _signature; | 1140 BasicTypeList* _signature; |
1141 int _vtable_index; | 1141 int _vtable_index; |
1142 ciMethod* _target; | 1142 ciMethod* _target; |
1143 ValueStack* _state_before; // Required for deoptimization. | |
1143 | 1144 |
1144 public: | 1145 public: |
1145 // creation | 1146 // creation |
1146 Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args, | 1147 Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args, |
1147 int vtable_index, ciMethod* target); | 1148 int vtable_index, ciMethod* target, ValueStack* state_before); |
1148 | 1149 |
1149 // accessors | 1150 // accessors |
1150 Bytecodes::Code code() const { return _code; } | 1151 Bytecodes::Code code() const { return _code; } |
1151 Value receiver() const { return _recv; } | 1152 Value receiver() const { return _recv; } |
1152 bool has_receiver() const { return receiver() != NULL; } | 1153 bool has_receiver() const { return receiver() != NULL; } |
1153 int number_of_arguments() const { return _args->length(); } | 1154 int number_of_arguments() const { return _args->length(); } |
1154 Value argument_at(int i) const { return _args->at(i); } | 1155 Value argument_at(int i) const { return _args->at(i); } |
1155 int vtable_index() const { return _vtable_index; } | 1156 int vtable_index() const { return _vtable_index; } |
1156 BasicTypeList* signature() const { return _signature; } | 1157 BasicTypeList* signature() const { return _signature; } |
1157 ciMethod* target() const { return _target; } | 1158 ciMethod* target() const { return _target; } |
1159 ValueStack* state_before() const { return _state_before; } | |
1158 | 1160 |
1159 // Returns false if target is not loaded | 1161 // Returns false if target is not loaded |
1160 bool target_is_final() const { return check_flag(TargetIsFinalFlag); } | 1162 bool target_is_final() const { return check_flag(TargetIsFinalFlag); } |
1161 bool target_is_loaded() const { return check_flag(TargetIsLoadedFlag); } | 1163 bool target_is_loaded() const { return check_flag(TargetIsLoadedFlag); } |
1162 // Returns false if target is not loaded | 1164 // Returns false if target is not loaded |
1163 bool target_is_strictfp() const { return check_flag(TargetIsStrictfpFlag); } | 1165 bool target_is_strictfp() const { return check_flag(TargetIsStrictfpFlag); } |
1164 | 1166 |
1167 // JSR 292 support | |
1168 bool is_invokedynamic() const { return code() == Bytecodes::_invokedynamic; } | |
1169 | |
1165 // generic | 1170 // generic |
1166 virtual bool can_trap() const { return true; } | 1171 virtual bool can_trap() const { return true; } |
1167 virtual void input_values_do(void f(Value*)) { | 1172 virtual void input_values_do(void f(Value*)) { |
1168 StateSplit::input_values_do(f); | 1173 StateSplit::input_values_do(f); |
1169 if (has_receiver()) f(&_recv); | 1174 if (has_receiver()) f(&_recv); |
1170 for (int i = 0; i < _args->length(); i++) f(_args->adr_at(i)); | 1175 for (int i = 0; i < _args->length(); i++) f(_args->adr_at(i)); |
1171 } | 1176 } |
1177 virtual void state_values_do(void f(Value*)); | |
1172 }; | 1178 }; |
1173 | 1179 |
1174 | 1180 |
1175 LEAF(NewInstance, StateSplit) | 1181 LEAF(NewInstance, StateSplit) |
1176 private: | 1182 private: |