void Value::set_registers(Assembler::Register low, Assembler::Register high) { destroy(); GUARANTEE(use_two_registers(), "tag_check"); set_where(T_REGISTER); _low = (int) low; _high = (int) high; }
void Value::set_obj(Oop* value) { // due to garbage collection considerations object immediates // are always put in a register GUARANTEE(type() == T_OBJECT || type() == T_ARRAY, "check type"); // assign a register to this value if (value->is_null()) { set_where(T_IMMEDIATE); set_must_be_null(); set_not_on_heap(); _low = 0; } else { assign_register(); // move the immediate object into the register Compiler::code_generator()->move(*this, value); if (!ObjectHeap::contains_moveable(value->obj())) { set_not_on_heap(); } #if ENABLE_COMPILER_TYPE_INFO FarClass::Raw value_class = value->blueprint(); GUARANTEE(value_class.not_null(), "Sanity"); if (value_class.is_java_class()) { JavaClass::Raw java_class = value_class.obj(); set_class_id(java_class().class_id()); set_is_exact_type(); } #else if (value->is_string()) { set_is_string(); } #endif set_must_be_nonnull(); } }
void Value::set_double(jdouble value) { GUARANTEE(type() == T_DOUBLE, "check type"); destroy(); set_where(T_IMMEDIATE); *(double *)(&_low) = value; }
int v_makeloc(struct command *c) { int n; int sk; int kind; sk = lookup(subkind_s, c->parse[1]); if (sk < 0) { wout(c->who, "Unknown subkind."); return FALSE; } if (sk == sub_galley || sk == sub_roundship) kind = T_ship; else kind = T_loc; n = new_ent(kind, sk); if (n < 0) { wout(c->who, "Out of boxes."); return FALSE; } set_where(n, subloc(c->who)); wout(c->who, "Created %s", box_name(n)); if (sk == sub_temple) ilist_append(&p_subloc(n)->teaches, sk_religion); return TRUE; }
void Value::destroy() { if (in_register()) { RegisterAllocator::dereference(lo_register()); if (use_two_registers()) { RegisterAllocator::dereference(hi_register()); } } set_where(T_NOWHERE); }
void Value::set_int(jint value) { GUARANTEE(type() == T_BOOLEAN || type() == T_INT || type() == T_BYTE || type() == T_CHAR || type() == T_SHORT, "check type"); destroy(); set_where(T_IMMEDIATE); _low = value; }
// Mark this location as illegal void mark_as_illegal() { set_type(T_ILLEGAL); set_where(Value::T_NOWHERE); set_flags(0); }
void Value::set_raw_long(jlong value) { GUARANTEE(is_two_word(), "check type"); destroy(); set_where(T_IMMEDIATE); *(jlong *)(&_low) = value; }
void Value::set_raw_int(jint value) { GUARANTEE(is_one_word(), "check type"); destroy(); set_where(T_IMMEDIATE); _low = value; }
void Value::set_long(jlong value) { GUARANTEE(type() == T_LONG, "check type"); destroy(); set_where(T_IMMEDIATE); *(jlong *)(&_low) = value; }
void Value::set_float(jfloat value) { GUARANTEE(type() == T_FLOAT, "check type"); destroy(); set_where(T_IMMEDIATE); *(float *)(&_low) = value; }
void Value::set_register(Assembler::Register reg) { destroy(); GUARANTEE(type() != T_LONG, "tag check"); set_where(T_REGISTER); _low = (int) reg; }