gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

rotate.go (1358B)


      1 // Copyright 2019 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package s390x
      6 
      7 // RotateParams represents the immediates required for a "rotate
      8 // then ... selected bits instruction".
      9 //
     10 // The Start and End values are the indexes that represent
     11 // the masked region. They are inclusive and are in big-
     12 // endian order (bit 0 is the MSB, bit 63 is the LSB). They
     13 // may wrap around.
     14 //
     15 // Some examples:
     16 //
     17 // Masked region             | Start | End
     18 // --------------------------+-------+----
     19 // 0x00_00_00_00_00_00_00_0f | 60    | 63
     20 // 0xf0_00_00_00_00_00_00_00 | 0     | 3
     21 // 0xf0_00_00_00_00_00_00_0f | 60    | 3
     22 //
     23 // The Amount value represents the amount to rotate the
     24 // input left by. Note that this rotation is performed
     25 // before the masked region is used.
     26 type RotateParams struct {
     27 	Start  uint8 // big-endian start bit index [0..63]
     28 	End    uint8 // big-endian end bit index [0..63]
     29 	Amount uint8 // amount to rotate left
     30 }
     31 
     32 func NewRotateParams(start, end, amount int64) RotateParams {
     33 	if start&^63 != 0 {
     34 		panic("start out of bounds")
     35 	}
     36 	if end&^63 != 0 {
     37 		panic("end out of bounds")
     38 	}
     39 	if amount&^63 != 0 {
     40 		panic("amount out of bounds")
     41 	}
     42 	return RotateParams{
     43 		Start:  uint8(start),
     44 		End:    uint8(end),
     45 		Amount: uint8(amount),
     46 	}
     47 }