# 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} # Special shapes just to make VAES(ENC|DEC)(LAST)?512 work. # The elemBits field of these shapes are wrong, it would be overwritten by overwriteElemBits. - {class: vreg, go: Int8x32, base: "int", elemBits: 128, bits: 512, lanes: 32} - {class: vreg, go: Uint8x32, base: "uint", elemBits: 128, bits: 512, lanes: 32} - {class: vreg, go: Int16x16, base: "int", elemBits: 128, bits: 512, lanes: 16} - {class: vreg, go: Uint16x16, base: "uint", elemBits: 128, bits: 512, lanes: 16} - {class: vreg, go: Int32x8, base: "int", elemBits: 128, bits: 512, lanes: 8} - {class: vreg, go: Uint32x8, base: "uint", elemBits: 128, bits: 512, lanes: 8} - {class: vreg, go: Int64x4, base: "int", elemBits: 128, bits: 512, lanes: 4} - {class: vreg, go: Uint64x4, base: "uint", elemBits: 128, bits: 512, 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. inVariant: !repeat - *types out: !repeat - *types