From patchwork Mon Feb 6 11:45:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georg-Johann Lay X-Patchwork-Id: 139717 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 26C95B721C for ; Mon, 6 Feb 2012 22:46:13 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1329133575; h=Comment: DomainKey-Signature:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject: References:In-Reply-To:Content-Type:Mailing-List:Precedence: List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender: Delivered-To; bh=teSLqaKmQruAjlKswRdePn40DXo=; b=i3KZMK05Yti2k4q 0BXIqdo/+JDRWjx+I+zaG70xoX5cm1tFuHIp6Cb0Bz60ICiev0Ncktox6EqXdMhr dhBtfwOS5qSJYWKENa6Wj2pMI93MlZ6O0ZuCZiqXfSY5QqDf2JiCRlhCa0QJ1vp0 UPR29bQDPZaRO6IYld50MyybWPuM= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:X-RZG-AUTH:X-RZG-CLASS-ID:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:References:In-Reply-To:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=XkNKzBJ7Y4xAFSYIzTbf3W1idox8Qp7SeaVrp4I2SxQx3UBluqFwWJS48Xrsar XkqV1/riGvHrTiSVXN1YgEg79uNFaGa59OC1r93jrXe6mn5HGoY5Vq/uqqWt15oz fT9pZwVB86mh2si86eSYeNCA6Jd6zbDpzfaNn8ZDRa/NQ=; Received: (qmail 9872 invoked by alias); 6 Feb 2012 11:46:08 -0000 Received: (qmail 9857 invoked by uid 22791); 6 Feb 2012 11:46:05 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 06 Feb 2012 11:45:48 +0000 X-RZG-AUTH: :LXoWVUeid/7A29J/hMvvT2k715jHQaJercGObUOFkj18odoYNahU4Q== X-RZG-CLASS-ID: mo00 Received: from [192.168.0.22] (business-188-111-022-002.static.arcor-ip.net [188.111.22.2]) by smtp.strato.de (klopstock mo49) (RZmta 27.6 AUTH) with ESMTPA id Y0164co16B5oh2 ; Mon, 6 Feb 2012 12:45:29 +0100 (MET) Message-ID: <4F2FBD57.30502@gjlay.de> Date: Mon, 06 Feb 2012 12:45:27 +0100 From: Georg-Johann Lay User-Agent: Thunderbird 2.0.0.24 (X11/20100302) MIME-Version: 1.0 To: "Weddington, Eric" CC: gcc-patches@gcc.gnu.org, Denis Chertykov Subject: Re: [Patch,AVR]: Clean up hard-coded SFR addresses References: <4F2C39AE.7030708@gjlay.de> <8D64F155F1C88743BFDC71288E8E2DA806F8E1D0@csomb01.corp.atmel.com> In-Reply-To: <8D64F155F1C88743BFDC71288E8E2DA806F8E1D0@csomb01.corp.atmel.com> X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Weddington, Eric wrote: > >> -----Original Message----- >> From: Georg-Johann Lay [mailto:avr@gjlay.de] >> Sent: Friday, February 03, 2012 12:47 PM >> To: gcc-patches@gcc.gnu.org >> Cc: Denis Chertykov; Weddington, Eric >> Subject: [Patch,AVR]: Clean up hard-coded SFR addresses >> >> This patch removes the define_constants from avr.md: >> SREG_ADDR, SP_ADDR, RAMPZ_ADDR. >> >> The constants were not used in md directly and didn't take care of > afr_offset >> between RAM and I/O address. >> >> The replacement is a new structure avr_addr that holds RAM addresses > of >> respective SFRs and takes into account avr_current_arch->sfr_offset. >> >> sfr_offset is the same for all architectures, but that may change in > the >> future. >> >> Tested without regression. >> >> Ok for trunk? > > In the struct avr_addr_t is there any reason why you didn't want to have > the low and high bytes of the stack pointer in a union with the full > stack pointer? > > Eric Here is an updated patch without the SP/SP_L duplicate. Johann * config/avr/avr.md (SREG_ADDR): Remove constant definition. (SP_ADDR): Ditto. (RAMPZ_ADDR): Ditto. * config/avr/avr.c (avr_addr_t): New typedef. (avr_addr): New struct to hold RAM address of SP_L, SP_H, RAMPZ, SREG. (avr_init_expanders): Initialize it. (expand_prologue): Use avr_addr instead of RAMPZ_ADDR, SP_ADDR, SREG_ADDR. (expand_epilogue): Ditto. (avr_print_operand): Ditto. (avr_file_start): Ditto. (avr_emit_movmemhi): Ditto. Index: config/avr/avr.md =================================================================== --- config/avr/avr.md (revision 183932) +++ config/avr/avr.md (working copy) @@ -57,12 +57,6 @@ (define_constants (LPM_REGNO 0) ; implicit target register of LPM (TMP_REGNO 0) ; temporary register r0 (ZERO_REGNO 1) ; zero register r1 - - ;; RAM addresses of some SFRs common to all Devices. - - (SREG_ADDR 0x5F) ; Status Register - (SP_ADDR 0x5D) ; Stack Pointer - (RAMPZ_ADDR 0x5B) ; Address' high part when loading via ELPM ]) (define_c_enum "unspec" Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (revision 183932) +++ config/avr/avr.c (working copy) @@ -104,6 +104,24 @@ static const char* const progmem_section ".progmem5.data" }; +/* Holding RAM addresses of some SFRs used by the compiler and that + are unique over all devices in an architecture like 'avr4'. */ + +typedef struct +{ + /* SREG: The pocessor status */ + int sreg; + + /* RAMPZ: The high byte of 24-bit address used with ELPM */ + int rampz; + + /* SP: The stack pointer and its low and high byte */ + int sp_l; + int sp_h; +} avr_addr_t; + +static avr_addr_t avr_addr; + /* Prototypes for local helper functions. */ @@ -394,6 +412,18 @@ avr_option_override (void) avr_current_device = &avr_mcu_types[avr_mcu_index]; avr_current_arch = &avr_arch_types[avr_current_device->arch]; avr_extra_arch_macro = avr_current_device->macro; + + /* RAM addresses of some SFRs common to all Devices in respective Arch. */ + + /* SREG: Status Register containing flags like I (global IRQ) */ + avr_addr.sreg = 0x3F + avr_current_arch->sfr_offset; + + /* RAMPZ: Address' high part when loading via ELPM */ + avr_addr.rampz = 0x3B + avr_current_arch->sfr_offset; + + /* SP: Stack Pointer (SP_H:SP_L) */ + avr_addr.sp_l = 0x3D + avr_current_arch->sfr_offset; + avr_addr.sp_h = avr_addr.sp_l + 1; init_machine_status = avr_init_machine_status; @@ -433,7 +463,7 @@ avr_init_expanders (void) lpm_addr_reg_rtx = gen_rtx_REG (HImode, REG_Z); - rampz_rtx = gen_rtx_MEM (QImode, GEN_INT (RAMPZ_ADDR)); + rampz_rtx = gen_rtx_MEM (QImode, GEN_INT (avr_addr.rampz)); xstring_empty = gen_rtx_CONST_STRING (VOIDmode, ""); xstring_e = gen_rtx_CONST_STRING (VOIDmode, "e"); @@ -1133,7 +1163,8 @@ expand_prologue (void) /* Push SREG. */ /* ??? There's no dwarf2 column reserved for SREG. */ - emit_move_insn (tmp_reg_rtx, gen_rtx_MEM (QImode, GEN_INT (SREG_ADDR))); + emit_move_insn (tmp_reg_rtx, + gen_rtx_MEM (QImode, GEN_INT (avr_addr.sreg))); emit_push_byte (TMP_REGNO, false); /* Push RAMPZ. */ @@ -1386,7 +1417,7 @@ expand_epilogue (bool sibcall_p) /* Restore SREG using tmp reg as scratch. */ emit_pop_byte (TMP_REGNO); - emit_move_insn (gen_rtx_MEM (QImode, GEN_INT (SREG_ADDR)), + emit_move_insn (gen_rtx_MEM (QImode, GEN_INT (avr_addr.sreg)), tmp_reg_rtx); /* Restore tmp REG. */ @@ -1869,17 +1900,14 @@ avr_print_operand (FILE *file, rtx x, in else if (low_io_address_operand (x, VOIDmode) || high_io_address_operand (x, VOIDmode)) { - switch (ival) + if (ival == avr_addr.rampz) fprintf (file, "__RAMPZ__"); + else if (ival == avr_addr.sreg) fprintf (file, "__SREG__"); + else if (ival == avr_addr.sp_l) fprintf (file, "__SP_L__"); + else if (ival == avr_addr.sp_h) fprintf (file, "__SP_H__"); + else { - case RAMPZ_ADDR: fprintf (file, "__RAMPZ__"); break; - case SREG_ADDR: fprintf (file, "__SREG__"); break; - case SP_ADDR: fprintf (file, "__SP_L__"); break; - case SP_ADDR+1: fprintf (file, "__SP_H__"); break; - - default: fprintf (file, HOST_WIDE_INT_PRINT_HEX, ival - avr_current_arch->sfr_offset); - break; } } else @@ -7294,22 +7322,16 @@ avr_file_start (void) default_file_start (); + /* Print I/O addresses of some SFRs used with IN and OUT. */ + if (!AVR_HAVE_8BIT_SP) - fprintf (asm_out_file, - "__SP_H__ = 0x%02x\n", - -sfr_offset + SP_ADDR + 1); - - fprintf (asm_out_file, - "__SP_L__ = 0x%02x\n" - "__SREG__ = 0x%02x\n" - "__RAMPZ__ = 0x%02x\n" - "__tmp_reg__ = %d\n" - "__zero_reg__ = %d\n", - -sfr_offset + SP_ADDR, - -sfr_offset + SREG_ADDR, - -sfr_offset + RAMPZ_ADDR, - TMP_REGNO, - ZERO_REGNO); + fprintf (asm_out_file, "__SP_H__ = 0x%02x\n", avr_addr.sp_h - sfr_offset); + + fprintf (asm_out_file, "__SP_L__ = 0x%02x\n", avr_addr.sp_l - sfr_offset); + fprintf (asm_out_file, "__SREG__ = 0x%02x\n", avr_addr.sreg - sfr_offset); + fprintf (asm_out_file, "__RAMPZ__ = 0x%02x\n", avr_addr.rampz - sfr_offset); + fprintf (asm_out_file, "__tmp_reg__ = %d\n", TMP_REGNO); + fprintf (asm_out_file, "__zero_reg__ = %d\n", ZERO_REGNO); } @@ -9736,7 +9758,7 @@ avr_emit_movmemhi (rtx *xop) emit_move_insn (r23, a_hi8); insn = fun (addr0, addr1, xas, loop_reg, addr0, addr1, - lpm_reg_rtx, loop_reg16, r23, r23, GEN_INT (RAMPZ_ADDR)); + lpm_reg_rtx, loop_reg16, r23, r23, GEN_INT (avr_addr.rampz)); } set_mem_addr_space (SET_SRC (XVECEXP (insn, 0, 0)), as);