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