- [3, 3], [src_type, src_type], commutative,
- final(reduce_(reduce_(src0, src1), src2)))
- opcode(name + "4", output_size, output_type,
- [4, 4], [src_type, src_type], commutative,
- final(reduce_(reduce_(src0, src1), reduce_(src2, src3))))
-
-binop("fadd", tfloat, commutative + associative, "src0 + src1")
-binop("iadd", tint, commutative + associative, "src0 + src1")
-binop("uadd_sat", tuint, commutative,
- "(src0 + src1) < src0 ? UINT64_MAX : (src0 + src1)")
-binop("fsub", tfloat, "", "src0 - src1")
+ [3, 3], [src_type, src_type], False, _2src_commutative,
+ final(reduce_(reduce_(srcs[0], srcs[1]), srcs[2])))
+
+def binop_reduce_all_sizes(name, output_size, src_type, prereduce_expr,
+ reduce_expr, final_expr):
+ binop_reduce(name, output_size, tbool1, src_type,
+ prereduce_expr, reduce_expr, final_expr)
+ binop_reduce("b8" + name[1:], output_size, tbool8, src_type,
+ prereduce_expr, reduce_expr, final_expr)
+ binop_reduce("b16" + name[1:], output_size, tbool16, src_type,
+ prereduce_expr, reduce_expr, final_expr)
+ binop_reduce("b32" + name[1:], output_size, tbool32, src_type,
+ prereduce_expr, reduce_expr, final_expr)
+
+binop("fadd", tfloat, _2src_commutative + associative,"""
+if (nir_is_rounding_mode_rtz(execution_mode, bit_size)) {
+ if (bit_size == 64)
+ dst = _mesa_double_add_rtz(src0, src1);
+ else
+ dst = _mesa_double_to_float_rtz((double)src0 + (double)src1);
+} else {
+ dst = src0 + src1;
+}
+""")
+binop("iadd", tint, _2src_commutative + associative, "src0 + src1")
+binop("iadd_sat", tint, _2src_commutative, """
+ src1 > 0 ?
+ (src0 + src1 < src0 ? (1ull << (bit_size - 1)) - 1 : src0 + src1) :
+ (src0 < src0 + src1 ? (1ull << (bit_size - 1)) : src0 + src1)
+""")
+binop("uadd_sat", tuint, _2src_commutative,
+ "(src0 + src1) < src0 ? MAX_UINT_FOR_SIZE(sizeof(src0) * 8) : (src0 + src1)")
+binop("isub_sat", tint, "", """
+ src1 < 0 ?
+ (src0 - src1 < src0 ? (1ull << (bit_size - 1)) - 1 : src0 - src1) :
+ (src0 < src0 - src1 ? (1ull << (bit_size - 1)) : src0 - src1)
+""")
+binop("usub_sat", tuint, "", "src0 < src1 ? 0 : src0 - src1")
+
+binop("fsub", tfloat, "", """
+if (nir_is_rounding_mode_rtz(execution_mode, bit_size)) {
+ if (bit_size == 64)
+ dst = _mesa_double_sub_rtz(src0, src1);
+ else
+ dst = _mesa_double_to_float_rtz((double)src0 - (double)src1);
+} else {
+ dst = src0 - src1;
+}
+""")