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