binop("umul24", tint32, _2src_commutative + associative,
"(((uint32_t)src0 << 8) >> 8) * (((uint32_t)src1 << 8) >> 8)")
+# relaxed versions of the above, which assume input is in the 24bit range (no clamping)
+binop("imul24_relaxed", tint32, _2src_commutative + associative, "src0 * src1")
+triop("umad24_relaxed", tuint32, _2src_commutative, "src0 * src1 + src2")
+binop("umul24_relaxed", tuint32, _2src_commutative + associative, "src0 * src1")
+
unop_convert("fisnormal", tbool1, tfloat, "isnormal(src0)")
unop_convert("fisfinite", tbool1, tfloat, "isfinite(src0)")
('iadd', ('imul', ('iand', a, 0xffffff), ('iand', b, 0xffffff)), c),
'!options->has_umad24'),
+ # Relaxed 24bit ops
+ (('imul24_relaxed', a, b), ('imul24', a, b), 'options->has_imul24'),
+ (('imul24_relaxed', a, b), ('imul', a, b), '!options->has_imul24'),
+ (('umad24_relaxed', a, b, c), ('umad24', a, b, c), 'options->has_umad24'),
+ (('umad24_relaxed', a, b, c), ('iadd', ('umul24_relaxed', a, b), c), '!options->has_umad24'),
+ (('umul24_relaxed', a, b), ('umul24', a, b), 'options->has_umul24'),
+ (('umul24_relaxed', a, b), ('imul', a, b), '!options->has_umul24'),
+
(('imad24_ir3', a, b, 0), ('imul24', a, b)),
(('imad24_ir3', a, 0, c), (c)),
(('imad24_ir3', a, 1, c), ('iadd', a, c)),