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

View as plain text