blob: 17f5be559915e97084e47fd199cafbf17cbfe2d0 [file]
# 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