Text file src/simd/_gen/simdgen/types.yaml

     1  # This file defines the possible types of each operand and result.
     2  #
     3  # In general, we're able to narrow this down on some attributes directly from
     4  # the machine instruction descriptions, but the Go mappings need to further
     5  # constrain them and how they relate. For example, on x86 we can't distinguish
     6  # int and uint, though we can distinguish these from float.
     7  
     8  in: !repeat
     9  - !sum &types
    10    - {class: vreg, go: Int8x16,    base: "int",   elemBits:  8, bits: 128, lanes: 16}
    11    - {class: vreg, go: Uint8x16,   base: "uint",  elemBits:  8, bits: 128, lanes: 16}
    12    - {class: vreg, go: Int16x8,    base: "int",   elemBits: 16, bits: 128, lanes:  8}
    13    - {class: vreg, go: Uint16x8,   base: "uint",  elemBits: 16, bits: 128, lanes:  8}
    14    - {class: vreg, go: Int32x4,    base: "int",   elemBits: 32, bits: 128, lanes:  4}
    15    - {class: vreg, go: Uint32x4,   base: "uint",  elemBits: 32, bits: 128, lanes:  4}
    16    - {class: vreg, go: Int64x2,    base: "int",   elemBits: 64, bits: 128, lanes:  2}
    17    - {class: vreg, go: Uint64x2,   base: "uint",  elemBits: 64, bits: 128, lanes:  2}
    18    - {class: vreg, go: Float32x4,  base: "float", elemBits: 32, bits: 128, lanes:  4}
    19    - {class: vreg, go: Float64x2,  base: "float", elemBits: 64, bits: 128, lanes:  2}
    20    - {class: vreg, go: Int8x32,    base: "int",   elemBits:  8, bits: 256, lanes: 32}
    21    - {class: vreg, go: Uint8x32,   base: "uint",  elemBits:  8, bits: 256, lanes: 32}
    22    - {class: vreg, go: Int16x16,   base: "int",   elemBits: 16, bits: 256, lanes: 16}
    23    - {class: vreg, go: Uint16x16,  base: "uint",  elemBits: 16, bits: 256, lanes: 16}
    24    - {class: vreg, go: Int32x8,    base: "int",   elemBits: 32, bits: 256, lanes:  8}
    25    - {class: vreg, go: Uint32x8,   base: "uint",  elemBits: 32, bits: 256, lanes:  8}
    26    - {class: vreg, go: Int64x4,    base: "int",   elemBits: 64, bits: 256, lanes:  4}
    27    - {class: vreg, go: Uint64x4,   base: "uint",  elemBits: 64, bits: 256, lanes:  4}
    28    - {class: vreg, go: Float32x8,  base: "float", elemBits: 32, bits: 256, lanes:  8}
    29    - {class: vreg, go: Float64x4,  base: "float", elemBits: 64, bits: 256, lanes:  4}
    30    - {class: vreg, go: Int8x64,    base: "int",   elemBits:  8, bits: 512, lanes: 64}
    31    - {class: vreg, go: Uint8x64,   base: "uint",  elemBits:  8, bits: 512, lanes: 64}
    32    - {class: vreg, go: Int16x32,   base: "int",   elemBits: 16, bits: 512, lanes: 32}
    33    - {class: vreg, go: Uint16x32,  base: "uint",  elemBits: 16, bits: 512, lanes: 32}
    34    - {class: vreg, go: Int32x16,   base: "int",   elemBits: 32, bits: 512, lanes: 16}
    35    - {class: vreg, go: Uint32x16,  base: "uint",  elemBits: 32, bits: 512, lanes: 16}
    36    - {class: vreg, go: Int64x8,    base: "int",   elemBits: 64, bits: 512, lanes:  8}
    37    - {class: vreg, go: Uint64x8,   base: "uint",  elemBits: 64, bits: 512, lanes:  8}
    38    - {class: vreg, go: Float32x16, base: "float", elemBits: 32, bits: 512, lanes: 16}
    39    - {class: vreg, go: Float64x8,  base: "float", elemBits: 64, bits: 512, lanes:  8}
    40  
    41    - {class: mask, go: Mask8x16,   base: "int",   elemBits:  8, bits: 128, lanes: 16}
    42    - {class: mask, go: Mask16x8,   base: "int",   elemBits: 16, bits: 128, lanes:  8}
    43    - {class: mask, go: Mask32x4,   base: "int",   elemBits: 32, bits: 128, lanes:  4}
    44    - {class: mask, go: Mask64x2,   base: "int",   elemBits: 64, bits: 128, lanes:  2}
    45    - {class: mask, go: Mask8x32,   base: "int",   elemBits:  8, bits: 256, lanes: 32}
    46    - {class: mask, go: Mask16x16,  base: "int",   elemBits: 16, bits: 256, lanes: 16}
    47    - {class: mask, go: Mask32x8,   base: "int",   elemBits: 32, bits: 256, lanes:  8}
    48    - {class: mask, go: Mask64x4,   base: "int",   elemBits: 64, bits: 256, lanes:  4}
    49    - {class: mask, go: Mask8x64,   base: "int",   elemBits:  8, bits: 512, lanes: 64}
    50    - {class: mask, go: Mask16x32,  base: "int",   elemBits: 16, bits: 512, lanes: 32}
    51    - {class: mask, go: Mask32x16,  base: "int",   elemBits: 32, bits: 512, lanes: 16}
    52    - {class: mask, go: Mask64x8,   base: "int",   elemBits: 64, bits: 512, lanes:  8}
    53  
    54  
    55    - {class: greg, go: float64,    base: "float", bits:  64, lanes:  1}
    56    - {class: greg, go: float32,    base: "float", bits:  32, lanes:  1}
    57    - {class: greg, go: int64,      base: "int",   bits:  64, lanes:  1}
    58    - {class: greg, go: int32,      base: "int",   bits:  32, lanes:  1}
    59    - {class: greg, go: int16,      base: "int",   bits:  16, lanes:  1}
    60    - {class: greg, go: int8,       base: "int",   bits:   8, lanes:  1}
    61    - {class: greg, go: uint64,     base: "uint",  bits:  64, lanes:  1}
    62    - {class: greg, go: uint32,     base: "uint",  bits:  32, lanes:  1}
    63    - {class: greg, go: uint16,     base: "uint",  bits:  16, lanes:  1}
    64    - {class: greg, go: uint8,      base: "uint",  bits:   8, lanes:  1}
    65  
    66  # Special shapes just to make INSERT[IF]128 work.
    67  # The elemBits field of these shapes are wrong, it would be overwritten by overwriteElemBits.
    68    - {class: vreg, go: Int8x16,    base: "int",   elemBits: 128, bits: 128, lanes: 16}
    69    - {class: vreg, go: Uint8x16,   base: "uint",  elemBits: 128, bits: 128, lanes: 16}
    70    - {class: vreg, go: Int16x8,    base: "int",   elemBits: 128, bits: 128, lanes: 8}
    71    - {class: vreg, go: Uint16x8,   base: "uint",  elemBits: 128, bits: 128, lanes: 8}
    72    - {class: vreg, go: Int32x4,    base: "int",   elemBits: 128, bits: 128, lanes: 4}
    73    - {class: vreg, go: Uint32x4,   base: "uint",  elemBits: 128, bits: 128, lanes: 4}
    74    - {class: vreg, go: Int64x2,    base: "int",   elemBits: 128, bits: 128, lanes: 2}
    75    - {class: vreg, go: Uint64x2,   base: "uint",  elemBits: 128, bits: 128, lanes: 2}
    76  
    77    - {class: vreg, go: Int8x32,    base: "int",   elemBits: 128, bits: 256, lanes: 32}
    78    - {class: vreg, go: Uint8x32,   base: "uint",  elemBits: 128, bits: 256, lanes: 32}
    79    - {class: vreg, go: Int16x16,   base: "int",   elemBits: 128, bits: 256, lanes: 16}
    80    - {class: vreg, go: Uint16x16,  base: "uint",  elemBits: 128, bits: 256, lanes: 16}
    81    - {class: vreg, go: Int32x8,    base: "int",   elemBits: 128, bits: 256, lanes: 8}
    82    - {class: vreg, go: Uint32x8,   base: "uint",  elemBits: 128, bits: 256, lanes: 8}
    83    - {class: vreg, go: Int64x4,    base: "int",   elemBits: 128, bits: 256, lanes: 4}
    84    - {class: vreg, go: Uint64x4,   base: "uint",  elemBits: 128, bits: 256, lanes: 4}
    85  
    86  # Special shapes just to make VAES(ENC|DEC)(LAST)?512 work.
    87  # The elemBits field of these shapes are wrong, it would be overwritten by overwriteElemBits.
    88    - {class: vreg, go: Int8x32,    base: "int",   elemBits: 128, bits: 512, lanes: 32}
    89    - {class: vreg, go: Uint8x32,   base: "uint",  elemBits: 128, bits: 512, lanes: 32}
    90    - {class: vreg, go: Int16x16,   base: "int",   elemBits: 128, bits: 512, lanes: 16}
    91    - {class: vreg, go: Uint16x16,  base: "uint",  elemBits: 128, bits: 512, lanes: 16}
    92    - {class: vreg, go: Int32x8,    base: "int",   elemBits: 128, bits: 512, lanes: 8}
    93    - {class: vreg, go: Uint32x8,   base: "uint",  elemBits: 128, bits: 512, lanes: 8}
    94    - {class: vreg, go: Int64x4,    base: "int",   elemBits: 128, bits: 512, lanes: 4}
    95    - {class: vreg, go: Uint64x4,   base: "uint",  elemBits: 128, bits: 512, lanes: 4}
    96  
    97    - {class: immediate, go: Immediate} # TODO: we only support imms that are not used as value -- usually as instruction semantic predicate like VPCMP as of now.
    98  inVariant: !repeat
    99  - *types
   100  out: !repeat
   101  - *types
   102  

View as plain text