| !sum |
| # Float <-> Int conversions |
| # float32 -> int32 |
| - go: ConvertToInt32 |
| regexpTag: "convert" |
| asm: "VCVTTP[SD]2DQ" |
| in: |
| - &fp |
| go: $t |
| base: float |
| out: |
| - &i32 |
| go: $u |
| base: int |
| elemBits: 32 |
| # float32 -> uint32 |
| - go: ConvertToUint32 |
| regexpTag: "convert" |
| asm: "VCVTTP[SD]2UDQ" |
| in: |
| - *fp |
| out: |
| - &u32 |
| go: $u |
| base: uint |
| elemBits: 32 |
| # float32|float64 -> int64 |
| - go: ConvertToInt64 |
| regexpTag: "convert" |
| asm: "VCVTTPD2QQ" |
| in: |
| - *fp |
| out: |
| - &i64 |
| go: $u |
| base: int |
| elemBits: 64 |
| - go: ConvertToInt64 |
| regexpTag: "convert" |
| asm: "VCVTTPS2QQ" |
| in: |
| - *fp |
| out: |
| - go: $u |
| base: int |
| elemBits: 64 |
| bits: 256|512 |
| # float32|float64 -> uint64 |
| - go: ConvertToUint64 |
| regexpTag: "convert" |
| asm: "VCVTTPD2UQQ" |
| in: |
| - *fp |
| out: |
| - &u64 |
| go: $u |
| base: uint |
| elemBits: 64 |
| - go: ConvertToUint64 |
| regexpTag: "convert" |
| asm: "VCVTTPS2UQQ" |
| in: |
| - *fp |
| out: |
| - go: $u |
| base: uint |
| elemBits: 64 |
| bits: 256|512 |
| # int -> float32 |
| - go: ConvertToFloat32 |
| regexpTag: "convert" |
| asm: "VCVT[DQ]Q2PS" |
| in: &int |
| - go: $i |
| base: int |
| out: |
| - *fp |
| # int -> float64 |
| - go: ConvertToFloat64 |
| regexpTag: "convert" |
| asm: "VCVTQQ2PD" |
| in: *int |
| out: |
| - *fp |
| - go: ConvertToFloat64 |
| regexpTag: "convert" |
| asm: "VCVTDQ2PD" |
| in: *int |
| out: |
| - base: float |
| bits: 256|512 |
| # uint -> float32 |
| - go: ConvertToFloat32 |
| regexpTag: "convert" |
| asm: "VCVTU[DQ]Q2PS" |
| in: &uint |
| - go: $u |
| base: uint |
| out: |
| - *fp |
| # uint -> float64 |
| - go: ConvertToFloat64 |
| regexpTag: "convert" |
| asm: "VCVTUQQ2PD" |
| in: *uint |
| out: |
| - *fp |
| - go: ConvertToFloat64 |
| regexpTag: "convert" |
| asm: "VCVTUDQ2PD" |
| in: *uint |
| out: |
| - base: float |
| bits: 256|512 |
| # float64 -> float32 |
| - go: ConvertToFloat32 |
| regexpTag: "convert" |
| asm: "VCVTPD2PS" |
| addDoc: |
| !string |- |
| // The result vector's elements are rounded to the nearest value. |
| in: &fp64 |
| - base: float |
| elemBits: 64 |
| out: &fp32 |
| - base: float |
| elemBits: 32 |
| # float32 -> float64 |
| - go: ConvertToFloat64 |
| regexpTag: "convert" |
| asm: "VCVTPS2PD" |
| in: *fp32 |
| out: |
| - base: float |
| elemBits: 64 |
| bits: 256|512 |
| |
| # Widening integer conversions. |
| # uint8 -> uint16 |
| - go: ExtendToUint16 |
| regexpTag: "convert" |
| asm: "VPMOVZXBW" |
| in: |
| - &u8x16 |
| base: uint |
| elemBits: 8 |
| bits: 128 |
| out: |
| - &u16x16 |
| base: uint |
| elemBits: 16 |
| bits: 256 |
| - go: ExtendToUint16 |
| regexpTag: "convert" |
| asm: "VPMOVZXBW" |
| in: |
| - &u8x32 |
| base: uint |
| elemBits: 8 |
| bits: 256 |
| out: |
| - &u16x32 |
| base: uint |
| elemBits: 16 |
| bits: 512 |
| # int8 -> int16 |
| - go: ExtendToInt16 |
| regexpTag: "convert" |
| asm: "VPMOVSXBW" |
| in: |
| - &i8x16 |
| base: int |
| elemBits: 8 |
| bits: 128 |
| out: |
| - &i16x16 |
| base: int |
| elemBits: 16 |
| bits: 256 |
| - go: ExtendToInt16 |
| regexpTag: "convert" |
| asm: "VPMOVSXBW" |
| in: |
| - &i8x32 |
| base: int |
| elemBits: 8 |
| bits: 256 |
| out: |
| - &i16x32 |
| base: int |
| elemBits: 16 |
| bits: 512 |
| # uint16->uint32 |
| - go: ExtendToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVZXWD" |
| in: |
| - &u16x8 |
| base: uint |
| elemBits: 16 |
| bits: 128 |
| out: |
| - &u32x8 |
| base: uint |
| elemBits: 32 |
| bits: 256 |
| - go: ExtendToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVZXWD" |
| in: |
| - *u16x16 |
| out: |
| - &u32x16 |
| base: uint |
| elemBits: 32 |
| bits: 512 |
| # int16->int32 |
| - go: ExtendToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSXWD" |
| in: |
| - &i16x8 |
| base: int |
| elemBits: 16 |
| bits: 128 |
| out: |
| - &i32x8 |
| base: int |
| elemBits: 32 |
| bits: 256 |
| - go: ExtendToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSXWD" |
| in: |
| - *i16x16 |
| out: |
| - &i32x16 |
| base: int |
| elemBits: 32 |
| bits: 512 |
| # uint32 -> uint64 |
| - go: ExtendToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXDQ" |
| in: |
| - &u32x4 |
| base: uint |
| elemBits: 32 |
| bits: 128 |
| out: |
| - &u64x4 |
| base: uint |
| elemBits: 64 |
| bits: 256 |
| - go: ExtendToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXDQ" |
| in: |
| - *u32x8 |
| out: |
| - &u64x8 |
| base: uint |
| elemBits: 64 |
| bits: 512 |
| # int32 -> int64 |
| - go: ExtendToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXDQ" |
| in: |
| - &i32x4 |
| base: int |
| elemBits: 32 |
| bits: 128 |
| out: |
| - &i64x4 |
| base: int |
| elemBits: 64 |
| bits: 256 |
| - go: ExtendToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXDQ" |
| in: |
| - *i32x8 |
| out: |
| - &i64x8 |
| base: int |
| elemBits: 64 |
| bits: 512 |
| # uint16 -> uint64 |
| - go: ExtendToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXWQ" |
| in: |
| - *u16x8 |
| out: |
| - *u64x8 |
| # int16 -> int64 |
| - go: ExtendToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXWQ" |
| in: |
| - *i16x8 |
| out: |
| - *i64x8 |
| # uint8 -> uint32 |
| - go: ExtendToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVZXBD" |
| in: |
| - *u8x16 |
| out: |
| - *u32x16 |
| # int8 -> int32 |
| - go: ExtendToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSXBD" |
| in: |
| - *i8x16 |
| out: |
| - *i32x16 |
| # Truncating conversions |
| - go: TruncToInt8 |
| regexpTag: "convert" |
| asm: "VPMOV[WDQ]B" |
| in: |
| - base: int |
| out: |
| - base: int |
| bits: 128 |
| - go: TruncToUint8 |
| regexpTag: "convert" |
| asm: "VPMOV[WDQ]B" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| bits: 128 |
| - go: TruncToInt8 |
| regexpTag: "convert" |
| asm: "VPMOV[WDQ]B" |
| in: |
| - base: int |
| out: |
| - base: int |
| bits: 256|512 |
| - go: TruncToUint8 |
| regexpTag: "convert" |
| asm: "VPMOV[WDQ]B" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| bits: 256|512 |
| - go: TruncToInt16 |
| regexpTag: "convert" |
| asm: "VPMOV[DQ]W" |
| in: |
| - base: int |
| out: |
| - base: int |
| - go: TruncToUint16 |
| regexpTag: "convert" |
| asm: "VPMOV[DQ]W" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| - go: TruncToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVQD" |
| in: |
| - base: int |
| out: |
| - base: int |
| - go: TruncToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVQD" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| # Saturated conversions. |
| - go: SaturateToInt8 |
| regexpTag: "convert" |
| asm: "VPMOVS[WDQ]B" |
| in: |
| - base: int |
| out: |
| - base: int |
| bits: 128 |
| - go: SaturateToUint8 |
| regexpTag: "convert" |
| asm: "VPMOVUS[WDQ]B" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| bits: 128 |
| - go: SaturateToInt8 |
| regexpTag: "convert" |
| asm: "VPMOVS[WDQ]B" |
| in: |
| - base: int |
| out: |
| - base: int |
| bits: 256|512 |
| - go: SaturateToUint8 |
| regexpTag: "convert" |
| asm: "VPMOVUS[WDQ]B" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| bits: 256|512 |
| - go: SaturateToInt16 |
| regexpTag: "convert" |
| asm: "VPMOVS[DQ]W" |
| in: |
| - base: int |
| out: |
| - base: int |
| - go: SaturateToUint16 |
| regexpTag: "convert" |
| asm: "VPMOVUS[DQ]W" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| - go: SaturateToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSQD" |
| in: |
| - base: int |
| out: |
| - base: int |
| - go: SaturateToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVUSQD" |
| in: |
| - base: uint |
| out: |
| - base: uint |
| # Truncating saturated packed |
| - go: SaturateToInt16Concat |
| regexpTag: "convert" |
| asm: "VPACKSSDW" |
| addDoc: &satDocConcat |
| !string |- |
| // The converted elements from x will be packed to the lower part of the result vector, |
| // the converted elements from y will be packed to the upper part of the result vector. |
| in: |
| - base: int |
| - base: int |
| out: |
| - base: int |
| bits: 128 |
| - go: SaturateToInt16ConcatGrouped |
| regexpTag: "convert" |
| asm: "VPACKSSDW" |
| addDoc: &satDocConcatGrouped |
| !string |- |
| // With each 128-bit as a group: |
| // The converted elements from x will be packed to the lower part of the group in the result vector, |
| // the converted elements from y will be packed to the upper part of the group in the result vector. |
| in: |
| - base: int |
| - base: int |
| out: |
| - base: int |
| bits: 256|512 |
| - go: SaturateToUint16Concat |
| regexpTag: "convert" |
| asm: "VPACKUSDW" |
| addDoc: *satDocConcat |
| in: |
| - base: int |
| - base: int |
| out: |
| - base: uint |
| bits: 128 |
| - go: SaturateToUint16ConcatGrouped |
| regexpTag: "convert" |
| asm: "VPACKUSDW" |
| addDoc: *satDocConcatGrouped |
| in: |
| - base: int |
| - base: int |
| out: |
| - base: uint |
| bits: 256|512 |
| |
| # low-part only conversions. |
| # uint8->uint16 |
| - go: ExtendLo8ToUint16 |
| regexpTag: "convert" |
| asm: "VPMOVZXBW" |
| in: |
| - *u8x16 |
| out: |
| - *u16x8 |
| # int8->int16 |
| - go: ExtendLo8ToInt16 |
| regexpTag: "convert" |
| asm: "VPMOVSXBW" |
| in: |
| - *i8x16 |
| out: |
| - *i16x8 |
| # uint16->uint32 |
| - go: ExtendLo4ToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVZXWD" |
| in: |
| - *u16x8 |
| out: |
| - *u32x4 |
| # int16->int32 |
| - go: ExtendLo4ToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSXWD" |
| in: |
| - *i16x8 |
| out: |
| - *i32x4 |
| # uint32 -> uint64 |
| - go: ExtendLo2ToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXDQ" |
| in: |
| - *u32x4 |
| out: |
| - &u64x2 |
| base: uint |
| elemBits: 64 |
| bits: 128 |
| # int32 -> int64 |
| - go: ExtendLo2ToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXDQ" |
| in: |
| - *i32x4 |
| out: |
| - &i64x2 |
| base: int |
| elemBits: 64 |
| bits: 128 |
| # uint16 -> uint64 |
| - go: ExtendLo2ToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXWQ" |
| in: |
| - *u16x8 |
| out: |
| - *u64x2 |
| - go: ExtendLo4ToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXWQ" |
| in: |
| - *u16x8 |
| out: |
| - *u64x4 |
| # int16 -> int64 |
| - go: ExtendLo2ToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXWQ" |
| in: |
| - *i16x8 |
| out: |
| - *i64x2 |
| - go: ExtendLo4ToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXWQ" |
| in: |
| - *i16x8 |
| out: |
| - *i64x4 |
| # uint8 -> uint32 |
| - go: ExtendLo4ToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVZXBD" |
| in: |
| - *u8x16 |
| out: |
| - *u32x4 |
| - go: ExtendLo8ToUint32 |
| regexpTag: "convert" |
| asm: "VPMOVZXBD" |
| in: |
| - *u8x16 |
| out: |
| - *u32x8 |
| # int8 -> int32 |
| - go: ExtendLo4ToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSXBD" |
| in: |
| - *i8x16 |
| out: |
| - *i32x4 |
| - go: ExtendLo8ToInt32 |
| regexpTag: "convert" |
| asm: "VPMOVSXBD" |
| in: |
| - *i8x16 |
| out: |
| - *i32x8 |
| # uint8 -> uint64 |
| - go: ExtendLo2ToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXBQ" |
| in: |
| - *u8x16 |
| out: |
| - *u64x2 |
| - go: ExtendLo4ToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXBQ" |
| in: |
| - *u8x16 |
| out: |
| - *u64x4 |
| - go: ExtendLo8ToUint64 |
| regexpTag: "convert" |
| asm: "VPMOVZXBQ" |
| in: |
| - *u8x16 |
| out: |
| - *u64x8 |
| # int8 -> int64 |
| - go: ExtendLo2ToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXBQ" |
| in: |
| - *i8x16 |
| out: |
| - *i64x2 |
| - go: ExtendLo4ToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXBQ" |
| in: |
| - *i8x16 |
| out: |
| - *i64x4 |
| - go: ExtendLo8ToInt64 |
| regexpTag: "convert" |
| asm: "VPMOVSXBQ" |
| in: |
| - *i8x16 |
| out: |
| - *i64x8 |