From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21057 invoked by alias); 3 Feb 2010 03:31:37 -0000 Received: (qmail 21049 invoked by uid 22791); 3 Feb 2010 03:31:37 -0000 X-SWARE-Spam-Status: No, hits=-0.8 required=5.0 tests=AWL,BAYES_00,NO_DNS_FOR_FROM X-Spam-Check-By: sourceware.org Received: from mga05.intel.com (HELO fmsmga101.fm.intel.com) (192.55.52.89) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 03 Feb 2010 03:31:33 +0000 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 02 Feb 2010 19:30:03 -0800 X-ExtLoop1: 1 Received: from gnu-6.sc.intel.com ([10.3.194.107]) by fmsmga002.fm.intel.com with ESMTP; 02 Feb 2010 19:31:07 -0800 Received: by gnu-6.sc.intel.com (Postfix, from userid 500) id 0EA3C812344; Tue, 2 Feb 2010 19:31:31 -0800 (PST) Date: Wed, 03 Feb 2010 03:31:00 -0000 From: "H.J. Lu" To: GDB Subject: PATCH: Add regcache_raw_supply_part/regcache_raw_collect_part Message-ID: <20100203033131.GA21501@lucon.org> Reply-To: "H.J. Lu" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-08-17) Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-02/txt/msg00053.txt.bz2 Hi, Intel AVX saves a 256bit YMM register in lower 128bit and upper 128bit separately. This patch adds regcache_raw_supply_part and regcache_raw_collect_part. They will be used in AVX gdb patches . OK to install? Thanks. H.J. ---- 2010-02-02 H.J. Lu * regcache.c (regcache_raw_supply_part): New. (regcache_raw_collect_part): Likewise. * regcache.h (regcache_raw_supply_part): Likewise. (regcache_raw_collect_part): Likewise. diff --git a/gdb/regcache.c b/gdb/regcache.c index d6f58fe..f01b090 100644 --- a/gdb/regcache.c +++ b/gdb/regcache.c @@ -874,6 +874,48 @@ regcache_raw_collect (const struct regcache *regcache, int regnum, void *buf) memcpy (buf, regbuf, size); } +/* Supply SIZE bytes of register REGNUM, whose contents are stored in + BUF, to REGCACHE at OFFSET in byte, relative to register REGNUM, + and mark register REGNUM with VALID. */ + +void +regcache_raw_supply_part (struct regcache *regcache, int regnum, + const void *buf, int offset, size_t size, + int valid) +{ + char *regbuf; + + gdb_assert (regcache != NULL); + gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers); + gdb_assert (!regcache->readonly_p); + + regbuf = ((char *) register_buffer (regcache, regnum)) + offset; + + if (buf) + memcpy (regbuf, buf, size); + else + memset (regbuf, 0, size); + + /* Mark the register. */ + regcache->register_valid_p[regnum] = valid; +} + +/* Collect SIZE bytes of register REGNUM from REGCACHE from OFFSET in + byte, relative to register REGNUM, and store its contents in BUF. */ + +void +regcache_raw_collect_part (const struct regcache *regcache, int regnum, + void *buf, int offset, size_t size) +{ + const char *regbuf; + + gdb_assert (regcache != NULL && buf != NULL); + gdb_assert (regnum >= 0 && regnum < regcache->descr->nr_raw_registers); + + regbuf = ((char *) register_buffer (regcache, regnum)) + offset; + memcpy (buf, regbuf, size); +} + /* Special handling for register PC. */ diff --git a/gdb/regcache.h b/gdb/regcache.h index d870960..e31e1f9 100644 --- a/gdb/regcache.h +++ b/gdb/regcache.h @@ -114,6 +114,13 @@ extern void regcache_raw_supply (struct regcache *regcache, int regnum, const void *buf); extern void regcache_raw_collect (const struct regcache *regcache, int regnum, void *buf); +extern void regcache_raw_supply_part (struct regcache *regcache, + int regnum, const void *buf, + int offset, size_t size, + int valid); +extern void regcache_raw_collect_part (const struct regcache *regcache, + int regnum, void *buf, + int offset, size_t size); /* The type of a register. This function is slightly more efficient