+ operation("add_sat", 2, printable_name="add_sat", source_types=integer_types, c_expression={
+ 'u': "({src0} + {src1}) < {src0} ? UINT32_MAX : ({src0} + {src1})",
+ 'i': "iadd_saturate({src0}, {src1})",
+ 'u64': "({src0} + {src1}) < {src0} ? UINT64_MAX : ({src0} + {src1})",
+ 'i64': "iadd64_saturate({src0}, {src1})"
+ }),
+ operation("sub_sat", 2, printable_name="sub_sat", source_types=integer_types, c_expression={
+ 'u': "({src1} > {src0}) ? 0 : {src0} - {src1}",
+ 'i': "isub_saturate({src0}, {src1})",
+ 'u64': "({src1} > {src0}) ? 0 : {src0} - {src1}",
+ 'i64': "isub64_saturate({src0}, {src1})"
+ }),
+ operation("abs_sub", 2, printable_name="abs_sub", source_types=integer_types, c_expression={
+ 'u': "({src1} > {src0}) ? {src1} - {src0} : {src0} - {src1}",
+ 'i': "({src1} > {src0}) ? (unsigned){src1} - (unsigned){src0} : (unsigned){src0} - (unsigned){src1}",
+ 'u64': "({src1} > {src0}) ? {src1} - {src0} : {src0} - {src1}",
+ 'i64': "({src1} > {src0}) ? (uint64_t){src1} - (uint64_t){src0} : (uint64_t){src0} - (uint64_t){src1}",
+ }),
+ operation("avg", 2, printable_name="average", source_types=integer_types, c_expression="({src0} >> 1) + ({src1} >> 1) + (({src0} & {src1}) & 1)"),
+ operation("avg_round", 2, printable_name="average_rounded", source_types=integer_types, c_expression="({src0} >> 1) + ({src1} >> 1) + (({src0} | {src1}) & 1)"),
+