00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 # include "incls/_precompiled.incl"
00025 # ifdef DELTA_COMPILER
00026 # include "incls/_costModel.cpp.incl"
00027
00028
00029 int CostModel::_cost[Bytecodes::number_of_codes];
00030
00031
00032 void CostModel::set_default_costs() {
00033
00034 set_cost_for_all(1);
00035
00036
00037 set_cost_for_type(Bytecodes::new_closure, 3);
00038 set_cost_for_type(Bytecodes::new_context, 3);
00039 set_cost_for_type(Bytecodes::message_send, 5);
00040 set_cost_for_type(Bytecodes::nonlocal_return, 3);
00041 set_cost_for_type(Bytecodes::primitive_call, 5);
00042 set_cost_for_type(Bytecodes::dll_call, 5);
00043
00044
00045 set_cost_for_send(Bytecodes::predicted_send, 2);
00046 set_cost_for_send(Bytecodes::accessor_send, 2);
00047 }
00048
00049
00050 void CostModel::set_cost_for_all(int cost) {
00051 for (int i = 0; i < Bytecodes::number_of_codes; i++) {
00052 _cost[i] = cost;
00053 }
00054 }
00055
00056
00057 void CostModel::set_cost_for_code(Bytecodes::Code code, int cost) {
00058 assert(Bytecodes::is_defined(code), "undefined bytecode");
00059 _cost[code] = cost;
00060 }
00061
00062
00063 void CostModel::set_cost_for_type(Bytecodes::CodeType type, int cost) {
00064 for (int i = 0; i < Bytecodes::number_of_codes; i++) {
00065 if (Bytecodes::code_type(Bytecodes::Code(i)) == type) {
00066 _cost[i] = cost;
00067 }
00068 }
00069 }
00070
00071
00072 void CostModel::set_cost_for_send(Bytecodes::SendType type, int cost) {
00073 for (int i = 0; i < Bytecodes::number_of_codes; i++) {
00074 if (Bytecodes::send_type(Bytecodes::Code(i)) == type) {
00075 _cost[i] = cost;
00076 }
00077 }
00078 }
00079
00080
00081 void CostModel::print() {
00082 std->print("%40s: %s\n", "Bytecode", "Cost");
00083 for (int i = 0; i < Bytecodes::number_of_codes; i++) {
00084 Bytecodes::Code code = Bytecodes::Code(i);
00085 if (Bytecodes::is_defined(code)) {
00086 std->print("%40s: %d\n", Bytecodes::name(code), cost_for(code));
00087 }
00088 }
00089 }
00090
00091
00092 void costModel_init() {
00093 CostModel::set_default_costs();
00094 }
00095
00096
00097 # endif