From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23068 invoked by alias); 5 Apr 2005 16:58:50 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 21297 invoked from network); 5 Apr 2005 16:57:56 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org with SMTP; 5 Apr 2005 16:57:56 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.11/8.12.11) with ESMTP id j35GvYqJ003468 for ; Tue, 5 Apr 2005 12:57:34 -0400 Received: from zenia.home.redhat.com (sebastian-int.corp.redhat.com [172.16.52.221]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id j35GvWO26543; Tue, 5 Apr 2005 12:57:33 -0400 To: Mark Kettenis Cc: drow@false.org, gdb-patches@sources.redhat.com Subject: Re: RFC: Add 'double' member to 64-bit vector register type References: <20050319153709.GA4659@nevyn.them.org> <20050320023307.GA12519@nevyn.them.org> <200503201114.j2KBE12K023890@elgar.sibelius.xs4all.nl> From: Jim Blandy Date: Tue, 05 Apr 2005 16:58:00 -0000 In-Reply-To: <200503201114.j2KBE12K023890@elgar.sibelius.xs4all.nl> Message-ID: User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2005-04/txt/msg00049.txt.bz2 Mark Kettenis writes: > Date: Sat, 19 Mar 2005 21:33:07 -0500 > From: Daniel Jacobowitz > > On Sat, Mar 19, 2005 at 04:13:12PM -0500, Jim Blandy wrote: > > Well, that brings up the other thought --- since the set of types > > useful to include in a vector register really depends on the > > architecture, wouldn't it be better to just export the convenience > > functions for constructing these types from gdbtypes.c and then let > > architectures build ones that actually suit their needs? > > My inclination is "yes". Anybody else? > > I agree. Getting back to this... Here's a patch to move the IA-32 vector types out of gdbtypes.h. The PowerPC Altivec and SPE types are a little more work, since they need to be per-architecture, so I'll leave that to a separate patch. How does this look? (There really was no DEPRECATED_REGISTER_GDBARCH_SWAP entry for builtin_type_vec64i.) 2005-04-05 Jim Blandy Move construction of IA-32 vector types to i386-tdep.c. * gdbtypes.c (build_builtin_type_vec64i, build_builtin_type_vec128i): Delete functions. (builtin_type_vec64i, builtin_type_vec128i): Delete variables. (build_gdbtypes): Don't initialize them. (_initialize_gdbtypes): Don't register GDBARCH swap entries for them. * gdbtypes.h (builtin_type_vec64i, builtin_type_vec128i): Delete declarations. (builtin_type_v2_float, builtin_type_v2_int32, builtin_type_v4_int16, builtin_type_v8_int8, builtin_type_v2_double, builtin_type_v4_float, builtin_type_v2_int64, builtin_type_v4_int32, builtin_type_v8_int16, builtin_type_v16_int8): Add extern declarations. * i386-tdep.c (i386_mmx_type, i386_sse_type): New variables. (i386_build_mmx_type, i386_build_sse_type): New functions. (i386_register_type): Call them, rather than referring to builtin_type_vec64i and builtin_type_vec128i. Index: gdb/ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.7055 diff -c -p -r1.7055 ChangeLog *** gdb/ChangeLog 2 Apr 2005 22:59:16 -0000 1.7055 --- gdb/ChangeLog 5 Apr 2005 15:48:43 -0000 *************** *** 64,69 **** --- 64,91 ---- * Makefile.in (alpha-linux-tdep.o, ia64-linux-tdep.o) (sparc-linux-tdep.o): Update dependencies. + 2005-03-29 Jim Blandy + + Move construction of IA-32 vector types to i386-tdep.c. + * gdbtypes.c (build_builtin_type_vec64i, + build_builtin_type_vec128i): Delete functions. + (builtin_type_vec64i, builtin_type_vec128i): Delete variables. + (build_gdbtypes): Don't initialize them. + (_initialize_gdbtypes): Don't register GDBARCH swap entries for + them. + * gdbtypes.h (builtin_type_vec64i, builtin_type_vec128i): Delete + declarations. + (builtin_type_v2_float, builtin_type_v2_int32, + builtin_type_v4_int16, builtin_type_v8_int8, + builtin_type_v2_double, builtin_type_v4_float, + builtin_type_v2_int64, builtin_type_v4_int32, + builtin_type_v8_int16, builtin_type_v16_int8): Add extern + declarations. + * i386-tdep.c (i386_mmx_type, i386_sse_type): New variables. + (i386_build_mmx_type, i386_build_sse_type): New functions. + (i386_register_type): Call them, rather than referring to + builtin_type_vec64i and builtin_type_vec128i. + 2005-03-29 Daniel Jacobowitz * c-valprint.c (c_value_print): Fix up some formatting. Use Index: gdb/gdbtypes.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtypes.c,v retrieving revision 1.99 diff -c -p -r1.99 gdbtypes.c *** gdb/gdbtypes.c 24 Feb 2005 13:51:32 -0000 1.99 --- gdb/gdbtypes.c 5 Apr 2005 15:48:44 -0000 *************** struct type *builtin_type_v8hi; *** 94,102 **** struct type *builtin_type_v4hi; struct type *builtin_type_v2si; struct type *builtin_type_vec64; - struct type *builtin_type_vec64i; struct type *builtin_type_vec128; - struct type *builtin_type_vec128i; struct type *builtin_type_ieee_single[BFD_ENDIAN_UNKNOWN]; struct type *builtin_type_ieee_single_big; struct type *builtin_type_ieee_single_little; --- 94,100 ---- *************** build_builtin_type_vec64 (void) *** 918,951 **** } static struct type * - build_builtin_type_vec64i (void) - { - /* Construct a type for the 64 bit registers. The type we're - building is this: */ - #if 0 - union __gdb_builtin_type_vec64i - { - int64_t uint64; - int32_t v2_int32[2]; - int16_t v4_int16[4]; - int8_t v8_int8[8]; - }; - #endif - - struct type *t; - - t = init_composite_type ("__gdb_builtin_type_vec64i", TYPE_CODE_UNION); - append_composite_type_field (t, "uint64", builtin_type_int64); - append_composite_type_field (t, "v2_int32", builtin_type_v2_int32); - append_composite_type_field (t, "v4_int16", builtin_type_v4_int16); - append_composite_type_field (t, "v8_int8", builtin_type_v8_int8); - - TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; - TYPE_NAME (t) = "builtin_type_vec64i"; - return t; - } - - static struct type * build_builtin_type_vec128 (void) { /* Construct a type for the 128 bit registers. The type we're --- 916,921 ---- *************** build_builtin_type_vec128 (void) *** 975,1000 **** return t; } - static struct type * - build_builtin_type_vec128i (void) - { - /* 128-bit Intel SIMD registers */ - struct type *t; - - t = init_composite_type ("__gdb_builtin_type_vec128i", TYPE_CODE_UNION); - append_composite_type_field (t, "v4_float", builtin_type_v4_float); - append_composite_type_field (t, "v2_double", builtin_type_v2_double); - append_composite_type_field (t, "v16_int8", builtin_type_v16_int8); - append_composite_type_field (t, "v8_int16", builtin_type_v8_int16); - append_composite_type_field (t, "v4_int32", builtin_type_v4_int32); - append_composite_type_field (t, "v2_int64", builtin_type_v2_int64); - append_composite_type_field (t, "uint128", builtin_type_int128); - - TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; - TYPE_NAME (t) = "builtin_type_vec128i"; - return t; - } - /* Smash TYPE to be a type of members of DOMAIN with type TO_TYPE. A MEMBER is a wierd thing -- it amounts to a typed offset into a struct, e.g. "an int at offset 8". A MEMBER TYPE doesn't --- 945,950 ---- *************** Show resolution of opaque struct/class/u *** 3307,3315 **** /* Vector types. */ builtin_type_vec64 = build_builtin_type_vec64 (); - builtin_type_vec64i = build_builtin_type_vec64i (); builtin_type_vec128 = build_builtin_type_vec128 (); - builtin_type_vec128i = build_builtin_type_vec128i (); /* Pointer/Address types. */ --- 3257,3263 ---- *************** _initialize_gdbtypes (void) *** 3608,3614 **** DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_v8_int8); DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_v4_int16); DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_vec128); - DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_vec128i); DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_void_data_ptr); DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_void_func_ptr); DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_CORE_ADDR); --- 3556,3561 ---- Index: gdb/gdbtypes.h =================================================================== RCS file: /cvs/src/src/gdb/gdbtypes.h,v retrieving revision 1.61 diff -c -p -r1.61 gdbtypes.h *** gdb/gdbtypes.h 28 Jan 2005 19:03:53 -0000 1.61 --- gdb/gdbtypes.h 5 Apr 2005 15:48:44 -0000 *************** extern struct type *builtin_type_v8hi; *** 1072,1084 **** extern struct type *builtin_type_v4hi; extern struct type *builtin_type_v2si; ! /* Type for 64 bit vectors. */ extern struct type *builtin_type_vec64; - extern struct type *builtin_type_vec64i; ! /* Type for 128 bit vectors. */ extern struct type *builtin_type_vec128; - extern struct type *builtin_type_vec128i; /* Explicit floating-point formats. See "floatformat.h". */ extern struct type *builtin_type_ieee_single[BFD_ENDIAN_UNKNOWN]; --- 1072,1092 ---- extern struct type *builtin_type_v4hi; extern struct type *builtin_type_v2si; ! /* Types for 64 bit vectors. */ ! extern struct type *builtin_type_v2_float; ! extern struct type *builtin_type_v2_int32; ! extern struct type *builtin_type_v4_int16; ! extern struct type *builtin_type_v8_int8; extern struct type *builtin_type_vec64; ! /* Types for 128 bit vectors. */ ! extern struct type *builtin_type_v2_double; ! extern struct type *builtin_type_v4_float; ! extern struct type *builtin_type_v2_int64; ! extern struct type *builtin_type_v4_int32; ! extern struct type *builtin_type_v8_int16; ! extern struct type *builtin_type_v16_int8; extern struct type *builtin_type_vec128; /* Explicit floating-point formats. See "floatformat.h". */ extern struct type *builtin_type_ieee_single[BFD_ENDIAN_UNKNOWN]; Index: gdb/i386-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/i386-tdep.c,v retrieving revision 1.208 diff -c -p -r1.208 i386-tdep.c *** gdb/i386-tdep.c 21 Feb 2005 04:31:57 -0000 1.208 --- gdb/i386-tdep.c 5 Apr 2005 15:48:45 -0000 *************** i386_return_value (struct gdbarch *gdbar *** 1489,1494 **** --- 1489,1561 ---- } + /* Types for the MMX and SSE registers. */ + static struct type *i386_mmx_type; + static struct type *i386_sse_type; + + + /* Construct the type for MMX registers. */ + static struct type * + i386_build_mmx_type (void) + { + /* The type we're building is this: */ + #if 0 + union __gdb_builtin_type_vec64i + { + int64_t uint64; + int32_t v2_int32[2]; + int16_t v4_int16[4]; + int8_t v8_int8[8]; + }; + #endif + + if (! i386_mmx_type) + { + struct type *t; + + t = init_composite_type ("__gdb_builtin_type_vec64i", TYPE_CODE_UNION); + append_composite_type_field (t, "uint64", builtin_type_int64); + append_composite_type_field (t, "v2_int32", builtin_type_v2_int32); + append_composite_type_field (t, "v4_int16", builtin_type_v4_int16); + append_composite_type_field (t, "v8_int8", builtin_type_v8_int8); + + TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; + TYPE_NAME (t) = "builtin_type_vec64i"; + + i386_mmx_type = t; + } + + return i386_mmx_type; + } + + + /* Construct the type for SSE registers. */ + static struct type * + i386_build_sse_type (void) + { + if (! i386_sse_type) + { + struct type *t; + + t = init_composite_type ("__gdb_builtin_type_vec128i", TYPE_CODE_UNION); + append_composite_type_field (t, "v4_float", builtin_type_v4_float); + append_composite_type_field (t, "v2_double", builtin_type_v2_double); + append_composite_type_field (t, "v16_int8", builtin_type_v16_int8); + append_composite_type_field (t, "v8_int16", builtin_type_v8_int16); + append_composite_type_field (t, "v4_int32", builtin_type_v4_int32); + append_composite_type_field (t, "v2_int64", builtin_type_v2_int64); + append_composite_type_field (t, "uint128", builtin_type_int128); + + TYPE_FLAGS (t) |= TYPE_FLAG_VECTOR; + TYPE_NAME (t) = "builtin_type_vec128i"; + + i386_sse_type = t; + } + + return i386_sse_type; + } + + /* Return the GDB type object for the "standard" data type of data in register REGNUM. Perhaps %esi and %edi should go here, but potentially they could be used for things other than address. */ *************** i386_register_type (struct gdbarch *gdba *** 1504,1513 **** return builtin_type_i387_ext; if (i386_sse_regnum_p (gdbarch, regnum)) ! return builtin_type_vec128i; if (i386_mmx_regnum_p (gdbarch, regnum)) ! return builtin_type_vec64i; return builtin_type_int; } --- 1571,1580 ---- return builtin_type_i387_ext; if (i386_sse_regnum_p (gdbarch, regnum)) ! return i386_build_sse_type (); if (i386_mmx_regnum_p (gdbarch, regnum)) ! return i386_build_mmx_type (); return builtin_type_int; }