Index: llvm/trunk/lib/Target/AMDGPU/MIMGInstructions.td =================================================================== --- llvm/trunk/lib/Target/AMDGPU/MIMGInstructions.td +++ llvm/trunk/lib/Target/AMDGPU/MIMGInstructions.td @@ -53,27 +53,27 @@ RegisterClass dst_rc, int channels, bit d16_bit, string suffix> { - def _V1 # suffix : MIMG_NoSampler_Helper , - MIMG_Mask; - def _V2 # suffix : MIMG_NoSampler_Helper , - MIMG_Mask; - def _V4 # suffix : MIMG_NoSampler_Helper , - MIMG_Mask; + def NAME # _V1 # suffix : MIMG_NoSampler_Helper , + MIMG_Mask; + def NAME # _V2 # suffix : MIMG_NoSampler_Helper , + MIMG_Mask; + def NAME # _V4 # suffix : MIMG_NoSampler_Helper , + MIMG_Mask; } multiclass MIMG_NoSampler_Src_Helper op, string asm, RegisterClass dst_rc, int channels> { - defm : MIMG_NoSampler_Src_Helper_Helper ; + defm NAME : MIMG_NoSampler_Src_Helper_Helper ; let d16 = 1 in { let SubtargetPredicate = HasPackedD16VMem in { - defm : MIMG_NoSampler_Src_Helper_Helper ; + defm NAME : MIMG_NoSampler_Src_Helper_Helper ; } // End HasPackedD16VMem. let SubtargetPredicate = HasUnpackedD16VMem, DecoderNamespace = "GFX80_UNPACKED" in { - defm : MIMG_NoSampler_Src_Helper_Helper ; + defm NAME : MIMG_NoSampler_Src_Helper_Helper ; } // End HasUnpackedD16VMem. } // End d16 = 1. } @@ -85,6 +85,13 @@ defm _V4 : MIMG_NoSampler_Src_Helper ; } +multiclass MIMG_PckNoSampler op, string asm> { + defm NAME # _V1 : MIMG_NoSampler_Src_Helper_Helper ; + defm NAME # _V2 : MIMG_NoSampler_Src_Helper_Helper ; + defm NAME # _V3 : MIMG_NoSampler_Src_Helper_Helper ; + defm NAME # _V4 : MIMG_NoSampler_Src_Helper_Helper ; +} + class MIMG_Store_Helper op, string asm, RegisterClass data_rc, RegisterClass addr_rc, @@ -108,27 +115,27 @@ RegisterClass data_rc, int channels, bit d16_bit, string suffix> { - def _V1 # suffix : MIMG_Store_Helper , - MIMG_Mask; - def _V2 # suffix : MIMG_Store_Helper , - MIMG_Mask; - def _V4 # suffix : MIMG_Store_Helper , - MIMG_Mask; + def NAME # _V1 # suffix : MIMG_Store_Helper , + MIMG_Mask; + def NAME # _V2 # suffix : MIMG_Store_Helper , + MIMG_Mask; + def NAME # _V4 # suffix : MIMG_Store_Helper , + MIMG_Mask; } multiclass MIMG_Store_Addr_Helper op, string asm, RegisterClass data_rc, int channels> { - defm : MIMG_Store_Addr_Helper_Helper ; + defm NAME : MIMG_Store_Addr_Helper_Helper ; let d16 = 1 in { let SubtargetPredicate = HasPackedD16VMem in { - defm : MIMG_Store_Addr_Helper_Helper ; + defm NAME : MIMG_Store_Addr_Helper_Helper ; } // End HasPackedD16VMem. let SubtargetPredicate = HasUnpackedD16VMem, DecoderNamespace = "GFX80_UNPACKED" in { - defm : MIMG_Store_Addr_Helper_Helper ; + defm NAME : MIMG_Store_Addr_Helper_Helper ; } // End HasUnpackedD16VMem. } // End d16 = 1. } @@ -140,6 +147,13 @@ defm _V4 : MIMG_Store_Addr_Helper ; } +multiclass MIMG_PckStore op, string asm> { + defm NAME # _V1 : MIMG_Store_Addr_Helper_Helper ; + defm NAME # _V2 : MIMG_Store_Addr_Helper_Helper ; + defm NAME # _V3 : MIMG_Store_Addr_Helper_Helper ; + defm NAME # _V4 : MIMG_Store_Addr_Helper_Helper ; +} + class MIMG_Atomic_Helper : MIMG_Helper < @@ -347,14 +361,14 @@ let SubtargetPredicate = isGCN in { defm IMAGE_LOAD : MIMG_NoSampler <0x00000000, "image_load">; defm IMAGE_LOAD_MIP : MIMG_NoSampler <0x00000001, "image_load_mip">; -//def IMAGE_LOAD_PCK : MIMG_NoPattern_ <"image_load_pck", 0x00000002>; -//def IMAGE_LOAD_PCK_SGN : MIMG_NoPattern_ <"image_load_pck_sgn", 0x00000003>; -//def IMAGE_LOAD_MIP_PCK : MIMG_NoPattern_ <"image_load_mip_pck", 0x00000004>; -//def IMAGE_LOAD_MIP_PCK_SGN : MIMG_NoPattern_ <"image_load_mip_pck_sgn", 0x00000005>; +defm IMAGE_LOAD_PCK : MIMG_PckNoSampler <0x00000002, "image_load_pck">; +defm IMAGE_LOAD_PCK_SGN : MIMG_PckNoSampler <0x00000003, "image_load_pck_sgn">; +defm IMAGE_LOAD_MIP_PCK : MIMG_PckNoSampler <0x00000004, "image_load_mip_pck">; +defm IMAGE_LOAD_MIP_PCK_SGN : MIMG_PckNoSampler <0x00000005, "image_load_mip_pck_sgn">; defm IMAGE_STORE : MIMG_Store <0x00000008, "image_store">; defm IMAGE_STORE_MIP : MIMG_Store <0x00000009, "image_store_mip">; -//def IMAGE_STORE_PCK : MIMG_NoPattern_ <"image_store_pck", 0x0000000a>; -//def IMAGE_STORE_MIP_PCK : MIMG_NoPattern_ <"image_store_mip_pck", 0x0000000b>; +defm IMAGE_STORE_PCK : MIMG_PckStore <0x0000000a, "image_store_pck">; +defm IMAGE_STORE_MIP_PCK : MIMG_PckStore <0x0000000b, "image_store_mip_pck">; let mayLoad = 0, mayStore = 0 in { defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "image_get_resinfo">; Index: llvm/trunk/test/MC/AMDGPU/mimg.s =================================================================== --- llvm/trunk/test/MC/AMDGPU/mimg.s +++ llvm/trunk/test/MC/AMDGPU/mimg.s @@ -140,6 +140,47 @@ // GFX9: image_load v[5:7], v[1:4], s[8:15] dmask:0xf tfe d16 ; encoding: [0x00,0x0f,0x01,0xf0,0x01,0x05,0x02,0x80] //===----------------------------------------------------------------------===// +// Image Load/Store: PCK variants +//===----------------------------------------------------------------------===// + +image_load_mip_pck v5, v[1:4], s[8:15] dmask:0x1 +// GCN: image_load_mip_pck v5, v[1:4], s[8:15] dmask:0x1 ; encoding: [0x00,0x01,0x10,0xf0,0x01,0x05,0x02,0x00] + +image_load_mip_pck v[5:6], v[1:4], s[8:15] dmask:0x3 +// GCN: image_load_mip_pck v[5:6], v[1:4], s[8:15] dmask:0x3 ; encoding: [0x00,0x03,0x10,0xf0,0x01,0x05,0x02,0x00] + +image_load_mip_pck v[5:6], v[1:4], s[8:15] dmask:0x1 unorm glc slc tfe lwe da +// GCN: image_load_mip_pck v[5:6], v[1:4], s[8:15] dmask:0x1 unorm glc slc tfe lwe da ; encoding: [0x00,0x71,0x13,0xf2,0x01,0x05,0x02,0x00] + +image_load_mip_pck_sgn v[5:6], v[1:4], s[8:15] dmask:0x5 +// GCN: image_load_mip_pck_sgn v[5:6], v[1:4], s[8:15] dmask:0x5 ; encoding: [0x00,0x05,0x14,0xf0,0x01,0x05,0x02,0x00] + +image_load_pck v5, v[1:4], s[8:15] dmask:0x1 glc +// GCN: image_load_pck v5, v[1:4], s[8:15] dmask:0x1 glc ; encoding: [0x00,0x21,0x08,0xf0,0x01,0x05,0x02,0x00] + +image_load_pck_sgn v5, v[1:4], s[8:15] dmask:0x1 lwe +// GCN: image_load_pck_sgn v5, v[1:4], s[8:15] dmask:0x1 lwe ; encoding: [0x00,0x01,0x0e,0xf0,0x01,0x05,0x02,0x00] + +image_load_mip_pck v5, v[1:4], s[8:15] dmask:0x1 d16 +// NOSICI: error: invalid operand for instruction +// NOVI: error: invalid operand for instruction +// NOGFX9: error: invalid operand for instruction + +image_store_mip_pck v252, v[2:5], s[12:19] dmask:0x1 unorm +// GCN: image_store_mip_pck v252, v[2:5], s[12:19] dmask:0x1 unorm ; encoding: [0x00,0x11,0x2c,0xf0,0x02,0xfc,0x03,0x00] + +image_store_mip_pck v1, v[2:5], s[12:19] dmask:0x1 unorm glc slc lwe da +// GCN: image_store_mip_pck v1, v[2:5], s[12:19] dmask:0x1 unorm glc slc lwe da ; encoding: [0x00,0x71,0x2e,0xf2,0x02,0x01,0x03,0x00] + +image_store_pck v1, v[2:5], s[12:19] dmask:0x1 unorm da +// GCN: image_store_pck v1, v[2:5], s[12:19] dmask:0x1 unorm da ; encoding: [0x00,0x51,0x28,0xf0,0x02,0x01,0x03,0x00] + +image_store_mip_pck v252, v[2:5], s[12:19] dmask:0x1 d16 +// NOSICI: error: invalid operand for instruction +// NOVI: error: invalid operand for instruction +// NOGFX9: error: invalid operand for instruction + +//===----------------------------------------------------------------------===// // Image Sample //===----------------------------------------------------------------------===// Index: llvm/trunk/test/MC/Disassembler/AMDGPU/mimg_vi.txt =================================================================== --- llvm/trunk/test/MC/Disassembler/AMDGPU/mimg_vi.txt +++ llvm/trunk/test/MC/Disassembler/AMDGPU/mimg_vi.txt @@ -78,6 +78,34 @@ 0x00,0x0f,0x20,0xf0,0x04,0x00,0x02,0x80 #===------------------------------------------------------------------------===# +# Image load/store: PCK variants +#===------------------------------------------------------------------------===# + +# VI: image_load_mip_pck v5, v1, s[8:15] dmask:0x1 ; encoding: [0x00,0x01,0x10,0xf0,0x01,0x05,0x02,0x00] +0x00,0x01,0x10,0xf0,0x01,0x05,0x02,0x00 + +# VI: image_load_mip_pck v[5:6], v1, s[8:15] dmask:0x3 ; encoding: [0x00,0x03,0x10,0xf0,0x01,0x05,0x02,0x00] +0x00,0x03,0x10,0xf0,0x01,0x05,0x02,0x00 + +# VI: image_load_mip_pck_sgn v[5:6], v1, s[8:15] dmask:0x5 ; encoding: [0x00,0x05,0x14,0xf0,0x01,0x05,0x02,0x00] +0x00,0x05,0x14,0xf0,0x01,0x05,0x02,0x00 + +# VI: image_load_pck v5, v1, s[8:15] dmask:0x1 glc ; encoding: [0x00,0x21,0x08,0xf0,0x01,0x05,0x02,0x00] +0x00,0x21,0x08,0xf0,0x01,0x05,0x02,0x00 + +# VI: image_load_pck_sgn v5, v1, s[8:15] dmask:0x1 lwe ; encoding: [0x00,0x01,0x0e,0xf0,0x01,0x05,0x02,0x00] +0x00,0x01,0x0e,0xf0,0x01,0x05,0x02,0x00 + +# VI: image_store_mip_pck v252, v2, s[12:19] dmask:0x1 unorm ; encoding: [0x00,0x11,0x2c,0xf0,0x02,0xfc,0x03,0x00] +0x00,0x11,0x2c,0xf0,0x02,0xfc,0x03,0x00 + +# VI: image_store_mip_pck v1, v2, s[12:19] dmask:0x1 unorm glc slc lwe da ; encoding: [0x00,0x71,0x2e,0xf2,0x02,0x01,0x03,0x00] +0x00,0x71,0x2e,0xf2,0x02,0x01,0x03,0x00 + +# VI: image_store_pck v1, v2, s[12:19] dmask:0x1 unorm da ; encoding: [0x00,0x51,0x28,0xf0,0x02,0x01,0x03,0x00] +0x00,0x51,0x28,0xf0,0x02,0x01,0x03,0x00 + +#===------------------------------------------------------------------------===# # Image sample #===------------------------------------------------------------------------===#