ir_to_mesa: Add support for trunc/ceil/floor.
authorEric Anholt <eric@anholt.net>
Wed, 19 May 2010 23:02:00 +0000 (16:02 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 24 Jun 2010 22:05:20 +0000 (15:05 -0700)
ir_to_mesa.cpp
mesa_codegen.brg

index 722e93a..edc95eb 100644 (file)
@@ -520,6 +520,15 @@ ir_to_mesa_visitor::visit(ir_expression *ir)
       this->result = this->create_tree(MB_TERM_sne_vec4_vec4, ir,
                                       op[0], this->result);
       break;
+   case ir_unop_trunc:
+      this->result = this->create_tree(MB_TERM_trunc_vec4, ir, op[0], NULL);
+      break;
+   case ir_unop_ceil:
+      this->result = this->create_tree(MB_TERM_ceil_vec4, ir, op[0], NULL);
+      break;
+   case ir_unop_floor:
+      this->result = this->create_tree(MB_TERM_floor_vec4, ir, op[0], NULL);
+      break;
    default:
       break;
    }
index fc59a83..25c0c47 100644 (file)
@@ -53,6 +53,9 @@
 %term exp2_vec4
 %term log_vec4
 %term log2_vec4
+%term trunc_vec4
+%term ceil_vec4
+%term floor_vec4
 %term sin_vec4
 %term cos_vec4
 %term add_vec4_vec4
@@ -71,7 +74,6 @@
 %term sqrt_vec4
 %term rsq_vec4
 %term swizzle_vec4
-%term trunc_vec4
 
 # Each tree will produce stmt.  Currently, the only production for
 # stmt is from an assign rule -- every statement tree from
@@ -159,6 +161,16 @@ vec4: swizzle_vec4(vec4) 1
                                 reg);
 }
 
+vec4: trunc_vec4(vec4) 1 { ir_to_mesa_emit_op1(tree, OPCODE_TRUNC); }
+
+vec4: ceil_vec4(vec4) 1 {
+       tree->left->src_reg.negate = ~tree->left->src_reg.negate;
+       ir_to_mesa_emit_op1(tree, OPCODE_FLR);
+       tree->src_reg.negate = ~tree->left->src_reg.negate;
+}
+
+vec4: floor_vec4(vec4) 1 { ir_to_mesa_emit_op1(tree, OPCODE_FLR); }
+
 vec4: sin_vec4(vec4) 1
 {
        ir_to_mesa_emit_scalar_op1(tree, OPCODE_SIN,
@@ -261,6 +273,4 @@ vec4: log2_vec4(vec4) 1
                                   tree->left->src_reg);
 }
 
-vec4: trunc_vec4(vec4) 1 { ir_to_mesa_emit_op1(tree, OPCODE_TRUNC); }
-
 %%