2011/5/4 Richard Guenther <[email protected]>:
> On Mon, Apr 18, 2011 at 10:17 AM, Andreas Krebbel
> <[email protected]> wrote:
>> Hi,
>>
>> the attached patch uses the existing promote_function_mode hook. For
>> a libcall neither TYPE nor FNTYPE is available so I had to change a
>> few related function in order to deal with that.
>>
>> The patch also fixes the s390 DFP problems.
>>
>> Bye,
>>
>> -Andreas-
>>
>>
>> 2011-04-18 Andreas Krebbel <[email protected]>
>>
>> * calls.c (emit_library_call_value_1): Invoke
>> promote_function_mode hook on libcall arguments.
>> * explow.c (promote_function_mode, promote_mode): Handle TYPE
>> argument being NULL.
>> * targhooks.c (default_promote_function_mode): Lisewise.
>> * config/s390/s390.c (s390_promote_function_mode): Likewise.
>> * config/sparc/sparc.c (sparc_promote_function_mode): Likewise.
>>
>> * doc/tm.texi: Document that TYPE argument might be NULL.
>>
>>
>> Index: gcc/calls.c
>> ===================================================================
>> *** gcc/calls.c.orig
>> --- gcc/calls.c
>> *************** emit_library_call_value_1 (int retval, r
>> *** 3484,3489 ****
>> --- 3484,3490 ----
>> {
>> rtx val = va_arg (p, rtx);
>> enum machine_mode mode = (enum machine_mode) va_arg (p, int);
>> + int unsigned_p = 0;
>>
>> /* We cannot convert the arg value to the mode the library wants here;
>> must do it earlier where we know the signedness of the arg. */
>> *************** emit_library_call_value_1 (int retval, r
>> *** 3531,3539 ****
>> val = force_operand (XEXP (slot, 0), NULL_RTX);
>> }
>>
>> ! argvec[count].value = val;
>> argvec[count].mode = mode;
>> !
>> argvec[count].reg = targetm.calls.function_arg (&args_so_far, mode,
>> NULL_TREE, true);
>>
>> --- 3532,3540 ----
>> val = force_operand (XEXP (slot, 0), NULL_RTX);
>> }
>>
>> ! mode = promote_function_mode (NULL_TREE, mode, &unsigned_p,
>> NULL_TREE, 0);
>> argvec[count].mode = mode;
>> ! argvec[count].value = convert_modes (mode, GET_MODE (val), val, 0);
>> argvec[count].reg = targetm.calls.function_arg (&args_so_far, mode,
>> NULL_TREE, true);
>>
>> Index: gcc/config/s390/s390.c
>> ===================================================================
>> *** gcc/config/s390/s390.c.orig
>> --- gcc/config/s390/s390.c
>> *************** s390_promote_function_mode (const_tree t
>> *** 8742,8748 ****
>> if (INTEGRAL_MODE_P (mode)
>> && GET_MODE_SIZE (mode) < UNITS_PER_LONG)
>> {
>> ! if (POINTER_TYPE_P (type))
>> *punsignedp = POINTERS_EXTEND_UNSIGNED;
>> return Pmode;
>> }
>> --- 8742,8748 ----
>> if (INTEGRAL_MODE_P (mode)
>> && GET_MODE_SIZE (mode) < UNITS_PER_LONG)
>> {
>> ! if (type != NULL_TREE && POINTER_TYPE_P (type))
>> *punsignedp = POINTERS_EXTEND_UNSIGNED;
>> return Pmode;
>> }
>> Index: gcc/explow.c
>> ===================================================================
>> *** gcc/explow.c.orig
>> --- gcc/explow.c
>> *************** enum machine_mode
>> *** 771,776 ****
>> --- 771,787 ----
>> promote_function_mode (const_tree type, enum machine_mode mode, int
>> *punsignedp,
>> const_tree funtype, int for_return)
>> {
>> + /* Called without a type node for a libcall. */
>> + if (type == NULL_TREE)
>> + {
>> + if (INTEGRAL_MODE_P (mode))
>> + return targetm.calls.promote_function_mode (NULL_TREE, mode,
>> + punsignedp, funtype,
>> + for_return);
>> + else
>> + return mode;
>> + }
>> +
>> switch (TREE_CODE (type))
>> {
>> case INTEGER_TYPE: case ENUMERAL_TYPE: case BOOLEAN_TYPE:
>> *************** enum machine_mode
>> *** 791,796 ****
>> --- 802,813 ----
>> promote_mode (const_tree type ATTRIBUTE_UNUSED, enum machine_mode mode,
>> int *punsignedp ATTRIBUTE_UNUSED)
>> {
>> + /* For libcalls this is invoked without TYPE from the backends
>> + TARGET_PROMOTE_FUNCTION_MODE hooks. Don't do anything in that
>> + case. */
>> + if (type == NULL_TREE)
>> + return mode;
>> +
>
> This broke bootstrap
>
> /space/rguenther/src/svn/trunk/gcc/explow.c: In function 'promote_mode':
> /space/rguenther/src/svn/trunk/gcc/explow.c:815:3: error: ISO C90
> forbids mixed declarations and code [-Werror=edantic]
> cc1: all warnings being treated as errors
>
>
>> /* FIXME: this is the same logic that was there until GCC 4.4, but we
>> probably want to test POINTERS_EXTEND_UNSIGNED even if PROMOTE_MODE
>> is not defined. The affected targets are M32C, S390, SPARC. */
>> Index: gcc/config/sparc/sparc.c
>> ===================================================================
>> *** gcc/config/sparc/sparc.c.orig
>> --- gcc/config/sparc/sparc.c
>> *************** init_cumulative_args (struct sparc_args
>> *** 4965,4977 ****
>> /* Handle promotion of pointer and integer arguments. */
>>
>> static enum machine_mode
>> ! sparc_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
>> enum machine_mode mode,
>> ! int *punsignedp ATTRIBUTE_UNUSED,
>> const_tree fntype ATTRIBUTE_UNUSED,
>> int for_return ATTRIBUTE_UNUSED)
>> {
>> ! if (POINTER_TYPE_P (type))
>> {
>> *punsignedp = POINTERS_EXTEND_UNSIGNED;
>> return Pmode;
>> --- 4965,4977 ----
>> /* Handle promotion of pointer and integer arguments. */
>>
>> static enum machine_mode
>> ! sparc_promote_function_mode (const_tree type,
>> enum machine_mode mode,
>> ! int *punsignedp,
>> const_tree fntype ATTRIBUTE_UNUSED,
>> int for_return ATTRIBUTE_UNUSED)
>> {
>> ! if (type != NULL_TREE && POINTER_TYPE_P (type))
>> {
>> *punsignedp = POINTERS_EXTEND_UNSIGNED;
>> return Pmode;
>> Index: gcc/doc/tm.texi.in
>> ===================================================================
>> *** gcc/doc/tm.texi.in.orig
>> --- gcc/doc/tm.texi.in
>> *************** which an incoming parameter is copied, o
>> *** 952,957 ****
>> --- 952,959 ----
>> then the hook should return the same mode as @code{promote_mode}, though
>> the signedness may be different.
>>
>> + @var{type} can be omitted when promoting function arguments of libcalls.
>> +
>> The default is to not promote arguments and return values. You can
>> also define the hook to @code{default_promote_function_mode_always_promote}
>> if you would like to apply the same rules given by @code{PROMOTE_MODE}.
>> Index: gcc/doc/tm.texi
>> ===================================================================
>> *** gcc/doc/tm.texi.orig
>> --- gcc/doc/tm.texi
>> *************** which an incoming parameter is copied, o
>> *** 962,967 ****
>> --- 962,969 ----
>> then the hook should return the same mode as @code{promote_mode}, though
>> the signedness may be different.
>>
>> + @var{type} can be omitted when promoting function arguments of libcalls.
>> +
>> The default is to not promote arguments and return values. You can
>> also define the hook to @code{default_promote_function_mode_always_promote}
>> if you would like to apply the same rules given by @code{PROMOTE_MODE}.
>> Index: gcc/targhooks.c
>> ===================================================================
>> *** gcc/targhooks.c.orig
>> --- gcc/targhooks.c
>> *************** default_promote_function_mode (const_tre
>> *** 124,130 ****
>> const_tree funtype ATTRIBUTE_UNUSED,
>> int for_return ATTRIBUTE_UNUSED)
>> {
>> ! if (for_return == 2)
>> return promote_mode (type, mode, punsignedp);
>> return mode;
>> }
>> --- 124,130 ----
>> const_tree funtype ATTRIBUTE_UNUSED,
>> int for_return ATTRIBUTE_UNUSED)
>> {
>> ! if (type != NULL_TREE && for_return == 2)
>> return promote_mode (type, mode, punsignedp);
>> return mode;
>> }
>>
>
Yes, following patch fix that:
Index: explow.c
===================================================================
--- explow.c (revision 173374)
+++ explow.c (working copy)
@@ -802,6 +802,10 @@
promote_mode (const_tree type ATTRIBUTE_UNUSED, enum machine_mode mode,
int *punsignedp ATTRIBUTE_UNUSED)
{
+#ifdef PROMOTE_MODE
+ const enum tree_code code;
+ int unsignedp;
+#endif
/* For libcalls this is invoked without TYPE from the backends
TARGET_PROMOTE_FUNCTION_MODE hooks. Don't do anything in that
case. */
@@ -812,8 +816,8 @@
probably want to test POINTERS_EXTEND_UNSIGNED even if PROMOTE_MODE
is not defined. The affected targets are M32C, S390, SPARC. */
#ifdef PROMOTE_MODE
- const enum tree_code code = TREE_CODE (type);
- int unsignedp = *punsignedp;
+ code = TREE_CODE (type);
+ unsignedp = *punsignedp;
switch (code)
{
Ok for apply?
Regards,
Kai