aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2004-04-14 14:32:55 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2004-04-14 14:32:55 +0000
commit61218d193a20df95d34fa975b296448d382416a8 (patch)
treeb2e6c7ae95cb2b492212b0a6b74fce0105912227 /gcc/builtins.c
parenta69934e07eb54b76012e32a6aee54fe6af1faaa9 (diff)
downloadgcc-61218d193a20df95d34fa975b296448d382416a8.zip
gcc-61218d193a20df95d34fa975b296448d382416a8.tar.gz
gcc-61218d193a20df95d34fa975b296448d382416a8.tar.bz2
builtins.c (fold_builtin_isdigit): New.
* 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. testsuite: * gcc.dg/torture/builtin-ctype-2.c: Test builtin isdigit. From-SVN: r80681
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c25
1 files changed, 25 insertions, 0 deletions
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;
}