Source file src/cmd/compile/internal/ssacompile/tern_helpers.go

     1  // Code generated by 'tmplgen'; DO NOT EDIT.
     2  
     3  package ssacompile
     4  
     5  import "cmd/compile/internal/ssa"
     6  import "cmd/compile/internal/ssa/ssaop"
     7  
     8  type SIMDLogicalOP uint8
     9  
    10  const (
    11  	// boolean simd operations, for reducing expression to VPTERNLOG* instructions
    12  	// sloInterior is set for non-root nodes in logical-op expression trees.
    13  	// the operations are even-numbered.
    14  	sloInterior SIMDLogicalOP = 1
    15  	sloNone     SIMDLogicalOP = 2 * iota
    16  	sloAnd
    17  	sloOr
    18  	sloAndNot
    19  	sloXor
    20  	sloNot
    21  )
    22  
    23  func classifyBooleanSIMD(v *ssa.Value) SIMDLogicalOP {
    24  	switch v.Op {
    25  	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:
    26  		return sloAnd
    27  
    28  	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:
    29  		return sloOr
    30  
    31  	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:
    32  		return sloAndNot
    33  	case ssaop.OpXorInt8x16:
    34  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt8x16 &&
    35  			y.Args[0] == y.Args[1] {
    36  			return sloNot
    37  		}
    38  		return sloXor
    39  	case ssaop.OpXorInt16x8:
    40  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt16x8 &&
    41  			y.Args[0] == y.Args[1] {
    42  			return sloNot
    43  		}
    44  		return sloXor
    45  	case ssaop.OpXorInt32x4:
    46  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt32x4 &&
    47  			y.Args[0] == y.Args[1] {
    48  			return sloNot
    49  		}
    50  		return sloXor
    51  	case ssaop.OpXorInt64x2:
    52  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt64x2 &&
    53  			y.Args[0] == y.Args[1] {
    54  			return sloNot
    55  		}
    56  		return sloXor
    57  	case ssaop.OpXorInt8x32:
    58  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt8x32 &&
    59  			y.Args[0] == y.Args[1] {
    60  			return sloNot
    61  		}
    62  		return sloXor
    63  	case ssaop.OpXorInt16x16:
    64  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt16x16 &&
    65  			y.Args[0] == y.Args[1] {
    66  			return sloNot
    67  		}
    68  		return sloXor
    69  	case ssaop.OpXorInt32x8:
    70  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt32x8 &&
    71  			y.Args[0] == y.Args[1] {
    72  			return sloNot
    73  		}
    74  		return sloXor
    75  	case ssaop.OpXorInt64x4:
    76  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt64x4 &&
    77  			y.Args[0] == y.Args[1] {
    78  			return sloNot
    79  		}
    80  		return sloXor
    81  	case ssaop.OpXorInt8x64:
    82  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt8x64 &&
    83  			y.Args[0] == y.Args[1] {
    84  			return sloNot
    85  		}
    86  		return sloXor
    87  	case ssaop.OpXorInt16x32:
    88  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt16x32 &&
    89  			y.Args[0] == y.Args[1] {
    90  			return sloNot
    91  		}
    92  		return sloXor
    93  	case ssaop.OpXorInt32x16:
    94  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt32x16 &&
    95  			y.Args[0] == y.Args[1] {
    96  			return sloNot
    97  		}
    98  		return sloXor
    99  	case ssaop.OpXorInt64x8:
   100  		if y := v.Args[1]; y.Op == ssaop.OpEqualInt64x8 &&
   101  			y.Args[0] == y.Args[1] {
   102  			return sloNot
   103  		}
   104  		return sloXor
   105  
   106  	}
   107  	return sloNone
   108  }
   109  
   110  func ternOpForLogical(op ssaop.Op) ssaop.Op {
   111  	switch op {
   112  	case ssaop.OpAndInt8x16, ssaop.OpOrInt8x16, ssaop.OpXorInt8x16, ssaop.OpAndNotInt8x16:
   113  		return ssaop.OpternInt32x4
   114  	case ssaop.OpAndUint8x16, ssaop.OpOrUint8x16, ssaop.OpXorUint8x16, ssaop.OpAndNotUint8x16:
   115  		return ssaop.OpternUint32x4
   116  	case ssaop.OpAndInt16x8, ssaop.OpOrInt16x8, ssaop.OpXorInt16x8, ssaop.OpAndNotInt16x8:
   117  		return ssaop.OpternInt32x4
   118  	case ssaop.OpAndUint16x8, ssaop.OpOrUint16x8, ssaop.OpXorUint16x8, ssaop.OpAndNotUint16x8:
   119  		return ssaop.OpternUint32x4
   120  	case ssaop.OpAndInt32x4, ssaop.OpOrInt32x4, ssaop.OpXorInt32x4, ssaop.OpAndNotInt32x4:
   121  		return ssaop.OpternInt32x4
   122  	case ssaop.OpAndUint32x4, ssaop.OpOrUint32x4, ssaop.OpXorUint32x4, ssaop.OpAndNotUint32x4:
   123  		return ssaop.OpternUint32x4
   124  	case ssaop.OpAndInt64x2, ssaop.OpOrInt64x2, ssaop.OpXorInt64x2, ssaop.OpAndNotInt64x2:
   125  		return ssaop.OpternInt64x2
   126  	case ssaop.OpAndUint64x2, ssaop.OpOrUint64x2, ssaop.OpXorUint64x2, ssaop.OpAndNotUint64x2:
   127  		return ssaop.OpternUint64x2
   128  	case ssaop.OpAndInt8x32, ssaop.OpOrInt8x32, ssaop.OpXorInt8x32, ssaop.OpAndNotInt8x32:
   129  		return ssaop.OpternInt32x8
   130  	case ssaop.OpAndUint8x32, ssaop.OpOrUint8x32, ssaop.OpXorUint8x32, ssaop.OpAndNotUint8x32:
   131  		return ssaop.OpternUint32x8
   132  	case ssaop.OpAndInt16x16, ssaop.OpOrInt16x16, ssaop.OpXorInt16x16, ssaop.OpAndNotInt16x16:
   133  		return ssaop.OpternInt32x8
   134  	case ssaop.OpAndUint16x16, ssaop.OpOrUint16x16, ssaop.OpXorUint16x16, ssaop.OpAndNotUint16x16:
   135  		return ssaop.OpternUint32x8
   136  	case ssaop.OpAndInt32x8, ssaop.OpOrInt32x8, ssaop.OpXorInt32x8, ssaop.OpAndNotInt32x8:
   137  		return ssaop.OpternInt32x8
   138  	case ssaop.OpAndUint32x8, ssaop.OpOrUint32x8, ssaop.OpXorUint32x8, ssaop.OpAndNotUint32x8:
   139  		return ssaop.OpternUint32x8
   140  	case ssaop.OpAndInt64x4, ssaop.OpOrInt64x4, ssaop.OpXorInt64x4, ssaop.OpAndNotInt64x4:
   141  		return ssaop.OpternInt64x4
   142  	case ssaop.OpAndUint64x4, ssaop.OpOrUint64x4, ssaop.OpXorUint64x4, ssaop.OpAndNotUint64x4:
   143  		return ssaop.OpternUint64x4
   144  	case ssaop.OpAndInt8x64, ssaop.OpOrInt8x64, ssaop.OpXorInt8x64, ssaop.OpAndNotInt8x64:
   145  		return ssaop.OpternInt32x16
   146  	case ssaop.OpAndUint8x64, ssaop.OpOrUint8x64, ssaop.OpXorUint8x64, ssaop.OpAndNotUint8x64:
   147  		return ssaop.OpternUint32x16
   148  	case ssaop.OpAndInt16x32, ssaop.OpOrInt16x32, ssaop.OpXorInt16x32, ssaop.OpAndNotInt16x32:
   149  		return ssaop.OpternInt32x16
   150  	case ssaop.OpAndUint16x32, ssaop.OpOrUint16x32, ssaop.OpXorUint16x32, ssaop.OpAndNotUint16x32:
   151  		return ssaop.OpternUint32x16
   152  	case ssaop.OpAndInt32x16, ssaop.OpOrInt32x16, ssaop.OpXorInt32x16, ssaop.OpAndNotInt32x16:
   153  		return ssaop.OpternInt32x16
   154  	case ssaop.OpAndUint32x16, ssaop.OpOrUint32x16, ssaop.OpXorUint32x16, ssaop.OpAndNotUint32x16:
   155  		return ssaop.OpternUint32x16
   156  	case ssaop.OpAndInt64x8, ssaop.OpOrInt64x8, ssaop.OpXorInt64x8, ssaop.OpAndNotInt64x8:
   157  		return ssaop.OpternInt64x8
   158  	case ssaop.OpAndUint64x8, ssaop.OpOrUint64x8, ssaop.OpXorUint64x8, ssaop.OpAndNotUint64x8:
   159  		return ssaop.OpternUint64x8
   160  
   161  	}
   162  	return op
   163  }
   164  

View as plain text