This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [rfa] Attempt #3: Eliminate HOST_*_FORMAT from arm-*tdep.c
- To: Andrew Cagney <ac131313 at cygnus dot com>
- Subject: Re: [rfa] Attempt #3: Eliminate HOST_*_FORMAT from arm-*tdep.c
- From: Andrew Cagney <ac131313 at cygnus dot com>
- Date: Tue, 07 Aug 2001 20:24:28 -0400
- Cc: gdb-patches at sources dot redhat dot com
- References: <3B60DF2A.5020902@cygnus.com>
Ping?
> Hello,
>
> Attatched is another attemt at eliminating the HOST_*_FORMAT references in arm-tdep.c and arm-linux-tdep.c. I'm definitly getting closer!
>
> This time, I also ``fixed'' the functions convert_to_extended() and convert_from_extended() to use portable floatformat_*() functions.
>
> With the patch applied testing on a big-endian host using the arm-sim target suggests things do indeed imrove. The tests:
>
> gdb.base/callfuncs.exp: p t_float_values
> gdb.base/callfuncs.exp: p t_float_values2
> gdb.base/callfwmall.exp: p t_float_values
> gdb.base/callfwmall.exp: p t_float_values2
>
> all started passing. At the same time I didn't see any regressions.
> Interestingly, testing on a little endian host showed no change in the test results.
>
> There is one FIXME. The code always uses floatformat_arm_ext. I'm windering if there needs to be both floatformat_arm_ext_big and floatformat_arm_ext_little. Anyone know the exact format used when storing BE/LE extended floats on the arm architecture?
>
> Anyway, I'm hopeing this is sufficient improvement over the previous mess to go in.
>
> Andrew
>
>
>
> 2001-07-24 Andrew Cagney <ac131313@redhat.com>
> * arm-tdep.c (convert_from_extended, convert_to_extended): Delete
> assembler version of function.
> (convert_from_extended, convert_to_extended): Rewrite using
> floatformat_to_doublest and floatformat_from_doublest.
> (arm_push_arguments): Use extract_floating and
> store_floating to perform floating point conversions.
> (SWAP_TARGET_AND_HOST): Delete macro.
> * arm-linux-tdep.c (arm_linux_push_arguments): Use
> extract_floating and store_floating to perform floating point
> conversions.
>
> Index: arm-linux-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/arm-linux-tdep.c,v
> retrieving revision 1.9
> diff -p -r1.9 arm-linux-tdep.c
> *** arm-linux-tdep.c 2001/07/15 20:10:02 1.9
> --- arm-linux-tdep.c 2001/07/27 02:44:41
> *************** arm_linux_push_arguments (int nargs, str
> *** 159,165 ****
> {
> int len;
> char *val;
> - double dbl_arg;
> CORE_ADDR regval;
> enum type_code typecode;
> struct type *arg_type, *target_type;
> --- 159,164 ----
> *************** arm_linux_push_arguments (int nargs, str
> *** 179,192 ****
> calling the function. */
> if (TYPE_CODE_FLT == typecode && REGISTER_SIZE == len)
> {
> - /* Float argument in buffer is in host format. Read it and
> - convert to DOUBLEST, and store it in target double. */
> DOUBLEST dblval;
> !
> len = TARGET_DOUBLE_BIT / TARGET_CHAR_BIT;
> ! floatformat_to_doublest (HOST_FLOAT_FORMAT, val, &dblval);
> ! store_floating (&dbl_arg, len, dblval);
> ! val = (char *) &dbl_arg;
> }
>
> /* If the argument is a pointer to a function, and it is a Thumb
> --- 178,188 ----
> calling the function. */
> if (TYPE_CODE_FLT == typecode && REGISTER_SIZE == len)
> {
> DOUBLEST dblval;
> ! dblval = extract_floating (val, len);
> len = TARGET_DOUBLE_BIT / TARGET_CHAR_BIT;
> ! val = alloca (len);
> ! store_floating (val, len, dblval);
> }
>
> /* If the argument is a pointer to a function, and it is a Thumb
> Index: arm-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/arm-tdep.c,v
> retrieving revision 1.13
> diff -p -r1.13 arm-tdep.c
> *** arm-tdep.c 2001/07/15 20:10:02 1.13
> --- arm-tdep.c 2001/07/27 02:44:46
> *************** struct frame_extra_info
> *** 117,140 ****
> #define MAKE_THUMB_ADDR(addr) ((addr) | 1)
> #define UNMAKE_THUMB_ADDR(addr) ((addr) & ~1)
>
> - #define SWAP_TARGET_AND_HOST(buffer,len) \
> - do \
> - { \
> - if (TARGET_BYTE_ORDER != HOST_BYTE_ORDER) \
> - { \
> - char tmp; \
> - char *p = (char *)(buffer); \
> - char *q = ((char *)(buffer)) + len - 1; \
> - for (; p < q; p++, q--) \
> - { \
> - tmp = *q; \
> - *q = *p; \
> - *p = tmp; \
> - } \
> - } \
> - } \
> - while (0)
> -
> /* Will a function return an aggregate type in memory or in a
> register? Return 0 if an aggregate type can be returned in a
> register, 1 if it must be returned in memory. */
> --- 117,122 ----
> *************** arm_push_arguments (int nargs, struct va
> *** 1309,1315 ****
> {
> int len;
> char *val;
> - double dbl_arg;
> CORE_ADDR regval;
> enum type_code typecode;
> struct type *arg_type, *target_type;
> --- 1291,1296 ----
> *************** arm_push_arguments (int nargs, struct va
> *** 1329,1350 ****
> calling the function. */
> if (TYPE_CODE_FLT == typecode && REGISTER_SIZE == len)
> {
> ! float f;
> ! double d;
> ! char * bufo = (char *) &d;
> ! char * bufd = (char *) &dbl_arg;
> !
> ! len = sizeof (double);
> ! f = *(float *) val;
> ! SWAP_TARGET_AND_HOST (&f, sizeof (float)); /* adjust endianess */
> ! d = f;
> ! /* We must revert the longwords so they get loaded into the
> ! the right registers. */
> ! memcpy (bufd, bufo + len / 2, len / 2);
> ! SWAP_TARGET_AND_HOST (bufd, len / 2); /* adjust endianess */
> ! memcpy (bufd + len / 2, bufo, len / 2);
> ! SWAP_TARGET_AND_HOST (bufd + len / 2, len / 2); /* adjust endianess */
> ! val = (char *) &dbl_arg;
> }
> #if 1
> /* I don't know why this code was disable. The only logical use
> --- 1310,1320 ----
> calling the function. */
> if (TYPE_CODE_FLT == typecode && REGISTER_SIZE == len)
> {
> ! DOUBLEST dblval;
> ! dblval = extract_floating (val, len);
> ! len = TARGET_DOUBLE_BIT / TARGET_CHAR_BIT;
> ! val = alloca (len);
> ! store_floating (val, len, dblval);
> }
> #if 1
> /* I don't know why this code was disable. The only logical use
> *************** arm_float_info (void)
> *** 1464,1507 ****
> fputs ("flags: ", stdout);
> print_fpu_flags (status);
> }
> -
> - #if 0
> - /* FIXME: The generated assembler works but sucks. Instead of using
> - r0, r1 it pushes them on the stack, then loads them into r3, r4 and
> - uses those registers. I must be missing something. ScottB */
>
> ! void
> ! convert_from_extended (void *ptr, void *dbl)
> ! {
> ! __asm__ ("
> ! ldfe f0,[%0]
> ! stfd f0,[%1] "
> ! : /* no output */
> ! : "r" (ptr), "r" (dbl));
> ! }
>
> - void
> - convert_to_extended (void *dbl, void *ptr)
> - {
> - __asm__ ("
> - ldfd f0,[%0]
> - stfe f0,[%1] "
> - : /* no output */
> - : "r" (dbl), "r" (ptr));
> - }
> - #else
> static void
> convert_from_extended (void *ptr, void *dbl)
> {
> ! *(double *) dbl = *(double *) ptr;
> }
>
> void
> convert_to_extended (void *dbl, void *ptr)
> {
> ! *(double *) ptr = *(double *) dbl;
> }
> - #endif
>
> /* Nonzero if register N requires conversion from raw format to
> virtual format. */
> --- 1434,1458 ----
> fputs ("flags: ", stdout);
> print_fpu_flags (status);
> }
>
> ! /* FIXME: cagney/2001-07-24: Is floatformat_arm_ext byte order
> ! dependant or independant? */
>
> static void
> convert_from_extended (void *ptr, void *dbl)
> {
> ! DOUBLEST d;
> ! floatformat_to_doublest (&floatformat_arm_ext, ptr, &d);
> ! floatformat_from_doublest (TARGET_DOUBLE_FORMAT, &d, dbl);
> }
>
> void
> convert_to_extended (void *dbl, void *ptr)
> {
> ! DOUBLEST d;
> ! floatformat_to_doublest (TARGET_DOUBLE_FORMAT, ptr, &d);
> ! floatformat_from_doublest (&floatformat_arm_ext, &d, dbl);
> }
>
> /* Nonzero if register N requires conversion from raw format to
> virtual format. */
>