r600g: fix RSQ of negative value on Cayman
[mesa.git] / src / gallium / drivers / r600 / r600_llvm.c
index 776f47b6bff17d708028aa507a1cf0c485aa2b72..71ea57812204384fecf0fabbd6c5a948e20bc7c8 100644 (file)
@@ -165,6 +165,20 @@ static void llvm_emit_tex(
                                        emit_data->dst_type, args, c, LLVMReadNoneAttribute);
 }
 
+static void emit_cndlt(
+               const struct lp_build_tgsi_action * action,
+               struct lp_build_tgsi_context * bld_base,
+               struct lp_build_emit_data * emit_data)
+{
+       LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+       LLVMValueRef float_zero = lp_build_const_float(
+               bld_base->base.gallivm, 0.0f);
+       LLVMValueRef cmp = LLVMBuildFCmp(
+               builder, LLVMRealULT, emit_data->args[0], float_zero, "");
+       emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
+               cmp, emit_data->args[1], emit_data->args[2], "");
+}
+
 static void dp_fetch_args(
        struct lp_build_tgsi_context * bld_base,
        struct lp_build_emit_data * emit_data)
@@ -241,6 +255,7 @@ LLVMModuleRef r600_tgsi_llvm(
        bld_base->op_actions[TGSI_OPCODE_TXF].emit = llvm_emit_tex;
        bld_base->op_actions[TGSI_OPCODE_TXQ].emit = llvm_emit_tex;
        bld_base->op_actions[TGSI_OPCODE_TXP].emit = llvm_emit_tex;
+       bld_base->op_actions[TGSI_OPCODE_CMP].emit = emit_cndlt;
 
        lp_build_tgsi_llvm(bld_base, tokens);
 
@@ -259,9 +274,10 @@ const char * r600_llvm_gpu_string(enum radeon_family family)
        case CHIP_RV630:
        case CHIP_RV620:
        case CHIP_RV635:
-               gpu_family = "r600";
        case CHIP_RS780:
        case CHIP_RS880:
+               gpu_family = "r600";
+               break;
        case CHIP_RV710:
                gpu_family = "rv710";
                break;