factor/vm/jit.hpp

79 lines
1.6 KiB
C++
Raw Normal View History

2009-05-04 02:46:13 -04:00
namespace factor
{
2009-05-02 10:19:09 -04:00
struct jit {
code_block_type type;
data_root<object> owner;
2009-05-02 10:19:09 -04:00
growable_byte_array code;
growable_byte_array relocation;
growable_array parameters;
2009-05-02 10:19:09 -04:00
growable_array literals;
2009-05-02 05:04:19 -04:00
bool computing_offset_p;
2009-05-04 05:50:24 -04:00
fixnum position;
cell offset;
factor_vm *parent;
2009-05-02 05:04:19 -04:00
explicit jit(code_block_type type, cell owner, factor_vm *parent);
~jit();
2009-05-04 05:50:24 -04:00
void compute_position(cell offset);
2009-05-02 05:04:19 -04:00
void emit_relocation(cell relocation_template);
2009-05-04 05:50:24 -04:00
void emit(cell code_template);
2009-05-02 05:04:19 -04:00
void parameter(cell parameter) { parameters.add(parameter); }
void emit_with_parameter(cell code_template_, cell parameter_);
2009-05-04 05:50:24 -04:00
void literal(cell literal) { literals.add(literal); }
void emit_with_literal(cell code_template_, cell literal_);
2009-05-02 05:04:19 -04:00
2009-10-23 01:33:53 -04:00
void push(cell literal)
{
emit_with_literal(parent->special_objects[JIT_PUSH_IMMEDIATE],literal);
2009-05-02 10:19:09 -04:00
}
2009-05-02 05:04:19 -04:00
2009-10-23 01:33:53 -04:00
void word_jump(cell word_)
{
data_root<word> word(word_,parent);
#ifndef FACTOR_AMD64
literal(tag_fixnum(xt_tail_pic_offset));
#endif
literal(word.value());
emit(parent->special_objects[JIT_WORD_JUMP]);
2009-05-02 10:19:09 -04:00
}
2009-05-02 05:04:19 -04:00
2009-10-23 01:33:53 -04:00
void word_call(cell word)
{
emit_with_literal(parent->special_objects[JIT_WORD_CALL],word);
2009-05-02 10:19:09 -04:00
}
2009-05-02 05:04:19 -04:00
bool emit_subprimitive(cell word_, bool tail_call_p, bool stack_frame_p);
2009-05-02 05:04:19 -04:00
2009-10-23 01:33:53 -04:00
fixnum get_position()
{
2009-05-02 10:19:09 -04:00
if(computing_offset_p)
{
/* If this is still on, emit() didn't clear it,
so the offset was out of bounds */
return -1;
}
else
return position;
}
2009-05-02 05:04:19 -04:00
void set_position(fixnum position_)
2009-10-23 01:33:53 -04:00
{
2009-05-02 10:19:09 -04:00
if(computing_offset_p)
position = position_;
2009-05-02 05:04:19 -04:00
}
2009-05-02 10:19:09 -04:00
code_block *to_code_block(cell frame_size);
private:
jit(const jit&);
void operator=(const jit&);
2009-05-02 10:19:09 -04:00
};
2009-05-04 02:46:13 -04:00
}