mirror of https://github.com/inolen/redream.git
replace MAX_OFFSET with IR_MAX_CONTEXT
This commit is contained in:
parent
9c15879c30
commit
357a210c79
|
@ -464,12 +464,16 @@ void ir_store_fast(struct ir *ir, struct ir_value *addr, struct ir_value *v) {
|
||||||
|
|
||||||
struct ir_value *ir_load_context(struct ir *ir, size_t offset,
|
struct ir_value *ir_load_context(struct ir *ir, size_t offset,
|
||||||
enum ir_type type) {
|
enum ir_type type) {
|
||||||
|
CHECK_LE(offset + ir_type_size(type), IR_MAX_CONTEXT);
|
||||||
|
|
||||||
struct ir_instr *instr = ir_append_instr(ir, OP_LOAD_CONTEXT, type);
|
struct ir_instr *instr = ir_append_instr(ir, OP_LOAD_CONTEXT, type);
|
||||||
ir_set_arg0(ir, instr, ir_alloc_i32(ir, (int32_t)offset));
|
ir_set_arg0(ir, instr, ir_alloc_i32(ir, (int32_t)offset));
|
||||||
return instr->result;
|
return instr->result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ir_store_context(struct ir *ir, size_t offset, struct ir_value *v) {
|
void ir_store_context(struct ir *ir, size_t offset, struct ir_value *v) {
|
||||||
|
CHECK_LE(offset + ir_type_size(v->type), IR_MAX_CONTEXT);
|
||||||
|
|
||||||
struct ir_instr *instr = ir_append_instr(ir, OP_STORE_CONTEXT, VALUE_V);
|
struct ir_instr *instr = ir_append_instr(ir, OP_STORE_CONTEXT, VALUE_V);
|
||||||
ir_set_arg0(ir, instr, ir_alloc_i32(ir, (int32_t)offset));
|
ir_set_arg0(ir, instr, ir_alloc_i32(ir, (int32_t)offset));
|
||||||
ir_set_arg1(ir, instr, v);
|
ir_set_arg1(ir, instr, v);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "core/list.h"
|
#include "core/list.h"
|
||||||
|
|
||||||
#define IR_MAX_ARGS 4
|
#define IR_MAX_ARGS 4
|
||||||
|
#define IR_MAX_CONTEXT 512
|
||||||
|
|
||||||
enum ir_op {
|
enum ir_op {
|
||||||
#define IR_OP(name, flags) OP_##name,
|
#define IR_OP(name, flags) OP_##name,
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
DEFINE_STAT(loads_removed, "context loads eliminated");
|
DEFINE_STAT(loads_removed, "context loads eliminated");
|
||||||
DEFINE_STAT(stores_removed, "context stores eliminated");
|
DEFINE_STAT(stores_removed, "context stores eliminated");
|
||||||
|
|
||||||
#define MAX_OFFSET 512
|
|
||||||
|
|
||||||
struct lse_entry {
|
struct lse_entry {
|
||||||
/* cache token when this entry was added */
|
/* cache token when this entry was added */
|
||||||
uint64_t token;
|
uint64_t token;
|
||||||
|
@ -19,7 +17,7 @@ struct lse {
|
||||||
/* current cache token */
|
/* current cache token */
|
||||||
uint64_t token;
|
uint64_t token;
|
||||||
|
|
||||||
struct lse_entry available[MAX_OFFSET];
|
struct lse_entry available[IR_MAX_CONTEXT];
|
||||||
};
|
};
|
||||||
|
|
||||||
static void lse_clear_available(struct lse *lse) {
|
static void lse_clear_available(struct lse *lse) {
|
||||||
|
@ -29,10 +27,9 @@ static void lse_clear_available(struct lse *lse) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lse_erase_available(struct lse *lse, int offset, int size) {
|
static void lse_erase_available(struct lse *lse, int offset, int size) {
|
||||||
CHECK_LT(offset + size, MAX_OFFSET);
|
|
||||||
|
|
||||||
int begin = offset;
|
int begin = offset;
|
||||||
int end = offset + size - 1;
|
int end = offset + size - 1;
|
||||||
|
CHECK_LT(end, IR_MAX_CONTEXT);
|
||||||
|
|
||||||
/* if the invalidation range intersects with an entry, merge that entry into
|
/* if the invalidation range intersects with an entry, merge that entry into
|
||||||
the invalidation range */
|
the invalidation range */
|
||||||
|
@ -55,8 +52,26 @@ static void lse_erase_available(struct lse *lse, int offset, int size) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void lse_set_available(struct lse *lse, int offset, struct ir_value *v) {
|
||||||
|
int size = ir_type_size(v->type);
|
||||||
|
int begin = offset;
|
||||||
|
int end = offset + size - 1;
|
||||||
|
CHECK_LT(end, IR_MAX_CONTEXT);
|
||||||
|
|
||||||
|
lse_erase_available(lse, offset, size);
|
||||||
|
|
||||||
|
/* add entries for the entire range to aid in invalidation. only the initial
|
||||||
|
entry where offset == entry.offset is valid for reuse */
|
||||||
|
for (; begin <= end; begin++) {
|
||||||
|
struct lse_entry *entry = &lse->available[begin];
|
||||||
|
entry->token = lse->token;
|
||||||
|
entry->offset = offset;
|
||||||
|
entry->value = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static struct ir_value *lse_get_available(struct lse *lse, int offset) {
|
static struct ir_value *lse_get_available(struct lse *lse, int offset) {
|
||||||
CHECK_LT(offset, MAX_OFFSET);
|
CHECK_LT(offset, IR_MAX_CONTEXT);
|
||||||
|
|
||||||
struct lse_entry *entry = &lse->available[offset];
|
struct lse_entry *entry = &lse->available[offset];
|
||||||
|
|
||||||
|
@ -75,25 +90,6 @@ static struct ir_value *lse_get_available(struct lse *lse, int offset) {
|
||||||
return entry->value;
|
return entry->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void lse_set_available(struct lse *lse, int offset, struct ir_value *v) {
|
|
||||||
int size = ir_type_size(v->type);
|
|
||||||
CHECK_LT(offset + size, MAX_OFFSET);
|
|
||||||
|
|
||||||
int begin = offset;
|
|
||||||
int end = offset + size - 1;
|
|
||||||
|
|
||||||
lse_erase_available(lse, offset, size);
|
|
||||||
|
|
||||||
/* add entries for the entire range to aid in invalidation. only the initial
|
|
||||||
entry where offset == entry.offset is valid for reuse */
|
|
||||||
for (; begin <= end; begin++) {
|
|
||||||
struct lse_entry *entry = &lse->available[begin];
|
|
||||||
entry->token = lse->token;
|
|
||||||
entry->offset = offset;
|
|
||||||
entry->value = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void lse_eliminate_loads(struct lse *lse, struct ir *ir,
|
static void lse_eliminate_loads(struct lse *lse, struct ir *ir,
|
||||||
struct ir_block *block) {
|
struct ir_block *block) {
|
||||||
lse_clear_available(lse);
|
lse_clear_available(lse);
|
||||||
|
|
Loading…
Reference in New Issue