mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 10:40:57 +00:00 
			
		
		
		
	Adding cases for ppc64,ppc64le to the codegen tests where appropriate. Change-Id: Idf8cbe88a4ab4406a4ef1ea777bd15a58b68f3ed Reviewed-on: https://go-review.googlesource.com/c/142557 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
		
			
				
	
	
		
			168 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// asmcheck
 | 
						|
 | 
						|
// Copyright 2018 The Go Authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style
 | 
						|
// license that can be found in the LICENSE file.
 | 
						|
 | 
						|
package codegen
 | 
						|
 | 
						|
// ------------------- //
 | 
						|
//    const rotates    //
 | 
						|
// ------------------- //
 | 
						|
 | 
						|
func rot64(x uint64) uint64 {
 | 
						|
	var a uint64
 | 
						|
 | 
						|
	// amd64:"ROLQ\t[$]7"
 | 
						|
	// arm64:"ROR\t[$]57"
 | 
						|
	// s390x:"RLLG\t[$]7"
 | 
						|
	// ppc64:"ROTL\t[$]7"
 | 
						|
	// ppc64le:"ROTL\t[$]7"
 | 
						|
	a += x<<7 | x>>57
 | 
						|
 | 
						|
	// amd64:"ROLQ\t[$]8"
 | 
						|
	// arm64:"ROR\t[$]56"
 | 
						|
	// s390x:"RLLG\t[$]8"
 | 
						|
	// ppc64:"ROTL\t[$]8"
 | 
						|
	// ppc64le:"ROTL\t[$]8"
 | 
						|
	a += x<<8 + x>>56
 | 
						|
 | 
						|
	// amd64:"ROLQ\t[$]9"
 | 
						|
	// arm64:"ROR\t[$]55"
 | 
						|
	// s390x:"RLLG\t[$]9"
 | 
						|
	// ppc64:"ROTL\t[$]9"
 | 
						|
	// ppc64le:"ROTL\t[$]9"
 | 
						|
	a += x<<9 ^ x>>55
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
func rot32(x uint32) uint32 {
 | 
						|
	var a uint32
 | 
						|
 | 
						|
	// amd64:"ROLL\t[$]7"
 | 
						|
	// arm:"MOVW\tR\\d+@>25"
 | 
						|
	// arm64:"RORW\t[$]25"
 | 
						|
	// s390x:"RLL\t[$]7"
 | 
						|
	// ppc64:"ROTLW\t[$]7"
 | 
						|
	// ppc64le:"ROTLW\t[$]7"
 | 
						|
	a += x<<7 | x>>25
 | 
						|
 | 
						|
	// amd64:`ROLL\t[$]8`
 | 
						|
	// arm:"MOVW\tR\\d+@>24"
 | 
						|
	// arm64:"RORW\t[$]24"
 | 
						|
	// s390x:"RLL\t[$]8"
 | 
						|
	// ppc64:"ROTLW\t[$]8"
 | 
						|
	// ppc64le:"ROTLW\t[$]8"
 | 
						|
	a += x<<8 + x>>24
 | 
						|
 | 
						|
	// amd64:"ROLL\t[$]9"
 | 
						|
	// arm:"MOVW\tR\\d+@>23"
 | 
						|
	// arm64:"RORW\t[$]23"
 | 
						|
	// s390x:"RLL\t[$]9"
 | 
						|
	// ppc64:"ROTLW\t[$]9"
 | 
						|
	// ppc64le:"ROTLW\t[$]9"
 | 
						|
	a += x<<9 ^ x>>23
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
func rot16(x uint16) uint16 {
 | 
						|
	var a uint16
 | 
						|
 | 
						|
	// amd64:"ROLW\t[$]7"
 | 
						|
	a += x<<7 | x>>9
 | 
						|
 | 
						|
	// amd64:`ROLW\t[$]8`
 | 
						|
	a += x<<8 + x>>8
 | 
						|
 | 
						|
	// amd64:"ROLW\t[$]9"
 | 
						|
	a += x<<9 ^ x>>7
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
func rot8(x uint8) uint8 {
 | 
						|
	var a uint8
 | 
						|
 | 
						|
	// amd64:"ROLB\t[$]5"
 | 
						|
	a += x<<5 | x>>3
 | 
						|
 | 
						|
	// amd64:`ROLB\t[$]6`
 | 
						|
	a += x<<6 + x>>2
 | 
						|
 | 
						|
	// amd64:"ROLB\t[$]7"
 | 
						|
	a += x<<7 ^ x>>1
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
// ----------------------- //
 | 
						|
//    non-const rotates    //
 | 
						|
// ----------------------- //
 | 
						|
 | 
						|
func rot64nc(x uint64, z uint) uint64 {
 | 
						|
	var a uint64
 | 
						|
 | 
						|
	z &= 63
 | 
						|
 | 
						|
	// amd64:"ROLQ"
 | 
						|
	// ppc64:"ROTL"
 | 
						|
	// ppc64le:"ROTL"
 | 
						|
	a += x<<z | x>>(64-z)
 | 
						|
 | 
						|
	// amd64:"RORQ"
 | 
						|
	a += x>>z | x<<(64-z)
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
func rot32nc(x uint32, z uint) uint32 {
 | 
						|
	var a uint32
 | 
						|
 | 
						|
	z &= 31
 | 
						|
 | 
						|
	// amd64:"ROLL"
 | 
						|
	// ppc64:"ROTLW"
 | 
						|
	// ppc64le:"ROTLW"
 | 
						|
	a += x<<z | x>>(32-z)
 | 
						|
 | 
						|
	// amd64:"RORL"
 | 
						|
	a += x>>z | x<<(32-z)
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
func rot16nc(x uint16, z uint) uint16 {
 | 
						|
	var a uint16
 | 
						|
 | 
						|
	z &= 15
 | 
						|
 | 
						|
	// amd64:"ROLW"
 | 
						|
	a += x<<z | x>>(16-z)
 | 
						|
 | 
						|
	// amd64:"RORW"
 | 
						|
	a += x>>z | x<<(16-z)
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
func rot8nc(x uint8, z uint) uint8 {
 | 
						|
	var a uint8
 | 
						|
 | 
						|
	z &= 7
 | 
						|
 | 
						|
	// amd64:"ROLB"
 | 
						|
	a += x<<z | x>>(8-z)
 | 
						|
 | 
						|
	// amd64:"RORB"
 | 
						|
	a += x>>z | x<<(8-z)
 | 
						|
 | 
						|
	return a
 | 
						|
}
 | 
						|
 | 
						|
// Issue 18254: rotate after inlining
 | 
						|
func f32(x uint32) uint32 {
 | 
						|
	// amd64:"ROLL\t[$]7"
 | 
						|
	return rot32nc(x, 7)
 | 
						|
}
 |