From: Matt Turner Date: Sun, 13 Jul 2014 04:18:08 +0000 (-0700) Subject: i965: Add basic-block aware backend_instruction::insert_* methods. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3d6d4dc6f7f90d65982073294a41afac8397f68a;p=mesa.git i965: Add basic-block aware backend_instruction::insert_* methods. Reviewed-by: Topi Pohjolainen --- 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 @@ -757,6 +757,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) { 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