| !sum |
| - go: SetElem |
| asm: "VPINSR[BWDQ]" |
| in: |
| - &t |
| class: vreg |
| base: $b |
| - class: greg |
| base: $b |
| lanes: 1 # Scalar, darn it! |
| - &imm |
| class: immediate |
| immOffset: 0 |
| name: index |
| out: |
| - *t |
| |
| - go: GetElem |
| asm: "VPEXTR[BWDQ]" |
| in: |
| - class: vreg |
| base: $b |
| elemBits: $e |
| - *imm |
| out: |
| - class: greg |
| base: $b |
| bits: $e |
| |
| |
| - go: Set128 |
| asm: "VINSERTI128" |
| in: |
| - &i8x32 |
| class: vreg |
| base: $t |
| bits: 256 |
| OverwriteElementBits: 8 |
| - &i8x16 |
| class: vreg |
| base: $t |
| bits: 128 |
| OverwriteElementBits: 8 |
| - &imm01 # This immediate should be only 0 or 1 |
| class: immediate |
| immOffset: 0 |
| name: index |
| out: |
| - *i8x32 |
| |
| - go: Get128 |
| asm: "VEXTRACTI128" |
| in: |
| - *i8x32 |
| - *imm01 |
| out: |
| - *i8x16 |
| |
| - go: Set128 |
| asm: "VINSERTI128" |
| in: |
| - &i16x16 |
| class: vreg |
| base: $t |
| bits: 256 |
| OverwriteElementBits: 16 |
| - &i16x8 |
| class: vreg |
| base: $t |
| bits: 128 |
| OverwriteElementBits: 16 |
| - *imm01 |
| out: |
| - *i16x16 |
| |
| - go: Get128 |
| asm: "VEXTRACTI128" |
| in: |
| - *i16x16 |
| - *imm01 |
| out: |
| - *i16x8 |
| |
| - go: Set128 |
| asm: "VINSERTI128" |
| in: |
| - &i32x8 |
| class: vreg |
| base: $t |
| bits: 256 |
| OverwriteElementBits: 32 |
| - &i32x4 |
| class: vreg |
| base: $t |
| bits: 128 |
| OverwriteElementBits: 32 |
| - *imm01 |
| out: |
| - *i32x8 |
| |
| - go: Get128 |
| asm: "VEXTRACTI128" |
| in: |
| - *i32x8 |
| - *imm01 |
| out: |
| - *i32x4 |
| |
| - go: Set128 |
| asm: "VINSERTI128" |
| in: |
| - &i64x4 |
| class: vreg |
| base: $t |
| bits: 256 |
| OverwriteElementBits: 64 |
| - &i64x2 |
| class: vreg |
| base: $t |
| bits: 128 |
| OverwriteElementBits: 64 |
| - *imm01 |
| out: |
| - *i64x4 |
| |
| - go: Get128 |
| asm: "VEXTRACTI128" |
| in: |
| - *i64x4 |
| - *imm01 |
| out: |
| - *i64x2 |
| |
| - go: Set128 |
| asm: "VINSERTF128" |
| in: |
| - &f32x8 |
| class: vreg |
| base: $t |
| bits: 256 |
| OverwriteElementBits: 32 |
| - &f32x4 |
| class: vreg |
| base: $t |
| bits: 128 |
| OverwriteElementBits: 32 |
| - *imm01 |
| out: |
| - *f32x8 |
| |
| - go: Get128 |
| asm: "VEXTRACTF128" |
| in: |
| - *f32x8 |
| - *imm01 |
| out: |
| - *f32x4 |
| |
| - go: Set128 |
| asm: "VINSERTF128" |
| in: |
| - &f64x4 |
| class: vreg |
| base: $t |
| bits: 256 |
| - &f64x2 |
| class: vreg |
| base: $t |
| bits: 128 |
| - *imm01 |
| out: |
| - *f64x4 |
| |
| - go: Get128 |
| asm: "VEXTRACTF128" |
| in: |
| - *f64x4 |
| - *imm01 |
| out: |
| - *f64x2 |
| |
| - go: Permute |
| asm: "VPERM[BWDQ]|VPERMP[SD]" |
| operandOrder: "21Type1" |
| in: |
| - &anyindices |
| go: $t |
| name: indices |
| overwriteBase: uint |
| - &any |
| go: $t |
| out: |
| - *any |
| |
| - go: Permute2 |
| asm: "VPERMI2[BWDQ]|VPERMI2P[SD]" |
| # Because we are overwriting the receiver's type, we |
| # have to move the receiver to be a parameter so that |
| # we can have no duplication. |
| operandOrder: "231Type1" |
| in: |
| - *anyindices # result in arg 0 |
| - *any |
| - *any |
| out: |
| - *any |
| |
| - go: Compress |
| asm: "VPCOMPRESS[BWDQ]|VCOMPRESSP[SD]" |
| in: |
| # The mask in Compress is a control mask rather than a write mask, so it's not optional. |
| - class: mask |
| - *any |
| out: |
| - *any |