diff options
author | Tom Stellard <thomas.stellard@amd.com> | 2012-03-14 13:06:47 -0400 |
---|---|---|
committer | Tom Stellard <thomas.stellard@amd.com> | 2012-03-14 13:21:36 -0400 |
commit | 8ce2379bad649affe7db0dc5d0d2a63640c95676 (patch) | |
tree | dfcfa1e3cc11a9b433f6b67233f357b72779acf8 | |
parent | d831f8d4f8eb86d3f276be4018375623d0ebb685 (diff) |
r600g: Handle BREAKNZ_INT from the llvm backend
-rw-r--r-- | src/gallium/drivers/r600/r600_shader.c | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c index 6178d044a83..eaa772cebb0 100644 --- a/src/gallium/drivers/r600/r600_shader.c +++ b/src/gallium/drivers/r600/r600_shader.c @@ -326,6 +326,21 @@ static void llvm_if(struct r600_shader_ctx *ctx, struct r600_bytecode_alu * alu, callstack_check_depth(ctx, FC_PUSH_VPM, 0); } +static void r600_break_from_byte_stream(struct r600_shader_ctx *ctx, + struct r600_bytecode_alu *alu, unsigned compare_opcode) +{ + unsigned opcode = TGSI_OPCODE_BRK; + if (ctx->bc->chip_class == CAYMAN) + ctx->inst_info = &cm_shader_tgsi_instruction[opcode]; + else if (ctx->bc->chip_class >= EVERGREEN) + ctx->inst_info = &eg_shader_tgsi_instruction[opcode]; + else + ctx->inst_info = &r600_shader_tgsi_instruction[opcode]; + llvm_if(ctx, alu, compare_opcode); + tgsi_loop_brk_cont(ctx); + tgsi_endif(ctx); +} + static unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx, unsigned char * bytes, unsigned bytes_read) { @@ -352,21 +367,13 @@ static unsigned r600_fc_from_byte_stream(struct r600_shader_ctx *ctx, tgsi_endloop(ctx); break; case 5: - { - unsigned opcode = TGSI_OPCODE_BRK; - /* XXX: This should be a helper function */ - if (ctx->bc->chip_class == CAYMAN) - ctx->inst_info = &cm_shader_tgsi_instruction[opcode]; - else if (ctx->bc->chip_class >= EVERGREEN) - ctx->inst_info = &eg_shader_tgsi_instruction[opcode]; - else - ctx->inst_info = &r600_shader_tgsi_instruction[opcode]; - llvm_if(ctx, &alu, + r600_break_from_byte_stream(ctx, &alu, CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETE)); - tgsi_loop_brk_cont(ctx); - tgsi_endif(ctx); break; - } + case 6: + r600_break_from_byte_stream(ctx, &alu, + CTX_INST(V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_PRED_SETNE_INT)); + break; } return bytes_read; |