aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c25
-rw-r--r--gcc/defaults.h9
-rw-r--r--gcc/doc/tm.texi13
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/torture/builtin-ctype-2.c23
6 files changed, 73 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 00c6511..0312f28 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2004-04-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+ * builtins.c (fold_builtin_isdigit): New.
+ (fold_builtin): Handle BUILT_IN_ISDIGIT.
+ * defaults.h: Add TARGET_DIGIT0 and sort.
+ * doc/tm.texi: Add TARGET_BS and TARGET_DIGIT0.
+
+2004-04-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
* builtins.c (fold_builtin_cabs, fold_builtin): Use
`mathfn_built_in' to determine the new builtin.
* fold-const.c (fold): Likewise.
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 184711b..e1ba858 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -6767,6 +6767,28 @@ fold_builtin_toascii (tree arglist)
}
}
+/* Fold a call to builtin isdigit. */
+
+static tree
+fold_builtin_isdigit (tree arglist)
+{
+ if (! validate_arglist (arglist, INTEGER_TYPE, VOID_TYPE))
+ return 0;
+ else
+ {
+ /* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9. */
+ /* According to the C standard, isdigit is unaffected by locale. */
+ tree arg = TREE_VALUE (arglist);
+ arg = build1 (NOP_EXPR, unsigned_type_node, arg);
+ arg = build (MINUS_EXPR, unsigned_type_node, arg,
+ fold (build1 (NOP_EXPR, unsigned_type_node,
+ build_int_2 (TARGET_DIGIT0, 0))));
+ arg = build (LE_EXPR, integer_type_node, arg,
+ fold (build1 (NOP_EXPR, unsigned_type_node,
+ build_int_2 (9, 0))));
+ return fold (arg);
+ }
+}
/* Used by constant folding to eliminate some builtin calls early. EXP is
the CALL_EXPR of a call to a builtin function. */
@@ -7257,6 +7279,9 @@ fold_builtin (tree exp)
case BUILT_IN_TOASCII:
return fold_builtin_toascii (arglist);
+ case BUILT_IN_ISDIGIT:
+ return fold_builtin_isdigit (arglist);
+
default:
break;
}
diff --git a/gcc/defaults.h b/gcc/defaults.h
index 5867291..b238409 100644
--- a/gcc/defaults.h
+++ b/gcc/defaults.h
@@ -39,12 +39,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#ifndef TARGET_BELL
# define TARGET_BELL 007
# define TARGET_BS 010
-# define TARGET_TAB 011
-# define TARGET_NEWLINE 012
-# define TARGET_VT 013
-# define TARGET_FF 014
# define TARGET_CR 015
+# define TARGET_DIGIT0 060
# define TARGET_ESC 033
+# define TARGET_FF 014
+# define TARGET_NEWLINE 012
+# define TARGET_TAB 011
+# define TARGET_VT 013
#endif
/* Store in OUTPUT a string (made with alloca) containing an
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 39ddcc3..85515bf 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -1787,13 +1787,16 @@ of words in each data entry.
@section Target Character Escape Sequences
@cindex escape sequences
-By default, GCC assumes that the C character escape sequences take on
-their ASCII values for the target. If this is not correct, you must
-explicitly define all of the macros below. All of them must evaluate
-to constants; they are used in @code{case} statements.
+By default, GCC assumes that the C character escape sequences and other
+characters take on their ASCII values for the target. If this is not
+correct, you must explicitly define all of the macros below. All of
+them must evaluate to constants; they are used in @code{case}
+statements.
@findex TARGET_BELL
+@findex TARGET_BS
@findex TARGET_CR
+@findex TARGET_DIGIT0
@findex TARGET_ESC
@findex TARGET_FF
@findex TARGET_NEWLINE
@@ -1802,7 +1805,9 @@ to constants; they are used in @code{case} statements.
@multitable {@code{TARGET_NEWLINE}} {Escape} {ASCII character}
@item Macro @tab Escape @tab ASCII character
@item @code{TARGET_BELL} @tab @kbd{\a} @tab @code{07}, @code{BEL}
+@item @code{TARGET_BS} @tab @kbd{\b} @tab @code{08}, @code{BS}
@item @code{TARGET_CR} @tab @kbd{\r} @tab @code{0D}, @code{CR}
+@item @code{TARGET_DIGIT0} @tab @kbd{0} @tab @code{30}, @code{ZERO}
@item @code{TARGET_ESC} @tab @kbd{\e}, @kbd{\E} @tab @code{1B}, @code{ESC}
@item @code{TARGET_FF} @tab @kbd{\f} @tab @code{0C}, @code{FF}
@item @code{TARGET_NEWLINE} @tab @kbd{\n} @tab @code{0A}, @code{LF}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 178d815..47f2011 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-04-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gcc.dg/torture/builtin-ctype-2.c: Test builtin isdigit.
+
2004-04-13 Uros Bizjak <uros@kss-loka.si>:
* gcc.dg/i386-387-1.c: Add new test for __builtin_tan.
diff --git a/gcc/testsuite/gcc.dg/torture/builtin-ctype-2.c b/gcc/testsuite/gcc.dg/torture/builtin-ctype-2.c
index a306bcc..7046aad 100644
--- a/gcc/testsuite/gcc.dg/torture/builtin-ctype-2.c
+++ b/gcc/testsuite/gcc.dg/torture/builtin-ctype-2.c
@@ -75,6 +75,29 @@ void test(int i)
if (toascii(i) != (i & 0x7f))
link_failure_var();
+ TEST_CTYPE_CST_TRUE (isdigit, '0');
+ TEST_CTYPE_CST_TRUE (isdigit, '1');
+ TEST_CTYPE_CST_TRUE (isdigit, '2');
+ TEST_CTYPE_CST_TRUE (isdigit, '3');
+ TEST_CTYPE_CST_TRUE (isdigit, '4');
+ TEST_CTYPE_CST_TRUE (isdigit, '5');
+ TEST_CTYPE_CST_TRUE (isdigit, '6');
+ TEST_CTYPE_CST_TRUE (isdigit, '7');
+ TEST_CTYPE_CST_TRUE (isdigit, '8');
+ TEST_CTYPE_CST_TRUE (isdigit, '9');
+
+ TEST_CTYPE_CST_FALSE (isdigit, '0'-1);
+ TEST_CTYPE_CST_FALSE (isdigit, '9'+1);
+ TEST_CTYPE_CST_FALSE (isdigit, -1);
+ TEST_CTYPE_CST_FALSE (isdigit, 0);
+ TEST_CTYPE_CST_FALSE (isdigit, 255);
+ TEST_CTYPE_CST_FALSE (isdigit, 256);
+ TEST_CTYPE_CST_FALSE (isdigit, 10000);
+ TEST_CTYPE_CST_FALSE (isdigit, __INT_MAX__);
+
+ /* This ctype call should transform into another expression. */
+ if (isdigit(i) != ((unsigned)i - '0' <= 9))
+ link_failure_var();
#endif /* __OPTIMIZE__ */
}