| // 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), |
| } |
| } |