| # This file defines the possible types of each operand and result. |
| # |
| # In general, we're able to narrow this down on some attributes directly from |
| # the machine instruction descriptions, but the Go mappings need to further |
| # constrain them and how they relate. For example, on x86 we can't distinguish |
| # int and uint, though we can distinguish these from float. |
| |
| in: !repeat |
| - !sum &types |
| - {class: vreg, go: Int8x16, base: "int", elemBits: 8, bits: 128, lanes: 16} |
| - {class: vreg, go: Uint8x16, base: "uint", elemBits: 8, bits: 128, lanes: 16} |
| - {class: vreg, go: Int16x8, base: "int", elemBits: 16, bits: 128, lanes: 8} |
| - {class: vreg, go: Uint16x8, base: "uint", elemBits: 16, bits: 128, lanes: 8} |
| - {class: vreg, go: Int32x4, base: "int", elemBits: 32, bits: 128, lanes: 4} |
| - {class: vreg, go: Uint32x4, base: "uint", elemBits: 32, bits: 128, lanes: 4} |
| - {class: vreg, go: Int64x2, base: "int", elemBits: 64, bits: 128, lanes: 2} |
| - {class: vreg, go: Uint64x2, base: "uint", elemBits: 64, bits: 128, lanes: 2} |
| - {class: vreg, go: Float32x4, base: "float", elemBits: 32, bits: 128, lanes: 4} |
| - {class: vreg, go: Float64x2, base: "float", elemBits: 64, bits: 128, lanes: 2} |
| - {class: vreg, go: Int8x32, base: "int", elemBits: 8, bits: 256, lanes: 32} |
| - {class: vreg, go: Uint8x32, base: "uint", elemBits: 8, bits: 256, lanes: 32} |
| - {class: vreg, go: Int16x16, base: "int", elemBits: 16, bits: 256, lanes: 16} |
| - {class: vreg, go: Uint16x16, base: "uint", elemBits: 16, bits: 256, lanes: 16} |
| - {class: vreg, go: Int32x8, base: "int", elemBits: 32, bits: 256, lanes: 8} |
| - {class: vreg, go: Uint32x8, base: "uint", elemBits: 32, bits: 256, lanes: 8} |
| - {class: vreg, go: Int64x4, base: "int", elemBits: 64, bits: 256, lanes: 4} |
| - {class: vreg, go: Uint64x4, base: "uint", elemBits: 64, bits: 256, lanes: 4} |
| - {class: vreg, go: Float32x8, base: "float", elemBits: 32, bits: 256, lanes: 8} |
| - {class: vreg, go: Float64x4, base: "float", elemBits: 64, bits: 256, lanes: 4} |
| - {class: vreg, go: Int8x64, base: "int", elemBits: 8, bits: 512, lanes: 64} |
| - {class: vreg, go: Uint8x64, base: "uint", elemBits: 8, bits: 512, lanes: 64} |
| - {class: vreg, go: Int16x32, base: "int", elemBits: 16, bits: 512, lanes: 32} |
| - {class: vreg, go: Uint16x32, base: "uint", elemBits: 16, bits: 512, lanes: 32} |
| - {class: vreg, go: Int32x16, base: "int", elemBits: 32, bits: 512, lanes: 16} |
| - {class: vreg, go: Uint32x16, base: "uint", elemBits: 32, bits: 512, lanes: 16} |
| - {class: vreg, go: Int64x8, base: "int", elemBits: 64, bits: 512, lanes: 8} |
| - {class: vreg, go: Uint64x8, base: "uint", elemBits: 64, bits: 512, lanes: 8} |
| - {class: vreg, go: Float32x16, base: "float", elemBits: 32, bits: 512, lanes: 16} |
| - {class: vreg, go: Float64x8, base: "float", elemBits: 64, bits: 512, lanes: 8} |
| - {class: mask, go: Mask8x16, base: "int", elemBits: 8, bits: 128, lanes: 16} |
| - {class: mask, go: Mask16x8, base: "int", elemBits: 16, bits: 128, lanes: 8} |
| - {class: mask, go: Mask32x4, base: "int", elemBits: 32, bits: 128, lanes: 4} |
| - {class: mask, go: Mask64x2, base: "int", elemBits: 64, bits: 128, lanes: 2} |
| - {class: mask, go: Mask8x32, base: "int", elemBits: 8, bits: 256, lanes: 32} |
| - {class: mask, go: Mask16x16, base: "int", elemBits: 16, bits: 256, lanes: 16} |
| - {class: mask, go: Mask32x8, base: "int", elemBits: 32, bits: 256, lanes: 8} |
| - {class: mask, go: Mask64x4, base: "int", elemBits: 64, bits: 256, lanes: 4} |
| - {class: mask, go: Mask8x64, base: "int", elemBits: 8, bits: 512, lanes: 64} |
| - {class: mask, go: Mask16x32, base: "int", elemBits: 16, bits: 512, lanes: 32} |
| - {class: mask, go: Mask32x16, base: "int", elemBits: 32, bits: 512, lanes: 16} |
| - {class: mask, go: Mask64x8, base: "int", elemBits: 64, bits: 512, lanes: 8} |
| |
| |
| - {class: greg, go: float64, base: "float", bits: 64, lanes: 1} |
| - {class: greg, go: float32, base: "float", bits: 32, lanes: 1} |
| - {class: greg, go: int64, base: "int", bits: 64, lanes: 1} |
| - {class: greg, go: int32, base: "int", bits: 32, lanes: 1} |
| - {class: greg, go: int16, base: "int", bits: 16, lanes: 1} |
| - {class: greg, go: int8, base: "int", bits: 8, lanes: 1} |
| - {class: greg, go: uint64, base: "uint", bits: 64, lanes: 1} |
| - {class: greg, go: uint32, base: "uint", bits: 32, lanes: 1} |
| - {class: greg, go: uint16, base: "uint", bits: 16, lanes: 1} |
| - {class: greg, go: uint8, base: "uint", bits: 8, lanes: 1} |
| |
| # Special shapes just to make INSERT[IF]128 work. |
| # The elemBits field of these shapes are wrong, it would be overwritten by overwriteElemBits. |
| - {class: vreg, go: Int8x16, base: "int", elemBits: 128, bits: 128, lanes: 16} |
| - {class: vreg, go: Uint8x16, base: "uint", elemBits: 128, bits: 128, lanes: 16} |
| - {class: vreg, go: Int16x8, base: "int", elemBits: 128, bits: 128, lanes: 8} |
| - {class: vreg, go: Uint16x8, base: "uint", elemBits: 128, bits: 128, lanes: 8} |
| - {class: vreg, go: Int32x4, base: "int", elemBits: 128, bits: 128, lanes: 4} |
| - {class: vreg, go: Uint32x4, base: "uint", elemBits: 128, bits: 128, lanes: 4} |
| - {class: vreg, go: Int64x2, base: "int", elemBits: 128, bits: 128, lanes: 2} |
| - {class: vreg, go: Uint64x2, base: "uint", elemBits: 128, bits: 128, lanes: 2} |
| |
| - {class: vreg, go: Int8x32, base: "int", elemBits: 128, bits: 256, lanes: 32} |
| - {class: vreg, go: Uint8x32, base: "uint", elemBits: 128, bits: 256, lanes: 32} |
| - {class: vreg, go: Int16x16, base: "int", elemBits: 128, bits: 256, lanes: 16} |
| - {class: vreg, go: Uint16x16, base: "uint", elemBits: 128, bits: 256, lanes: 16} |
| - {class: vreg, go: Int32x8, base: "int", elemBits: 128, bits: 256, lanes: 8} |
| - {class: vreg, go: Uint32x8, base: "uint", elemBits: 128, bits: 256, lanes: 8} |
| - {class: vreg, go: Int64x4, base: "int", elemBits: 128, bits: 256, lanes: 4} |
| - {class: vreg, go: Uint64x4, base: "uint", elemBits: 128, bits: 256, lanes: 4} |
| |
| - {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. |
| out: !repeat |
| - *types |