From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18498 invoked by alias); 7 Jun 2013 10:28:43 -0000 Mailing-List: contact libffi-discuss-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libffi-discuss-owner@sourceware.org Received: (qmail 18471 invoked by uid 89); 7 Jun 2013 10:28:36 -0000 X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,SPF_PASS,TW_BF,TW_LB,TW_LW,TW_SR autolearn=ham version=3.3.1 Received: from mail-pa0-f48.google.com (HELO mail-pa0-f48.google.com) (209.85.220.48) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 07 Jun 2013 10:28:36 +0000 Received: by mail-pa0-f48.google.com with SMTP id kp12so829509pab.21 for ; Fri, 07 Jun 2013 03:28:34 -0700 (PDT) X-Received: by 10.68.134.40 with SMTP id ph8mr30503408pbb.177.1370600914639; Fri, 07 Jun 2013 03:28:34 -0700 (PDT) Received: from bubble.grove.modra.org ([101.166.26.37]) by mx.google.com with ESMTPSA id fl2sm2487699pab.23.2013.06.07.03.28.32 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 07 Jun 2013 03:28:34 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 5AA4AEA008F; Fri, 7 Jun 2013 19:58:29 +0930 (CST) Date: Fri, 07 Jun 2013 10:28:00 -0000 From: Alan Modra To: libffi-discuss@sourceware.org Cc: David Edelsohn Subject: [RS6000] libffi little-endian Message-ID: <20130607102829.GO6878@bubble.grove.modra.org> Mail-Followup-To: libffi-discuss@sourceware.org, David Edelsohn MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SW-Source: 2013/txt/msg00141.txt.bz2 This adds support for powerpcle-linux and powerpc64le-linux. I haven't attempted to add the same for darwin_closure.S since I'm not aware of a little-endian darwin powerpc port. Bootstrapped and regression tested on powerpc64-linux. powerpc64le-linux tests still in progress. * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Support little-endian. * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. Index: libffi/src/powerpc/linux64_closure.S =================================================================== --- libffi/src/powerpc/linux64_closure.S (revision 199718) +++ libffi/src/powerpc/linux64_closure.S (working copy) @@ -132,7 +132,11 @@ blr nop # case FFI_TYPE_INT +#ifdef __LITTLE_ENDIAN__ + lwa %r3, 112+0(%r1) +#else lwa %r3, 112+4(%r1) +#endif mtlr %r0 addi %r1, %r1, 240 blr @@ -152,33 +156,57 @@ lfd %f2, 112+8(%r1) b .Lfinish # case FFI_TYPE_UINT8 +#ifdef __LITTLE_ENDIAN__ + lbz %r3, 112+0(%r1) +#else lbz %r3, 112+7(%r1) +#endif mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_SINT8 +#ifdef __LITTLE_ENDIAN__ + lbz %r3, 112+0(%r1) +#else lbz %r3, 112+7(%r1) +#endif extsb %r3,%r3 mtlr %r0 b .Lfinish # case FFI_TYPE_UINT16 +#ifdef __LITTLE_ENDIAN__ + lhz %r3, 112+0(%r1) +#else lhz %r3, 112+6(%r1) +#endif mtlr %r0 .Lfinish: addi %r1, %r1, 240 blr # case FFI_TYPE_SINT16 +#ifdef __LITTLE_ENDIAN__ + lha %r3, 112+0(%r1) +#else lha %r3, 112+6(%r1) +#endif mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_UINT32 +#ifdef __LITTLE_ENDIAN__ + lwz %r3, 112+0(%r1) +#else lwz %r3, 112+4(%r1) +#endif mtlr %r0 addi %r1, %r1, 240 blr # case FFI_TYPE_SINT32 +#ifdef __LITTLE_ENDIAN__ + lwa %r3, 112+0(%r1) +#else lwa %r3, 112+4(%r1) +#endif mtlr %r0 addi %r1, %r1, 240 blr Index: libffi/src/powerpc/ppc_closure.S =================================================================== --- libffi/src/powerpc/ppc_closure.S (revision 199718) +++ libffi/src/powerpc/ppc_closure.S (working copy) @@ -159,25 +159,41 @@ #endif # case FFI_TYPE_UINT8 +#ifdef __LITTLE_ENDIAN__ + lbz %r3,112+0(%r1) +#else lbz %r3,112+3(%r1) +#endif mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_SINT8 +#ifdef __LITTLE_ENDIAN__ + lbz %r3,112+0(%r1) +#else lbz %r3,112+3(%r1) +#endif extsb %r3,%r3 mtlr %r0 b .Lfinish # case FFI_TYPE_UINT16 +#ifdef __LITTLE_ENDIAN__ + lhz %r3,112+0(%r1) +#else lhz %r3,112+2(%r1) +#endif mtlr %r0 addi %r1,%r1,144 blr # case FFI_TYPE_SINT16 +#ifdef __LITTLE_ENDIAN__ + lha %r3,112+0(%r1) +#else lha %r3,112+2(%r1) +#endif mtlr %r0 addi %r1,%r1,144 blr @@ -239,9 +255,15 @@ # case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. lwz %r3,112+0(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + addi %r1,%r1,144 + blr +#else srwi %r3,%r3,8 mtlr %r0 b .Lfinish +#endif # case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. lwz %r3,112+0(%r1) @@ -252,20 +274,35 @@ # case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + b .Lfinish +#else li %r5,24 b .Lstruct567 +#endif # case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + b .Lfinish +#else li %r5,16 b .Lstruct567 +#endif # case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. lwz %r3,112+0(%r1) lwz %r4,112+4(%r1) +#ifdef __LITTLE_ENDIAN__ + mtlr %r0 + b .Lfinish +#else li %r5,8 b .Lstruct567 +#endif # case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. lwz %r3,112+0(%r1) @@ -273,6 +310,7 @@ mtlr %r0 b .Lfinish +#ifndef __LITTLE_ENDIAN__ .Lstruct567: subfic %r6,%r5,32 srw %r4,%r4,%r5 @@ -282,6 +320,7 @@ mtlr %r0 addi %r1,%r1,144 blr +#endif .Luint128: lwz %r6,112+12(%r1) -- Alan Modra Australia Development Lab, IBM