This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: patch: vector register arguments
- To: gcc patches <gcc-patches at gcc dot gnu dot org>
- Subject: Re: patch: vector register arguments
- From: Aldy Hernandez <aldyh at redhat dot com>
- Date: 02 Nov 2001 13:48:38 -0500
- Cc: Geoff Keating <geoffk at cygnus dot com>
- References: <1004658950.30176.331.camel@litecycle.cc.andrews.edu>
>>>>> "Aldy" == Aldy Hernandez <aldyh@redhat.com> writes:
> hi guys.
> the altivec abi has 8 vector registers in which to pass vector
> arguments. __builtin_apply does not handle vector arguments, only INT
> and FLOAT. consequently, apply_args_size() and apply_result_size() are
> dying.
> here is a patch to handle MODE_VECTOR_FLOAT and MODE_VECTOR_INT. i put
> MODE_VECTOR_FLOAT first because the common denominator among mmx/altivec
> style extensions is float vectors.
> i assume this was just an oversight.
I've found another problem with vector registers as arguments...
Not only is apply_args_size() and apply_result_size() not set to
handle vector arguments (patch to fix below), but GET_MODE_WIDER_MODE
is not set for vector modes in machmode.def (patch below as well).
Without wider mode information, gcc is unable to determine how to
store a given vector register if the narrowest vector mode (V2SF or
V2QI) does not exist in the given target. Gcc will try to iterate to
get a wider mode, and unable to find one that fits, aborts.
The patch below, adds wider mode information to the vector types.
They are ordered by ascending bit sizes and when bit sizes are the
same, by QI->HI->SI->DI etc.
I'm also including the builtins.c patch to handle vector arguments for
reference, since they are topically related.
Both need approval.
Ok to install?
2001-11-02 Aldy Hernandez <aldyh@redhat.com>
* builtins.c (apply_args_size): Handle vector arguments.
(apply_result_size): Same.
* machmode.def: Set WIDER mode field for all vector entries.
Index: builtins.c
===================================================================
RCS file: /cvs/uberbaum/gcc/builtins.c,v
retrieving revision 1.125
diff -c -p -r1.125 builtins.c
*** builtins.c 2001/10/28 20:42:29 1.125
--- builtins.c 2001/11/02 18:37:34
*************** apply_args_size ()
*** 836,841 ****
--- 836,857 ----
&& have_insn_for (SET, mode))
best_mode = mode;
+ if (best_mode == VOIDmode)
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ if (HARD_REGNO_MODE_OK (regno, mode)
+ && have_insn_for (SET, mode))
+ best_mode = mode;
+
+ if (best_mode == VOIDmode)
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ if (HARD_REGNO_MODE_OK (regno, mode)
+ && have_insn_for (SET, mode))
+ best_mode = mode;
+
mode = best_mode;
if (mode == VOIDmode)
abort ();
*************** apply_result_size ()
*** 886,891 ****
--- 902,923 ----
if (best_mode == VOIDmode)
for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ if (HARD_REGNO_MODE_OK (regno, mode)
+ && have_insn_for (SET, mode))
+ best_mode = mode;
+
+ if (best_mode == VOIDmode)
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
+ mode != VOIDmode;
+ mode = GET_MODE_WIDER_MODE (mode))
+ if (HARD_REGNO_MODE_OK (regno, mode)
+ && have_insn_for (SET, mode))
+ best_mode = mode;
+
+ if (best_mode == VOIDmode)
+ for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode))
if (HARD_REGNO_MODE_OK (regno, mode)
Index: machmode.def
===================================================================
RCS file: /cvs/uberbaum/gcc/machmode.def,v
retrieving revision 1.13
diff -c -p -r1.13 machmode.def
*** machmode.def 2001/08/22 14:35:29 1.13
--- machmode.def 2001/11/02 18:37:34
*************** DEF_MACHMODE (COImode, "COI", MODE_COMPL
*** 108,137 ****
/* Vector modes. */
/* There are no V1xx vector modes. These are equivalent to normal
scalar modes. */
! DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, VOIDmode)
! DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, VOIDmode)
! DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, VOIDmode)
! DEF_MACHMODE (V2DImode, "V2DI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 8, VOIDmode)
!
! DEF_MACHMODE (V4QImode, "V4QI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 1, VOIDmode)
! DEF_MACHMODE (V4HImode, "V4HI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 2, VOIDmode)
! DEF_MACHMODE (V4SImode, "V4SI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 4, VOIDmode)
! DEF_MACHMODE (V4DImode, "V4DI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 8, VOIDmode)
!
! DEF_MACHMODE (V8QImode, "V8QI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 1, VOIDmode)
! DEF_MACHMODE (V8HImode, "V8HI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 2, VOIDmode)
! DEF_MACHMODE (V8SImode, "V8SI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 4, VOIDmode)
DEF_MACHMODE (V8DImode, "V8DI", MODE_VECTOR_INT, BITS_PER_UNIT*64, 64, 8, VOIDmode)
! DEF_MACHMODE (V16QImode, "V16QI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 1, VOIDmode)
! DEF_MACHMODE (V2SFmode, "V2SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8, 8, 4, VOIDmode)
! DEF_MACHMODE (V2DFmode, "V2DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 8, VOIDmode)
! DEF_MACHMODE (V4SFmode, "V4SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 4, VOIDmode)
! DEF_MACHMODE (V4DFmode, "V4DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 8, VOIDmode)
! DEF_MACHMODE (V8SFmode, "V8SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 4, VOIDmode)
DEF_MACHMODE (V8DFmode, "V8DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*64, 64, 8, VOIDmode)
/* BLKmode is used for structures, arrays, etc.
--- 108,140 ----
/* Vector modes. */
/* There are no V1xx vector modes. These are equivalent to normal
scalar modes. */
! /* The wider mode field for vectors follows in order of increasing bit
! size with QI coming before HI, HI before SI, and SI before DF
! within same bit sizes. */
! DEF_MACHMODE (V2QImode, "V2QI", MODE_VECTOR_INT, BITS_PER_UNIT*2, 2, 1, V4QImode)
! DEF_MACHMODE (V2HImode, "V2HI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 2, V8QImode)
! DEF_MACHMODE (V2SImode, "V2SI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 4, V16QImode)
! DEF_MACHMODE (V2DImode, "V2DI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 8, V8SImode)
!
! DEF_MACHMODE (V4QImode, "V4QI", MODE_VECTOR_INT, BITS_PER_UNIT*4, 4, 1, V2HImode)
! DEF_MACHMODE (V4HImode, "V4HI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 2, V2SImode)
! DEF_MACHMODE (V4SImode, "V4SI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 4, V2DImode)
! DEF_MACHMODE (V4DImode, "V4DI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 8, V8DImode)
!
! DEF_MACHMODE (V8QImode, "V8QI", MODE_VECTOR_INT, BITS_PER_UNIT*8, 8, 1, V4HImode)
! DEF_MACHMODE (V8HImode, "V8HI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 2, V4SImode)
! DEF_MACHMODE (V8SImode, "V8SI", MODE_VECTOR_INT, BITS_PER_UNIT*32, 32, 4, V4DImode)
DEF_MACHMODE (V8DImode, "V8DI", MODE_VECTOR_INT, BITS_PER_UNIT*64, 64, 8, VOIDmode)
! DEF_MACHMODE (V16QImode, "V16QI", MODE_VECTOR_INT, BITS_PER_UNIT*16, 16, 1, V8HImode)
! DEF_MACHMODE (V2SFmode, "V2SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*8, 8, 4, V4SFmode)
! DEF_MACHMODE (V2DFmode, "V2DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 8, V8SFmode)
! DEF_MACHMODE (V4SFmode, "V4SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*16, 16, 4, V2DFmode)
! DEF_MACHMODE (V4DFmode, "V4DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 8, V8DFmode)
! DEF_MACHMODE (V8SFmode, "V8SF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*32, 32, 4,V4DFmode)
DEF_MACHMODE (V8DFmode, "V8DF", MODE_VECTOR_FLOAT, BITS_PER_UNIT*64, 64, 8, VOIDmode)
/* BLKmode is used for structures, arrays, etc.