From patchwork Thu May 31 08:28:27 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alan Modra X-Patchwork-Id: 162116 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 5E062B6FC4 for ; Thu, 31 May 2012 18:42:06 +1000 (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=1339058527; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Received:Received:Received:Received:Date:From:To:Subject: Message-ID:Mail-Followup-To:References:MIME-Version:Content-Type: Content-Disposition:In-Reply-To:User-Agent:Mailing-List: Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:Sender:Delivered-To; bh=oAYJJShdmXpSW3gbC2WwnU/Re0k=; b=j/aG2Mm4x6iMtkuUUNm17sTNVFYsM0FSgwScfQuXUvtRmj59XbSncRLrKEQtNy uCnsHerH4KzCv3junshuq1hfaTnvFa/Z/6M2ApRXOSUnjARCdFuBiyqLEW/tBIeu ybYL9R+rjKsBtGiojNmC3QeJe7cHeQv4exkUrDc5o9BXA= 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:Received:Received:Received:Received:Received:Received:Date:From:To:Subject:Message-ID:Mail-Followup-To:References:MIME-Version:Content-Type:Content-Disposition:In-Reply-To:User-Agent:X-detected-operating-system:X-Received-From:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=NRYvvF47GgBIZOUu++lQFWoDgsR1qaJH94L3BJxW/sP3UeEZ0v35fA5h8gsaFX l5KqgPQWA9SaDAT7Weu/5UaVmUJxHitpJDCOoKKSRS/DaVoNuBXYPhadYHMPFc9L RhlVirWUJ+ebRp/W6JW17XTGG9+1pobRwLtDurKdiih4M=; Received: (qmail 32288 invoked by alias); 31 May 2012 08:39:54 -0000 Received: (qmail 32279 invoked by uid 22791); 31 May 2012 08:39:52 -0000 X-SWARE-Spam-Status: No, hits=-4.4 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, SPF_NEUTRAL, TW_CV X-Spam-Check-By: sourceware.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (208.118.235.92) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 31 May 2012 08:39:03 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Sa0oE-0001ci-As for gcc-patches@gcc.gnu.org; Thu, 31 May 2012 04:32:45 -0400 Received: from mail-pb0-f47.google.com ([209.85.160.47]:34261) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Sa0l5-0000ym-D0; Thu, 31 May 2012 04:29:27 -0400 Received: by pbbrq2 with SMTP id rq2so1116727pbb.20 for ; Thu, 31 May 2012 01:28:33 -0700 (PDT) Received: by 10.68.201.73 with SMTP id jy9mr57371351pbc.19.1338452913080; Thu, 31 May 2012 01:28:33 -0700 (PDT) Received: from bubble.grove.modra.org ([115.187.252.19]) by mx.google.com with ESMTPS id rv9sm3443200pbc.43.2012.05.31.01.28.30 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 31 May 2012 01:28:32 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id A8EC9EA1D7D; Thu, 31 May 2012 17:58:27 +0930 (CST) Date: Thu, 31 May 2012 17:58:27 +0930 From: Alan Modra To: Dominique Dhumieres , IainS@gcc.gnu.org, David Edelsohn , gcc-patches@gcc.gnu.org Subject: Re: PowerPC prologue and epilogue 6 Message-ID: <20120531082827.GT3086@bubble.grove.modra.org> Mail-Followup-To: Dominique Dhumieres , IainS@gcc.gnu.org, David Edelsohn , gcc-patches@gcc.gnu.org References: <20120529192637.6DFD43BE18@mailhost.lps.ens.fr> <20120530114148.GN3086@bubble.grove.modra.org> <20120530132129.CFD663BE18@mailhost.lps.ens.fr> <20120531001309.GP3086@bubble.grove.modra.org> <20120531011126.GR3086@bubble.grove.modra.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20120531011126.GR3086@bubble.grove.modra.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.160.47 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 On Thu, May 31, 2012 at 10:41:26AM +0930, Alan Modra wrote: > Looks like it is one I introduced. gcc-4.6 uses r12 to save altivec > regs, my new code tries to use r11. Will fix. Please try out this patch on Darwin. Bootstrapped and regression tested powerpc-linux. gcc/ * config/rs6000/rs6000.c (ptr_regno_for_savres): Comment. (rs6000_emit_prologue): Ensure register used for inline saves of vector regs is not the static chain register. Revise comment. gcc/testsuite/ * gcc.target/powerpc/savres.c: Add -static to dg-options. Check static chain in nested funcs. Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 187999) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -19108,6 +19161,9 @@ rs6000_emit_stack_reset (rs6000_stack_t *info, return NULL_RTX; } +/* Return the register number used as a pointer by out-of-line + save/restore functions. */ + static inline unsigned ptr_regno_for_savres (int sel) { @@ -19845,6 +19901,9 @@ rs6000_emit_prologue (void) int sel = SAVRES_SAVE | SAVRES_VR; unsigned ptr_regno = ptr_regno_for_savres (sel); + if (using_static_chain_p + && ptr_regno == STATIC_CHAIN_REGNUM) + ptr_regno = 12; if (REGNO (frame_reg_rtx) != ptr_regno) START_USE (ptr_regno); ptr_reg = gen_rtx_REG (Pmode, ptr_regno); @@ -19953,9 +20012,9 @@ rs6000_emit_prologue (void) int offset; int save_regno; - /* Get VRSAVE onto a GPR. Note that ABI_V4 might be using r12 - as frame_reg_rtx and r11 as the static chain pointer for - nested functions. */ + /* Get VRSAVE onto a GPR. Note that ABI_V4 and ABI_DARWIN might + be using r12 as frame_reg_rtx and r11 as the static chain + pointer for nested functions. */ save_regno = 12; if (DEFAULT_ABI == ABI_AIX && !using_static_chain_p) save_regno = 11; Index: gcc/testsuite/gcc.target/powerpc/savres.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/savres.c (revision 187999) +++ gcc/testsuite/gcc.target/powerpc/savres.c (working copy) @@ -1,5 +1,5 @@ /* { dg-do run } */ -/* { dg-options "-fno-inline -fomit-frame-pointer" } */ +/* { dg-options "-fno-inline -fomit-frame-pointer -static" } */ /* -fno-inline -maltivec -m32/-m64 -mmultiple/no-multiple -Os/-O2. */ #ifndef NO_BODY @@ -73,6 +73,7 @@ __attribute__ ((vector_size (16))) int val31 = {-3 #else /* NO_BODY */ /* For looking at prologue and epilogue code without distractions. */ +#define abort() #define TRASH_ALL_CR #define TRASH_ALL_VR #define TRASH_ALL_FPR @@ -458,7 +459,7 @@ void s_0 (void) void wb_all (void) { char b[10]; - void nb_all (void) + char *nb_all (void) { char a[33000]; TRASH_ALL_CR; @@ -470,14 +471,16 @@ void wb_all (void) USE_ALL_FPR; USE_ALL_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "cr3", "cr4", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"); + return b; } - nb_all(); + if (nb_all() != b) + abort (); } void wb_cvfr (void) { char b[10]; - void nb_cvfr (void) + char *nb_cvfr (void) { char a[33000]; TRASH_SOME_CR; @@ -489,14 +492,16 @@ void wb_cvfr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); + return b; } - nb_cvfr (); + if (nb_cvfr () != b) + abort (); } void wb_vfr (void) { char b[10]; - void nb_vfr (void) + char *nb_vfr (void) { char a[33000]; TRASH_SOME_VR; @@ -506,14 +511,16 @@ void wb_vfr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); + return b; } - nb_vfr (); + if (nb_vfr () != b) + abort (); } void wb_cvf (void) { char b[10]; - void nb_cvf (void) + char *nb_cvf (void) { char a[33000]; TRASH_SOME_CR; @@ -523,14 +530,16 @@ void wb_cvf (void) USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31"); + return b; } - nb_cvf (); + if (nb_cvf () != b) + abort (); } void wb_vf (void) { char b[10]; - void nb_vf (void) + char *nb_vf (void) { char a[33000]; TRASH_SOME_VR; @@ -538,15 +547,17 @@ void wb_vf (void) USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31"); + return b; } - nb_vf (); + if (nb_vf () != b) + abort (); } #endif void wb_cvr (void) { char b[10]; - void nb_cvr (void) + char *nb_cvr (void) { char a[33000]; TRASH_SOME_CR; @@ -556,14 +567,16 @@ void wb_cvr (void) USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "r30", "r31"); + return b; } - nb_cvr (); + if (nb_cvr () != b) + abort (); } void wb_vr (void) { char b[10]; - void nb_vr (void) + char *nb_vr (void) { char a[33000]; TRASH_SOME_VR; @@ -571,14 +584,16 @@ void wb_vr (void) USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "r30", "r31"); + return b; } - nb_vr (); + if (nb_vr () != b) + abort (); } void wb_cv (void) { char b[10]; - void nb_cv (void) + char *nb_cv (void) { char a[33000]; TRASH_SOME_CR; @@ -586,21 +601,25 @@ void wb_cv (void) USE_SOME_CR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31"); + return b; } - nb_cv (); + if (nb_cv () != b) + abort (); } void wb_v (void) { char b[10]; - void nb_v (void) + char *nb_v (void) { char a[33000]; TRASH_SOME_VR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31"); + return b; } - nb_v (); + if (nb_v () != b) + abort (); } #endif @@ -608,7 +627,7 @@ void wb_v (void) void wb_cfr (void) { char b[10]; - void nb_cfr (void) + char *nb_cfr (void) { char a[33000]; TRASH_SOME_CR; @@ -618,14 +637,16 @@ void wb_cfr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31", "r30", "r31"); + return b; } - nb_cfr (); + if (nb_cfr () != b) + abort (); } void wb_fr (void) { char b[10]; - void nb_fr (void) + char *nb_fr (void) { char a[33000]; TRASH_SOME_FPR; @@ -633,14 +654,16 @@ void wb_fr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31", "r30", "r31"); + return b; } - nb_fr (); + if (nb_fr () != b) + abort (); } void wb_cf (void) { char b[10]; - void nb_cf (void) + char *nb_cf (void) { char a[33000]; TRASH_SOME_CR; @@ -648,28 +671,32 @@ void wb_cf (void) USE_SOME_CR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31"); + return b; } - nb_cf (); + if (nb_cf () != b) + abort (); } void wb_f (void) { char b[10]; - void nb_f (void) + char *nb_f (void) { char a[33000]; TRASH_SOME_FPR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31"); + return b; } - nb_f (); + if (nb_f () != b) + abort (); } #endif void wb_cr (void) { char b[10]; - void nb_cr (void) + char *nb_cr (void) { char a[33000]; TRASH_SOME_CR; @@ -677,45 +704,53 @@ void wb_cr (void) USE_SOME_CR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "r30", "r31"); + return b; } - nb_cr (); + if (nb_cr () != b) + abort (); } void wb_r (void) { char b[10]; - void nb_r (void) + char *nb_r (void) { char a[33000]; TRASH_SOME_GPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "r30", "r31"); + return b; } - nb_r (); + if (nb_r () != b) + abort (); } void wb_c (void) { char b[10]; - void nb_c (void) + char *nb_c (void) { char a[33000]; TRASH_SOME_CR; USE_SOME_CR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2"); + return b; } - nb_c (); + if (nb_c () != b) + abort (); } void wb_0 (void) { char b[10]; - void nb_0 (void) + char *nb_0 (void) { char a[33000]; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) ); + return b; } - nb_0 (); + if (nb_0 () != b) + abort (); } #ifdef __ALTIVEC__ @@ -723,7 +758,7 @@ void wb_0 (void) void ws_all (void) { char b[10]; - void ns_all (void) + char *ns_all (void) { char a[33]; TRASH_ALL_CR; @@ -735,14 +770,16 @@ void ws_all (void) USE_ALL_FPR; USE_ALL_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "cr3", "cr4", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"); + return b; } - ns_all(); + if (ns_all() != b) + abort (); } void ws_cvfr (void) { char b[10]; - void ns_cvfr (void) + char *ns_cvfr (void) { char a[33]; TRASH_SOME_CR; @@ -754,14 +791,16 @@ void ws_cvfr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); + return b; } - ns_cvfr (); + if (ns_cvfr () != b) + abort (); } void ws_vfr (void) { char b[10]; - void ns_vfr (void) + char *ns_vfr (void) { char a[33]; TRASH_SOME_VR; @@ -771,14 +810,16 @@ void ws_vfr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); + return b; } - ns_vfr (); + if (ns_vfr () != b) + abort (); } void ws_cvf (void) { char b[10]; - void ns_cvf (void) + char *ns_cvf (void) { char a[33]; TRASH_SOME_CR; @@ -788,14 +829,16 @@ void ws_cvf (void) USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31"); + return b; } - ns_cvf (); + if (ns_cvf () != b) + abort (); } void ws_vf (void) { char b[10]; - void ns_vf (void) + char *ns_vf (void) { char a[33]; TRASH_SOME_VR; @@ -803,15 +846,17 @@ void ws_vf (void) USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31"); + return b; } - ns_vf (); + if (ns_vf () != b) + abort (); } #endif void ws_cvr (void) { char b[10]; - void ns_cvr (void) + char *ns_cvr (void) { char a[33]; TRASH_SOME_CR; @@ -821,14 +866,16 @@ void ws_cvr (void) USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "r30", "r31"); + return b; } - ns_cvr (); + if (ns_cvr () != b) + abort (); } void ws_vr (void) { char b[10]; - void ns_vr (void) + char *ns_vr (void) { char a[33]; TRASH_SOME_VR; @@ -836,14 +883,16 @@ void ws_vr (void) USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "r30", "r31"); + return b; } - ns_vr (); + if (ns_vr () != b) + abort (); } void ws_cv (void) { char b[10]; - void ns_cv (void) + char *ns_cv (void) { char a[33]; TRASH_SOME_CR; @@ -851,21 +900,25 @@ void ws_cv (void) USE_SOME_CR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31"); + return b; } - ns_cv (); + if (ns_cv () != b) + abort (); } void ws_v (void) { char b[10]; - void ns_v (void) + char *ns_v (void) { char a[33]; TRASH_SOME_VR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31"); + return b; } - ns_v (); + if (ns_v () != b) + abort (); } #endif @@ -873,7 +926,7 @@ void ws_v (void) void ws_cfr (void) { char b[10]; - void ns_cfr (void) + char *ns_cfr (void) { char a[33]; TRASH_SOME_CR; @@ -883,14 +936,16 @@ void ws_cfr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31", "r30", "r31"); + return b; } - ns_cfr (); + if (ns_cfr () != b) + abort (); } void ws_fr (void) { char b[10]; - void ns_fr (void) + char *ns_fr (void) { char a[33]; TRASH_SOME_FPR; @@ -898,14 +953,16 @@ void ws_fr (void) USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31", "r30", "r31"); + return b; } - ns_fr (); + if (ns_fr () != b) + abort (); } void ws_cf (void) { char b[10]; - void ns_cf (void) + char *ns_cf (void) { char a[33]; TRASH_SOME_CR; @@ -913,28 +970,32 @@ void ws_cf (void) USE_SOME_CR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31"); + return b; } - ns_cf (); + if (ns_cf () != b) + abort (); } void ws_f (void) { char b[10]; - void ns_f (void) + char *ns_f (void) { char a[33]; TRASH_SOME_FPR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31"); + return b; } - ns_f (); + if (ns_f () != b) + abort (); } #endif void ws_cr (void) { char b[10]; - void ns_cr (void) + char *ns_cr (void) { char a[33]; TRASH_SOME_CR; @@ -942,45 +1003,53 @@ void ws_cr (void) USE_SOME_CR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "r30", "r31"); + return b; } - ns_cr (); + if (ns_cr () != b) + abort (); } void ws_r (void) { char b[10]; - void ns_r (void) + char *ns_r (void) { char a[33]; TRASH_SOME_GPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "r30", "r31"); + return b; } - ns_r (); + if (ns_r () != b) + abort (); } void ws_c (void) { char b[10]; - void ns_c (void) + char *ns_c (void) { char a[33]; TRASH_SOME_CR; USE_SOME_CR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2"); + return b; } - ns_c (); + if (ns_c () != b) + abort (); } void ws_0 (void) { char b[10]; - void ns_0 (void) + char *ns_0 (void) { char a[33]; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) ); + return b; } - ns_0 (); + if (ns_0 () != b) + abort (); } int main (void)