diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2004-04-14 14:32:55 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2004-04-14 14:32:55 +0000 |
commit | 61218d193a20df95d34fa975b296448d382416a8 (patch) | |
tree | b2e6c7ae95cb2b492212b0a6b74fce0105912227 /gcc/builtins.c | |
parent | a69934e07eb54b76012e32a6aee54fe6af1faaa9 (diff) | |
download | gcc-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.c | 25 |
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; } |