示例#1
0
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;
}
示例#2
0
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();
  }
}
示例#3
0
void Value::set_double(jdouble value) {
  GUARANTEE(type() == T_DOUBLE, "check type");
  destroy();
  set_where(T_IMMEDIATE);
  *(double *)(&_low) = value;

}
示例#4
0
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;
}
示例#5
0
void Value::destroy() {
  if (in_register()) {
    RegisterAllocator::dereference(lo_register());
    if (use_two_registers()) {
      RegisterAllocator::dereference(hi_register());
    }
  }
  set_where(T_NOWHERE);
}
示例#6
0
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;
}
示例#7
0
 // Mark this location as illegal
 void mark_as_illegal() {
    set_type(T_ILLEGAL);
    set_where(Value::T_NOWHERE);
    set_flags(0);
 }
示例#8
0
void Value::set_raw_long(jlong value) {
  GUARANTEE(is_two_word(), "check type");
  destroy();
  set_where(T_IMMEDIATE);
  *(jlong *)(&_low) = value;
}
示例#9
0
void Value::set_raw_int(jint value) {
  GUARANTEE(is_one_word(), "check type");
  destroy();
  set_where(T_IMMEDIATE);
  _low = value;
}
示例#10
0
void Value::set_long(jlong value) {
  GUARANTEE(type() == T_LONG, "check type");
  destroy();
  set_where(T_IMMEDIATE);
  *(jlong *)(&_low) = value;
}
示例#11
0
void Value::set_float(jfloat value) {
  GUARANTEE(type() == T_FLOAT, "check type");
  destroy();
  set_where(T_IMMEDIATE);
  *(float *)(&_low) = value;
}
示例#12
0
void Value::set_register(Assembler::Register reg) {
  destroy();
  GUARANTEE(type() != T_LONG, "tag check");
  set_where(T_REGISTER);
  _low = (int) reg;
}