diff options
author | Matt Turner <mattst88@gmail.com> | 2014-07-12 21:18:08 -0700 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2014-08-22 10:23:34 -0700 |
commit | 3d6d4dc6f7f90d65982073294a41afac8397f68a (patch) | |
tree | dc6b40e1db2fb928d568bc2a8e6fd6981202c647 /src/mesa/drivers | |
parent | dc527fbf7da580f256c318756f43af3be59d2a77 (diff) |
i965: Add basic-block aware backend_instruction::insert_* methods.
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_shader.cpp | 47 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_shader.h | 5 |
2 files changed, 52 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 464790af9dd..1a181690880 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -758,6 +758,53 @@ adjust_later_block_ips(bblock_t *start_block, int ip_adjustment) } void +backend_instruction::insert_after(bblock_t *block, backend_instruction *inst) +{ + assert(inst_is_in_block(block, this) || !"Instruction not in block"); + + block->end_ip++; + + adjust_later_block_ips(block, 1); + + if (block->end == this) + block->end = inst; + + exec_node::insert_after(inst); +} + +void +backend_instruction::insert_before(bblock_t *block, backend_instruction *inst) +{ + assert(inst_is_in_block(block, this) || !"Instruction not in block"); + + block->end_ip++; + + adjust_later_block_ips(block, 1); + + if (block->start == this) + block->start = inst; + + exec_node::insert_before(inst); +} + +void +backend_instruction::insert_before(bblock_t *block, exec_list *list) +{ + assert(inst_is_in_block(block, this) || !"Instruction not in block"); + + unsigned num_inst = list->length(); + + block->end_ip += num_inst; + + adjust_later_block_ips(block, num_inst); + + if (block->start == this) + block->start = (backend_instruction *)list->get_head(); + + exec_node::insert_before(list); +} + +void backend_instruction::remove(bblock_t *block) { assert(inst_is_in_block(block, this) || !"Instruction not in block"); diff --git a/src/mesa/drivers/dri/i965/brw_shader.h b/src/mesa/drivers/dri/i965/brw_shader.h index f5af4fd44e1..35a2b9635a3 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.h +++ b/src/mesa/drivers/dri/i965/brw_shader.h @@ -92,6 +92,11 @@ struct backend_instruction : public exec_node { using exec_node::remove; void remove(bblock_t *block); + using exec_node::insert_after; + void insert_after(bblock_t *block, backend_instruction *inst); + using exec_node::insert_before; + void insert_before(bblock_t *block, backend_instruction *inst); + void insert_before(bblock_t *block, exec_list *list); /** * True if the instruction has side effects other than writing to |