glsl: Add a lowering pass for 64-bit integer modulus
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 18 Oct 2016 23:47:14 +0000 (16:47 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 20 Jan 2017 23:41:23 +0000 (15:41 -0800)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/compiler/glsl/ir_optimization.h
src/compiler/glsl/lower_int64.cpp

index 3f0ef7d280c6ab508d6873a24c9e034a2a3deb6c..d46b9579941b30b02bde6d61d81b686cb53bf317 100644 (file)
@@ -54,6 +54,7 @@
 #define MUL64                     (1U << 0)
 #define SIGN64                    (1U << 1)
 #define DIV64                     (1U << 2)
+#define MOD64                     (1U << 3)
 
 /**
  * \see class lower_packing_builtins_visitor
index a0b5e1809a55081401e54f95c3af851ad21bd565..0a19ce429e41b46023791a1bd9bca57652fa0bea 100644 (file)
@@ -379,6 +379,17 @@ lower_64bit_visitor::handle_rvalue(ir_rvalue **rvalue)
       }
       break;
 
+   case ir_binop_mod:
+      if (lowering(MOD64)) {
+         if (ir->type->base_type == GLSL_TYPE_UINT64) {
+            *rvalue = handle_op(ir, "__builtin_umod64", generate_ir::umod64);
+         } else {
+            *rvalue = handle_op(ir, "__builtin_imod64", generate_ir::imod64);
+         }
+         this->progress = true;
+      }
+      break;
+
    case ir_binop_mul:
       if (lowering(MUL64)) {
          *rvalue = handle_op(ir, "__builtin_umul64", generate_ir::umul64);