blob: bb5a7f7a8fa95cca7e765cec37c9afbf746004a6 [file]
// Code generated by 'tmplgen'; DO NOT EDIT.
package ssacompile
import "cmd/compile/internal/ssa"
import "cmd/compile/internal/ssa/ssaop"
type SIMDLogicalOP uint8
const (
// boolean simd operations, for reducing expression to VPTERNLOG* instructions
// sloInterior is set for non-root nodes in logical-op expression trees.
// the operations are even-numbered.
sloInterior SIMDLogicalOP = 1
sloNone SIMDLogicalOP = 2 * iota
sloAnd
sloOr
sloAndNot
sloXor
sloNot
)
func classifyBooleanSIMD(v *ssa.Value) SIMDLogicalOP {
switch v.Op {
case ssaop.OpAndInt8x16, ssaop.OpAndInt16x8, ssaop.OpAndInt32x4, ssaop.OpAndInt64x2, ssaop.OpAndInt8x32, ssaop.OpAndInt16x16, ssaop.OpAndInt32x8, ssaop.OpAndInt64x4, ssaop.OpAndInt8x64, ssaop.OpAndInt16x32, ssaop.OpAndInt32x16, ssaop.OpAndInt64x8:
return sloAnd
case ssaop.OpOrInt8x16, ssaop.OpOrInt16x8, ssaop.OpOrInt32x4, ssaop.OpOrInt64x2, ssaop.OpOrInt8x32, ssaop.OpOrInt16x16, ssaop.OpOrInt32x8, ssaop.OpOrInt64x4, ssaop.OpOrInt8x64, ssaop.OpOrInt16x32, ssaop.OpOrInt32x16, ssaop.OpOrInt64x8:
return sloOr
case ssaop.OpAndNotInt8x16, ssaop.OpAndNotInt16x8, ssaop.OpAndNotInt32x4, ssaop.OpAndNotInt64x2, ssaop.OpAndNotInt8x32, ssaop.OpAndNotInt16x16, ssaop.OpAndNotInt32x8, ssaop.OpAndNotInt64x4, ssaop.OpAndNotInt8x64, ssaop.OpAndNotInt16x32, ssaop.OpAndNotInt32x16, ssaop.OpAndNotInt64x8:
return sloAndNot
case ssaop.OpXorInt8x16:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt8x16 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt16x8:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt16x8 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt32x4:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt32x4 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt64x2:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt64x2 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt8x32:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt8x32 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt16x16:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt16x16 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt32x8:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt32x8 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt64x4:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt64x4 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt8x64:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt8x64 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt16x32:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt16x32 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt32x16:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt32x16 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
case ssaop.OpXorInt64x8:
if y := v.Args[1]; y.Op == ssaop.OpEqualInt64x8 &&
y.Args[0] == y.Args[1] {
return sloNot
}
return sloXor
}
return sloNone
}
func ternOpForLogical(op ssaop.Op) ssaop.Op {
switch op {
case ssaop.OpAndInt8x16, ssaop.OpOrInt8x16, ssaop.OpXorInt8x16, ssaop.OpAndNotInt8x16:
return ssaop.OpternInt32x4
case ssaop.OpAndUint8x16, ssaop.OpOrUint8x16, ssaop.OpXorUint8x16, ssaop.OpAndNotUint8x16:
return ssaop.OpternUint32x4
case ssaop.OpAndInt16x8, ssaop.OpOrInt16x8, ssaop.OpXorInt16x8, ssaop.OpAndNotInt16x8:
return ssaop.OpternInt32x4
case ssaop.OpAndUint16x8, ssaop.OpOrUint16x8, ssaop.OpXorUint16x8, ssaop.OpAndNotUint16x8:
return ssaop.OpternUint32x4
case ssaop.OpAndInt32x4, ssaop.OpOrInt32x4, ssaop.OpXorInt32x4, ssaop.OpAndNotInt32x4:
return ssaop.OpternInt32x4
case ssaop.OpAndUint32x4, ssaop.OpOrUint32x4, ssaop.OpXorUint32x4, ssaop.OpAndNotUint32x4:
return ssaop.OpternUint32x4
case ssaop.OpAndInt64x2, ssaop.OpOrInt64x2, ssaop.OpXorInt64x2, ssaop.OpAndNotInt64x2:
return ssaop.OpternInt64x2
case ssaop.OpAndUint64x2, ssaop.OpOrUint64x2, ssaop.OpXorUint64x2, ssaop.OpAndNotUint64x2:
return ssaop.OpternUint64x2
case ssaop.OpAndInt8x32, ssaop.OpOrInt8x32, ssaop.OpXorInt8x32, ssaop.OpAndNotInt8x32:
return ssaop.OpternInt32x8
case ssaop.OpAndUint8x32, ssaop.OpOrUint8x32, ssaop.OpXorUint8x32, ssaop.OpAndNotUint8x32:
return ssaop.OpternUint32x8
case ssaop.OpAndInt16x16, ssaop.OpOrInt16x16, ssaop.OpXorInt16x16, ssaop.OpAndNotInt16x16:
return ssaop.OpternInt32x8
case ssaop.OpAndUint16x16, ssaop.OpOrUint16x16, ssaop.OpXorUint16x16, ssaop.OpAndNotUint16x16:
return ssaop.OpternUint32x8
case ssaop.OpAndInt32x8, ssaop.OpOrInt32x8, ssaop.OpXorInt32x8, ssaop.OpAndNotInt32x8:
return ssaop.OpternInt32x8
case ssaop.OpAndUint32x8, ssaop.OpOrUint32x8, ssaop.OpXorUint32x8, ssaop.OpAndNotUint32x8:
return ssaop.OpternUint32x8
case ssaop.OpAndInt64x4, ssaop.OpOrInt64x4, ssaop.OpXorInt64x4, ssaop.OpAndNotInt64x4:
return ssaop.OpternInt64x4
case ssaop.OpAndUint64x4, ssaop.OpOrUint64x4, ssaop.OpXorUint64x4, ssaop.OpAndNotUint64x4:
return ssaop.OpternUint64x4
case ssaop.OpAndInt8x64, ssaop.OpOrInt8x64, ssaop.OpXorInt8x64, ssaop.OpAndNotInt8x64:
return ssaop.OpternInt32x16
case ssaop.OpAndUint8x64, ssaop.OpOrUint8x64, ssaop.OpXorUint8x64, ssaop.OpAndNotUint8x64:
return ssaop.OpternUint32x16
case ssaop.OpAndInt16x32, ssaop.OpOrInt16x32, ssaop.OpXorInt16x32, ssaop.OpAndNotInt16x32:
return ssaop.OpternInt32x16
case ssaop.OpAndUint16x32, ssaop.OpOrUint16x32, ssaop.OpXorUint16x32, ssaop.OpAndNotUint16x32:
return ssaop.OpternUint32x16
case ssaop.OpAndInt32x16, ssaop.OpOrInt32x16, ssaop.OpXorInt32x16, ssaop.OpAndNotInt32x16:
return ssaop.OpternInt32x16
case ssaop.OpAndUint32x16, ssaop.OpOrUint32x16, ssaop.OpXorUint32x16, ssaop.OpAndNotUint32x16:
return ssaop.OpternUint32x16
case ssaop.OpAndInt64x8, ssaop.OpOrInt64x8, ssaop.OpXorInt64x8, ssaop.OpAndNotInt64x8:
return ssaop.OpternInt64x8
case ssaop.OpAndUint64x8, ssaop.OpOrUint64x8, ssaop.OpXorUint64x8, ssaop.OpAndNotUint64x8:
return ssaop.OpternUint64x8
}
return op
}