aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-06-11 19:57:02 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-06-11 19:57:02 -0700
commit116b7a5ea82b371a114209bd6b277e72ece51bc1 (patch)
treedfccc2fd109d0cf8d447280a8c2cd8a1a41a2904
parent0cec6af13cc6b2f44b21841c7ffda68b9d043318 (diff)
downloadgcc-116b7a5ea82b371a114209bd6b277e72ece51bc1.zip
gcc-116b7a5ea82b371a114209bd6b277e72ece51bc1.tar.gz
gcc-116b7a5ea82b371a114209bd6b277e72ece51bc1.tar.bz2
alpha.c (ALPHA_BUILTIN_THREAD_POINTER): New.
* config/alpha/alpha.c (ALPHA_BUILTIN_THREAD_POINTER): New. (ALPHA_BUILTIN_SET_THREAD_POINTER): New. (code_for_builtns): Update. (alpha_init_builtins): Add __builtin_thread_pointer and __builtin_set_thread_pointer. (alpha_expand_builtin): Handle void builtins. * doc/extend.texi (Alpha Built-in Functions): Update. From-SVN: r54543
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/alpha/alpha.c46
-rw-r--r--gcc/doc/extend.texi10
3 files changed, 56 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e777c5f..01d3cc6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2002-06-11 Richard Henderson <rth@redhat.com>
+
+ * config/alpha/alpha.c (ALPHA_BUILTIN_THREAD_POINTER): New.
+ (ALPHA_BUILTIN_SET_THREAD_POINTER): New.
+ (code_for_builtns): Update.
+ (alpha_init_builtins): Add __builtin_thread_pointer and
+ __builtin_set_thread_pointer.
+ (alpha_expand_builtin): Handle void builtins.
+ * doc/extend.texi (Alpha Built-in Functions): Update.
+
2002-06-11 Hans-Peter Nilsson <hp@axis.com>
PR target/6997
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 543d9d0..24e8c5c 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -6345,6 +6345,8 @@ enum alpha_builtin
ALPHA_BUILTIN_AMASK,
ALPHA_BUILTIN_IMPLVER,
ALPHA_BUILTIN_RPCC,
+ ALPHA_BUILTIN_THREAD_POINTER,
+ ALPHA_BUILTIN_SET_THREAD_POINTER,
/* TARGET_MAX */
ALPHA_BUILTIN_MINUB8,
@@ -6398,6 +6400,8 @@ static unsigned int const code_for_builtin[ALPHA_BUILTIN_max] = {
CODE_FOR_builtin_amask,
CODE_FOR_builtin_implver,
CODE_FOR_builtin_rpcc,
+ CODE_FOR_load_tp,
+ CODE_FOR_set_tp,
/* TARGET_MAX */
CODE_FOR_builtin_minub8,
@@ -6515,6 +6519,16 @@ alpha_init_builtins ()
for (i = 0; i < ARRAY_SIZE (two_arg_builtins); ++i, ++p)
if ((target_flags & p->target_mask) == p->target_mask)
builtin_function (p->name, ftype, p->code, BUILT_IN_MD, NULL);
+
+ ftype = build_function_type (ptr_type_node, void_list_node);
+ builtin_function ("__builtin_thread_pointer", ftype,
+ ALPHA_BUILTIN_THREAD_POINTER, BUILT_IN_MD, NULL);
+
+ ftype = build_function_type (void_type_node, tree_cons (NULL_TREE,
+ ptr_type_node,
+ void_list_node));
+ builtin_function ("__builtin_set_thread_pointer", ftype,
+ ALPHA_BUILTIN_SET_THREAD_POINTER, BUILT_IN_MD, NULL);
}
/* Expand an expression EXP that calls a built-in function,
@@ -6539,7 +6553,7 @@ alpha_expand_builtin (exp, target, subtarget, mode, ignore)
enum insn_code icode;
rtx op[MAX_ARGS], pat;
int arity;
- enum machine_mode tmode;
+ bool nonvoid;
if (fcode >= ALPHA_BUILTIN_max)
internal_error ("bad builtin fcode");
@@ -6547,6 +6561,8 @@ alpha_expand_builtin (exp, target, subtarget, mode, ignore)
if (icode == 0)
internal_error ("bad builtin fcode");
+ nonvoid = TREE_TYPE (TREE_TYPE (fndecl)) != void_type_node;
+
for (arglist = TREE_OPERAND (exp, 1), arity = 0;
arglist;
arglist = TREE_CHAIN (arglist), arity++)
@@ -6559,18 +6575,22 @@ alpha_expand_builtin (exp, target, subtarget, mode, ignore)
if (arity > MAX_ARGS)
return NULL_RTX;
- op[arity] = expand_expr (arg, NULL_RTX, VOIDmode, 0);
+ insn_op = &insn_data[icode].operand[arity + nonvoid];
+
+ op[arity] = expand_expr (arg, NULL_RTX, insn_op->mode, 0);
- insn_op = &insn_data[icode].operand[arity + 1];
if (!(*insn_op->predicate) (op[arity], insn_op->mode))
op[arity] = copy_to_mode_reg (insn_op->mode, op[arity]);
}
- tmode = insn_data[icode].operand[0].mode;
- if (!target
- || GET_MODE (target) != tmode
- || !(*insn_data[icode].operand[0].predicate) (target, tmode))
- target = gen_reg_rtx (tmode);
+ if (nonvoid)
+ {
+ enum machine_mode tmode = insn_data[icode].operand[0].mode;
+ if (!target
+ || GET_MODE (target) != tmode
+ || !(*insn_data[icode].operand[0].predicate) (target, tmode))
+ target = gen_reg_rtx (tmode);
+ }
switch (arity)
{
@@ -6578,7 +6598,10 @@ alpha_expand_builtin (exp, target, subtarget, mode, ignore)
pat = GEN_FCN (icode) (target);
break;
case 1:
- pat = GEN_FCN (icode) (target, op[0]);
+ if (nonvoid)
+ pat = GEN_FCN (icode) (target, op[0]);
+ else
+ pat = GEN_FCN (icode) (op[0]);
break;
case 2:
pat = GEN_FCN (icode) (target, op[0], op[1]);
@@ -6590,7 +6613,10 @@ alpha_expand_builtin (exp, target, subtarget, mode, ignore)
return NULL_RTX;
emit_insn (pat);
- return target;
+ if (nonvoid)
+ return target;
+ else
+ return const0_rtx;
}
/* This page contains routines that are used to determine what the function
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 76aa540..68d231d 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -4834,6 +4834,16 @@ long __builtin_alpha_ctlz (long)
long __builtin_alpha_ctpop (long)
@end example
+The following builtins are available on systems that use the OSF/1
+PALcode. Normally they invoke the @code{rduniq} and @code{wruniq}
+PAL calls, but when invoked with @option{-mtls-kernel}, they invoke
+@code{rdval} and @code{wrval}.
+
+@example
+void *__builtin_thread_pointer (void)
+void __builtin_set_thread_pointer (void *)
+@end example
+
@node X86 Built-in Functions
@subsection X86 Built-in Functions