ir_to_mesa: Add support for comparison operations.
authorEric Anholt <eric@anholt.net>
Fri, 7 May 2010 00:41:22 +0000 (17:41 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 24 Jun 2010 22:05:20 +0000 (15:05 -0700)
ir_to_mesa.cpp
ir_to_mesa.h
mesa_codegen.brg

index 1bdb61801c0061d292efe4d12a45f85a9c6a31a6..465a8e1916492002f7c0d02feaeef1b2e02bcb64 100644 (file)
@@ -360,6 +360,26 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
    case ir_binop_div:
       this->result = this->create_tree(MB_TERM_div_vec4_vec4, ir, op[0], op[1]);
       break;
+
+   case ir_binop_less:
+      this->result = this->create_tree(MB_TERM_slt_vec4_vec4, ir, op[0], op[1]);
+      break;
+   case ir_binop_greater:
+      this->result = this->create_tree(MB_TERM_sgt_vec4_vec4, ir, op[0], op[1]);
+      break;
+   case ir_binop_lequal:
+      this->result = this->create_tree(MB_TERM_sle_vec4_vec4, ir, op[0], op[1]);
+      break;
+   case ir_binop_gequal:
+      this->result = this->create_tree(MB_TERM_sge_vec4_vec4, ir, op[0], op[1]);
+      break;
+   case ir_binop_equal:
+      this->result = this->create_tree(MB_TERM_seq_vec4_vec4, ir, op[0], op[1]);
+      break;
+   case ir_binop_nequal:
+      this->result = this->create_tree(MB_TERM_sne_vec4_vec4, ir, op[0], op[1]);
+      break;
+
    case ir_binop_dot:
       if (ir->operands[0]->type == vec4_type) {
         assert(ir->operands[1]->type == vec4_type);
index ee776bd55fe5e603fdee0474b05de5d5ff3a1a0d..ffa27dbd00f4ce5eb2193de454d4cc07134561f1 100644 (file)
@@ -161,6 +161,9 @@ ir_to_mesa_emit_op2_full(struct mbtree *tree, enum prog_opcode op,
                         ir_to_mesa_src_reg src0,
                         ir_to_mesa_src_reg src1);
 
+ir_to_mesa_instruction *
+ir_to_mesa_emit_simple_op2(struct mbtree *tree, enum prog_opcode op);
+
 ir_to_mesa_instruction *
 ir_to_mesa_emit_op3(struct mbtree *tree, enum prog_opcode op,
                    ir_to_mesa_dst_reg dst,
index e52798bcf513c46253c19f58fe186bba12804658..4e761343ae384c8353eae5c87c0b9822eaa98973 100644 (file)
 %term sub_vec4_vec4
 %term mul_vec4_vec4
 %term div_vec4_vec4
+%term slt_vec4_vec4
+%term sgt_vec4_vec4
+%term sle_vec4_vec4
+%term sge_vec4_vec4
+%term seq_vec4_vec4
+%term sne_vec4_vec4
 %term dp4_vec4_vec4
 %term dp3_vec4_vec4
 %term dp2_vec4_vec4
@@ -171,6 +177,13 @@ vec4: div_vec4_vec4(vec4, vec4) 1
                                 tree->left->src_reg);
 }
 
+vec4: slt_vec4_vec4(vec4, vec4) 1 { ir_to_mesa_emit_op2(tree, OPCODE_SLT); }
+vec4: sgt_vec4_vec4(vec4, vec4) 1 { ir_to_mesa_emit_op2(tree, OPCODE_SGT); }
+vec4: sle_vec4_vec4(vec4, vec4) 1 { ir_to_mesa_emit_op2(tree, OPCODE_SLE); }
+vec4: sge_vec4_vec4(vec4, vec4) 1 { ir_to_mesa_emit_op2(tree, OPCODE_SGE); }
+vec4: sne_vec4_vec4(vec4, vec4) 1 { ir_to_mesa_emit_op2(tree, OPCODE_SNE); }
+vec4: seq_vec4_vec4(vec4, vec4) 1 { ir_to_mesa_emit_op2(tree, OPCODE_SEQ); }
+
 vec4: sqrt_vec4(vec4) 1
 {
        ir_to_mesa_emit_scalar_op1(tree, OPCODE_RSQ,