You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
| // Copyright 2019 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 s390x
 | |
| 
 | |
| // RotateParams represents the immediates required for a "rotate
 | |
| // then ... selected bits instruction".
 | |
| //
 | |
| // The Start and End values are the indexes that represent
 | |
| // the masked region. They are inclusive and are in big-
 | |
| // endian order (bit 0 is the MSB, bit 63 is the LSB). They
 | |
| // may wrap around.
 | |
| //
 | |
| // Some examples:
 | |
| //
 | |
| // Masked region             | Start | End
 | |
| // --------------------------+-------+----
 | |
| // 0x00_00_00_00_00_00_00_0f | 60    | 63
 | |
| // 0xf0_00_00_00_00_00_00_00 | 0     | 3
 | |
| // 0xf0_00_00_00_00_00_00_0f | 60    | 3
 | |
| //
 | |
| // The Amount value represents the amount to rotate the
 | |
| // input left by. Note that this rotation is performed
 | |
| // before the masked region is used.
 | |
| type RotateParams struct {
 | |
| 	Start  uint8 // big-endian start bit index [0..63]
 | |
| 	End    uint8 // big-endian end bit index [0..63]
 | |
| 	Amount uint8 // amount to rotate left
 | |
| }
 | |
| 
 | |
| func NewRotateParams(start, end, amount int64) RotateParams {
 | |
| 	if start&^63 != 0 {
 | |
| 		panic("start out of bounds")
 | |
| 	}
 | |
| 	if end&^63 != 0 {
 | |
| 		panic("end out of bounds")
 | |
| 	}
 | |
| 	if amount&^63 != 0 {
 | |
| 		panic("amount out of bounds")
 | |
| 	}
 | |
| 	return RotateParams{
 | |
| 		Start:  uint8(start),
 | |
| 		End:    uint8(end),
 | |
| 		Amount: uint8(amount),
 | |
| 	}
 | |
| }
 |