aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPan Li <pan2.li@intel.com>2024-12-11 19:09:08 +0800
committerPan Li <pan2.li@intel.com>2025-01-08 07:35:26 +0800
commit5080dbb807063061dbbe0a497d04629575f8c2af (patch)
tree1707496b70c8d7b4b49e89d75ae378f3859c0dfb /gcc
parentb755c151fde4ad736405bb2e13a7de0420161179 (diff)
downloadgcc-5080dbb807063061dbbe0a497d04629575f8c2af.zip
gcc-5080dbb807063061dbbe0a497d04629575f8c2af.tar.gz
gcc-5080dbb807063061dbbe0a497d04629575f8c2af.tar.bz2
Match: Refactor the signed SAT_SUB match patterns [NFC]
This patch would like to refactor the all signed SAT_ADD patterns, aka: * Extract type check outside. * Re-arrange the related match pattern forms together. The below test suites are passed for this patch. * The rv64gcv fully regression test. * The x86 bootstrap test. * The x86 fully regression test. gcc/ChangeLog: * match.pd: Refactor sorts of signed SAT_SUB match patterns. Signed-off-by: Pan Li <pan2.li@intel.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/match.pd98
1 files changed, 40 insertions, 58 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index ec508c5..5b5265a 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -3391,6 +3391,46 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(if (wi::bit_and (wi::to_wide (@1), wi::to_wide (@3)) == 0)))
)
+(if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type))
+ (match (signed_integer_sat_sub @0 @1)
+ /* T Z = (T)((UT)X - (UT)Y);
+ SAT_S_SUB = (X ^ Y) & (X ^ Z) < 0 ? (-(T)(X < 0) ^ MAX) : Z */
+ (cond^ (lt (bit_and:c (bit_xor:c @0 @1)
+ (bit_xor @0 (nop_convert@2 (minus (nop_convert @0)
+ (nop_convert @1)))))
+ integer_zerop)
+ (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value)
+ @2))
+ (match (signed_integer_sat_sub @0 @1)
+ /* T Z = (T)((UT)X - (UT)Y);
+ SAT_S_SUB = (X ^ Y) & (X ^ Z) >= 0 ? Z : (-(T)(X < 0) ^ MAX) */
+ (cond^ (ge (bit_and:c (bit_xor:c @0 @1)
+ (bit_xor @0 (nop_convert@2 (minus (nop_convert @0)
+ (nop_convert @1)))))
+ integer_zerop)
+ @2
+ (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value)))
+ (match (signed_integer_sat_sub @0 @1)
+ /* T Z = (T)((UT)X - (UT)Y);
+ SAT_S_SUB = (X ^ Y) < 0 & (X ^ Z) < 0 ? (-(T)(X < 0) ^ MAX) : Z */
+ (cond^ (bit_and:c (lt (bit_xor @0 (nop_convert@2 (minus (nop_convert @0)
+ (nop_convert @1))))
+ integer_zerop)
+ (lt (bit_xor:c @0 @1) integer_zerop))
+ (bit_xor:c (nop_convert (negate (nop_convert (convert
+ (lt @0 integer_zerop)))))
+ max_value)
+ @2))
+ (match (signed_integer_sat_sub @0 @1)
+ /* Z = .SUB_OVERFLOW (X, Y)
+ SAT_S_SUB = IMAGPART (Z) != 0 ? (-(T)(X < 0) ^ MAX) : REALPART (Z) */
+ (cond^ (ne (imagpart (IFN_SUB_OVERFLOW@2 @0 @1)) integer_zerop)
+ (bit_xor:c (nop_convert?
+ (negate (nop_convert? (convert (lt @0 integer_zerop)))))
+ max_value)
+ (realpart @2))
+ (if (types_match (type, @0, @1)))))
+
/* The boundary condition for case 10: IMM = 1:
SAT_U_SUB = X >= IMM ? (X - IMM) : 0.
simplify (X != 0 ? X + ~0 : 0) to X - (X != 0). */
@@ -3402,64 +3442,6 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(with { tree itype = TREE_TYPE (@2); }
(convert (minus @2 (convert:itype @1))))))
-/* Signed saturation sub, case 1:
- T minus = (T)((UT)X - (UT)Y);
- SAT_S_SUB = (X ^ Y) & (X ^ minus) < 0 ? (-(T)(X < 0) ^ MAX) : minus;
-
- The T and UT are type pair like T=int8_t, UT=uint8_t. */
-(match (signed_integer_sat_sub @0 @1)
- (cond^ (lt (bit_and:c (bit_xor:c @0 @1)
- (bit_xor @0 (nop_convert@2 (minus (nop_convert @0)
- (nop_convert @1)))))
- integer_zerop)
- (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value)
- @2)
- (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type))))
-
-/* Signed saturation sub, case 2:
- T minus = (T)((UT)X - (UT)Y);
- SAT_S_SUB = (X ^ Y) & (X ^ minus) < 0 ? (-(T)(X < 0) ^ MAX) : minus;
-
- The T and UT are type pair like T=int8_t, UT=uint8_t. */
-(match (signed_integer_sat_sub @0 @1)
- (cond^ (ge (bit_and:c (bit_xor:c @0 @1)
- (bit_xor @0 (nop_convert@2 (minus (nop_convert @0)
- (nop_convert @1)))))
- integer_zerop)
- @2
- (bit_xor:c (negate (convert (lt @0 integer_zerop))) max_value))
- (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type))))
-
-/* Signed saturation sub, case 3:
- Z = .SUB_OVERFLOW (X, Y)
- SAT_S_SUB = IMAGPART_EXPR (Z) != 0 ? (-(T)(X < 0) ^ MAX) : REALPART_EXPR (Z);
-
- The T and UT are type pair like T=int8_t, UT=uint8_t. */
-(match (signed_integer_sat_sub @0 @1)
- (cond^ (ne (imagpart (IFN_SUB_OVERFLOW@2 @0 @1)) integer_zerop)
- (bit_xor:c (nop_convert?
- (negate (nop_convert? (convert (lt @0 integer_zerop)))))
- max_value)
- (realpart @2))
- (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type)
- && types_match (type, @0, @1))))
-
-/* Signed saturation sub, case 4:
- T minus = (T)((UT)X - (UT)Y);
- SAT_S_SUB = (X ^ Y) < 0 & (X ^ minus) < 0 ? (-(T)(X < 0) ^ MAX) : minus;
-
- The T and UT are type pair like T=int8_t, UT=uint8_t. */
-(match (signed_integer_sat_sub @0 @1)
- (cond^ (bit_and:c (lt (bit_xor @0 (nop_convert@2 (minus (nop_convert @0)
- (nop_convert @1))))
- integer_zerop)
- (lt (bit_xor:c @0 @1) integer_zerop))
- (bit_xor:c (nop_convert (negate (nop_convert (convert
- (lt @0 integer_zerop)))))
- max_value)
- @2)
- (if (INTEGRAL_TYPE_P (type) && !TYPE_UNSIGNED (type))))
-
/* Signed saturation truncate, case 1 and case 2, sizeof (WT) > sizeof (NT).
SAT_S_TRUNC(X) = (unsigned)X + NT_MAX + 1 > Unsigned_MAX ? (NT)X. */
(match (signed_integer_sat_trunc @0)