2009-05-04 02:46:13 -04:00
|
|
|
namespace factor
|
|
|
|
{
|
|
|
|
|
2009-05-02 10:19:09 -04:00
|
|
|
struct jit {
|
2009-10-20 10:37:24 -04:00
|
|
|
code_block_type type;
|
2009-11-02 19:10:34 -05:00
|
|
|
data_root<object> owner;
|
2009-05-02 10:19:09 -04:00
|
|
|
growable_byte_array code;
|
|
|
|
growable_byte_array relocation;
|
2009-12-02 05:28:15 -05:00
|
|
|
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;
|
2009-10-18 21:31:59 -04:00
|
|
|
factor_vm *parent;
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2009-10-20 10:37:24 -04:00
|
|
|
explicit jit(code_block_type type, cell owner, factor_vm *parent);
|
2011-11-02 02:40:46 -04:00
|
|
|
~jit();
|
|
|
|
|
2009-05-04 05:50:24 -04:00
|
|
|
void compute_position(cell offset);
|
2009-05-02 05:04:19 -04:00
|
|
|
|
2011-09-14 03:44:35 -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
|
|
|
|
2009-12-02 05:28:15 -05: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); }
|
2009-12-02 05:28:15 -05:00
|
|
|
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)
|
|
|
|
{
|
2009-12-02 05:28:15 -05:00
|
|
|
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_)
|
|
|
|
{
|
2009-11-02 19:10:34 -05:00
|
|
|
data_root<word> word(word_,parent);
|
2010-02-03 03:27:18 -05:00
|
|
|
#ifndef FACTOR_AMD64
|
2009-12-02 05:55:48 -05:00
|
|
|
literal(tag_fixnum(xt_tail_pic_offset));
|
2010-02-03 03:27:18 -05:00
|
|
|
#endif
|
2009-12-02 05:55:48 -05:00
|
|
|
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)
|
|
|
|
{
|
2009-12-02 05:28:15 -05:00
|
|
|
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
|
|
|
|
2009-12-15 07:20:09 -05: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
|
|
|
|
2010-02-06 02:06:26 -05: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
|
|
|
|
2011-11-30 15:39:21 -05:00
|
|
|
code_block *to_code_block(cell frame_size);
|
2011-11-02 02:40:46 -04:00
|
|
|
|
|
|
|
private:
|
|
|
|
jit(const jit&);
|
|
|
|
void operator=(const jit&);
|
2009-05-02 10:19:09 -04:00
|
|
|
};
|
2009-05-04 02:46:13 -04:00
|
|
|
|
|
|
|
}
|