Fix cmpli usage in power6 memset
diff mbox

Message ID alpine.DEB.2.20.1610242200430.26381@digraph.polyomino.org.uk
State New
Headers show

Commit Message

Joseph Myers Oct. 24, 2016, 10:03 p.m. UTC
Building glibc for powerpc64 with recent (2.27.51.20161012) binutils,
with multi-arch enabled, I get the error:

../sysdeps/powerpc/powerpc64/power6/memset.S: Assembler messages:
../sysdeps/powerpc/powerpc64/power6/memset.S:254: Error: operand out of range (5 is not between 0 and 1)
../sysdeps/powerpc/powerpc64/power6/memset.S:254: Error: operand out of range (128 is not between 0 and 31)
../sysdeps/powerpc/powerpc64/power6/memset.S:254: Error: missing operand

Indeed, cmpli is documented as a four-operand instruction, and looking
at nearby code it seems likely cmpldi was intended.  This patch fixes
this powerpc64 code accordingly, and makes a corresponding change to
the powerpc32 code.

Note: this patch is not tested beyond verifying that the powerpc64
code builds where it failed to build before the patch.  In particular,
I have not done execution testing (the systems I usually use for
testing powerpc are pre-power6 so wouldn't use this code) or tested
the powerpc32 change.

2016-10-24  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/powerpc/powerpc32/power6/memset.S (memset): Use cmplwi
	instead of cmpli.
	* sysdeps/powerpc/powerpc64/power6/memset.S (memset): Use cmpldi
	instead of cmpli.

Comments

Tulio Magno Quites Machado Filho Oct. 25, 2016, 3:43 p.m. UTC | #1
Joseph Myers <joseph@codesourcery.com> writes:

> Building glibc for powerpc64 with recent (2.27.51.20161012) binutils,
> with multi-arch enabled, I get the error:
>
> ../sysdeps/powerpc/powerpc64/power6/memset.S: Assembler messages:
> ../sysdeps/powerpc/powerpc64/power6/memset.S:254: Error: operand out of range (5 is not between 0 and 1)
> ../sysdeps/powerpc/powerpc64/power6/memset.S:254: Error: operand out of range (128 is not between 0 and 31)
> ../sysdeps/powerpc/powerpc64/power6/memset.S:254: Error: missing operand
>
> Indeed, cmpli is documented as a four-operand instruction, and looking
> at nearby code it seems likely cmpldi was intended.  This patch fixes
> this powerpc64 code accordingly, and makes a corresponding change to
> the powerpc32 code.
>
> Note: this patch is not tested beyond verifying that the powerpc64
> code builds where it failed to build before the patch.  In particular,
> I have not done execution testing

Tested on powerpc, powerpc64 and powerpc64le.
LGTM.

> (the systems I usually use for
> testing powerpc are pre-power6 so wouldn't use this code) or tested
> the powerpc32 change.

In case you want to have access to POWER8 servers, some universities provide
free access to virtual machines for the open source community:

 - MiniCloud - State University of Campinas (Unicamp), Brazil
   http://openpower.ic.unicamp.br/minicloud/

 - Open Power Hub - Brno University of Technology, Czech Republic
   http://fit-rhlab.rhcloud.com/powerlinux-openpower-development-hosting/

 - OSU Open Source Lab - Oregon State University, US
   http://osuosl.org/services/powerdev/

 - SuperVessel - IBM China
   https://ptopenlab.com/cloudlabconsole
Peter Bergner Oct. 25, 2016, 4:12 p.m. UTC | #2
On 10/25/16 10:43 AM, Tulio Magno Quites Machado Filho wrote:
> In case you want to have access to POWER8 servers, some universities provide
> free access to virtual machines for the open source community:

There are also the GCC Farm systems:

   gcc110: POWER7, Linux, Big Endian
   gcc111: POWER7, AIX
   gcc112: POWER8, Linux, Little Endian

These are all large/fast systems, with lots of cpus, memory and disk.
Info at https://gcc.gnu.org/wiki/CompileFarm

Peter

Patch
diff mbox

diff --git a/sysdeps/powerpc/powerpc32/power6/memset.S b/sysdeps/powerpc/powerpc32/power6/memset.S
index b2a222e..d5dbe83 100644
--- a/sysdeps/powerpc/powerpc32/power6/memset.S
+++ b/sysdeps/powerpc/powerpc32/power6/memset.S
@@ -394,7 +394,7 @@  L(cacheAlignedx):
 /* A simple loop for the longer (>640 bytes) lengths.  This form limits
    the branch miss-predicted to exactly 1 at loop exit.*/
 L(cacheAligned512):
-	cmpli	cr1,rLEN,128
+	cmplwi	cr1,rLEN,128
 	blt	cr1,L(cacheAligned1)
 	dcbz	0,rMEMP
 	addi	rLEN,rLEN,-128
diff --git a/sysdeps/powerpc/powerpc64/power6/memset.S b/sysdeps/powerpc/powerpc64/power6/memset.S
index c2d1c4e..d445b1e 100644
--- a/sysdeps/powerpc/powerpc64/power6/memset.S
+++ b/sysdeps/powerpc/powerpc64/power6/memset.S
@@ -251,7 +251,7 @@  L(cacheAlignedx):
 /* A simple loop for the longer (>640 bytes) lengths.  This form limits
    the branch miss-predicted to exactly 1 at loop exit.*/
 L(cacheAligned512):
-	cmpli	cr1,rLEN,128
+	cmpldi	cr1,rLEN,128
 	blt	cr1,L(cacheAligned1)
 	dcbz	0,rMEMP
 	addi	rLEN,rLEN,-128