!sum
# Integers
# ShiftAll*
- go: ShiftAllLeft
  asm: "VPSLL[WDQ]"
  in:
  - &any
    go: $t
  - &vecAsScalar64
    go: "Uint.*"
    treatLikeAScalarOfSize: 64
  out:
  - *any
- go: ShiftAllRight
  signed: false
  asm: "VPSRL[WDQ]"
  in:
  - &uint
    go: $t
    base: uint
  - *vecAsScalar64
  out:
  - *uint
- go: ShiftAllRight
  signed: true
  asm: "VPSRA[WDQ]"
  in:
  - &int
    go: $t
    base: int
  - *vecAsScalar64
  out:
  - *int

- go: shiftAllLeftConst
  asm: "VPSLL[WDQ]"
  in:
  - *any
  - &imm
    class: immediate
    immOffset: 0
  out:
  - *any
- go: shiftAllRightConst
  asm: "VPSRL[WDQ]"
  in:
  - *int
  - *imm
  out:
  - *int
- go: shiftAllRightConst
  asm: "VPSRA[WDQ]"
  in:
  - *uint
  - *imm
  out:
  - *uint

# Shift* (variable)
- go: ShiftLeft
  asm: "VPSLLV[WD]"
  in:
  - *any
  - *any
  out:
  - *any
# XED data of VPSLLVQ marks the element bits 32 which is off to the actual semantic, we need to overwrite
# it to 64.
- go: ShiftLeft
  asm: "VPSLLVQ"
  in:
  - &anyOverwriteElemBits
    go: $t
    overwriteElementBits: 64
  - *anyOverwriteElemBits
  out:
  - *anyOverwriteElemBits
- go: ShiftRight
  signed: false
  asm: "VPSRLV[WD]"
  in:
  - *uint
  - *uint
  out:
  - *uint
# XED data of VPSRLVQ needs the same overwrite as VPSLLVQ.
- go: ShiftRight
  signed: false
  asm: "VPSRLVQ"
  in:
  - &uintOverwriteElemBits
    go: $t
    base: uint
    overwriteElementBits: 64
  - *uintOverwriteElemBits
  out:
  - *uintOverwriteElemBits
- go: ShiftRight
  signed: true
  asm: "VPSRAV[WDQ]"
  in:
  - *int
  - *int
  out:
  - *int

# Rotate
- go: RotateAllLeft
  asm: "VPROL[DQ]"
  in:
  - *any
  - &pureImm
    class: immediate
    immOffset: 0
    name: shift
  out:
  - *any
- go: RotateAllRight
  asm: "VPROR[DQ]"
  in:
  - *any
  - *pureImm
  out:
  - *any
- go: RotateLeft
  asm: "VPROLV[DQ]"
  in:
  - *any
  - *any
  out:
  - *any
- go: RotateRight
  asm: "VPRORV[DQ]"
  in:
  - *any
  - *any
  out:
  - *any

# Bizzare shifts.
- go: ShiftAllLeftConcat
  asm: "VPSHLD[WDQ]"
  in:
  - *any
  - *any
  - *pureImm
  out:
  - *any
- go: ShiftAllRightConcat
  asm: "VPSHRD[WDQ]"
  in:
  - *any
  - *any
  - *pureImm
  out:
  - *any
- go: ShiftLeftConcat
  asm: "VPSHLDV[WDQ]"
  in:
  - *any
  - *any
  - *any
  out:
  - *any
- go: ShiftRightConcat
  asm: "VPSHRDV[WDQ]"
  in:
  - *any
  - *any
  - *any
  out:
  - *any
