[Mesa-dev] [PATCH 2/2] R600/SI: add sample and image intrinsics exposing all instruction fields

Tom Stellard tom at stellard.net
Fri Jul 4 11:17:37 PDT 2014


On Fri, Jul 04, 2014 at 07:23:13PM +0200, Marek Olšák wrote:
> Yeah, I can change that. I have never liked v*i8 types anyway.
> 
> However, the gather intrinsics already use v*i8. I will have to break
> them if we want to use v*i32 everywhere.
> 

For intrinsics that are used in a released version of Mesa/LLVM, that
we can't change, we can add a pass to rewrite the types.  We already do
this for some intrinsics.  

-Tom

> Marek
> 
> On Fri, Jul 4, 2014 at 6:45 PM, Tom Stellard <tom at stellard.net> wrote:
> > On Thu, Jul 03, 2014 at 06:26:05PM +0200, Marek Olšák wrote:
> >> From: Marek Olšák <marek.olsak at amd.com>
> >>
> >> We need the intrinsics with offsets, so why not just add them all.
> >> The R128 parameter will also be useful for reducing SGPR usage.
> >> GL_ARB_image_load_store also adds some image GLSL modifiers like "coherent",
> >> so Mesa will probably translate those to slc, glc, etc.
> >>
> >> When LLVM 3.5 is released, I'll switch Mesa to these new intrinsics.
> >> ---
> >>  lib/Target/R600/SIInstructions.td           | 159 +++++++++++----
> >>  lib/Target/R600/SIIntrinsics.td             |  81 +++++++-
> >>  test/CodeGen/R600/llvm.SI.image.ll          |  49 +++++
> >>  test/CodeGen/R600/llvm.SI.image.sample.ll   | 289 ++++++++++++++++++++++++++++
> >>  test/CodeGen/R600/llvm.SI.image.sample.o.ll | 289 ++++++++++++++++++++++++++++
> >>  5 files changed, 819 insertions(+), 48 deletions(-)
> >>  create mode 100644 test/CodeGen/R600/llvm.SI.image.ll
> >>  create mode 100644 test/CodeGen/R600/llvm.SI.image.sample.ll
> >>  create mode 100644 test/CodeGen/R600/llvm.SI.image.sample.o.ll
> >>
> >> diff --git a/lib/Target/R600/SIInstructions.td b/lib/Target/R600/SIInstructions.td
> >> index 291d634..25a9362 100644
> >> --- a/lib/Target/R600/SIInstructions.td
> >> +++ b/lib/Target/R600/SIInstructions.td
> >> @@ -969,38 +969,38 @@ defm IMAGE_GET_RESINFO : MIMG_NoSampler <0x0000000e, "IMAGE_GET_RESINFO">;
> >>  //def IMAGE_ATOMIC_FCMPSWAP : MIMG_NoPattern_ <"IMAGE_ATOMIC_FCMPSWAP", 0x0000001d>;
> >>  //def IMAGE_ATOMIC_FMIN : MIMG_NoPattern_ <"IMAGE_ATOMIC_FMIN", 0x0000001e>;
> >>  //def IMAGE_ATOMIC_FMAX : MIMG_NoPattern_ <"IMAGE_ATOMIC_FMAX", 0x0000001f>;
> >> -defm IMAGE_SAMPLE : MIMG_Sampler <0x00000020, "IMAGE_SAMPLE">;
> >> -//def IMAGE_SAMPLE_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_CL", 0x00000021>;
> >> -defm IMAGE_SAMPLE_D : MIMG_Sampler <0x00000022, "IMAGE_SAMPLE_D">;
> >> -//def IMAGE_SAMPLE_D_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_D_CL", 0x00000023>;
> >> -defm IMAGE_SAMPLE_L : MIMG_Sampler <0x00000024, "IMAGE_SAMPLE_L">;
> >> -defm IMAGE_SAMPLE_B : MIMG_Sampler <0x00000025, "IMAGE_SAMPLE_B">;
> >> -//def IMAGE_SAMPLE_B_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_B_CL", 0x00000026>;
> >> -//def IMAGE_SAMPLE_LZ : MIMG_NoPattern_ <"IMAGE_SAMPLE_LZ", 0x00000027>;
> >> -defm IMAGE_SAMPLE_C : MIMG_Sampler <0x00000028, "IMAGE_SAMPLE_C">;
> >> -//def IMAGE_SAMPLE_C_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_CL", 0x00000029>;
> >> -defm IMAGE_SAMPLE_C_D : MIMG_Sampler <0x0000002a, "IMAGE_SAMPLE_C_D">;
> >> -//def IMAGE_SAMPLE_C_D_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_D_CL", 0x0000002b>;
> >> -defm IMAGE_SAMPLE_C_L : MIMG_Sampler <0x0000002c, "IMAGE_SAMPLE_C_L">;
> >> -defm IMAGE_SAMPLE_C_B : MIMG_Sampler <0x0000002d, "IMAGE_SAMPLE_C_B">;
> >> -//def IMAGE_SAMPLE_C_B_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_B_CL", 0x0000002e>;
> >> -//def IMAGE_SAMPLE_C_LZ : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_LZ", 0x0000002f>;
> >> -//def IMAGE_SAMPLE_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_O", 0x00000030>;
> >> -//def IMAGE_SAMPLE_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_CL_O", 0x00000031>;
> >> -//def IMAGE_SAMPLE_D_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_D_O", 0x00000032>;
> >> -//def IMAGE_SAMPLE_D_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_D_CL_O", 0x00000033>;
> >> -//def IMAGE_SAMPLE_L_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_L_O", 0x00000034>;
> >> -//def IMAGE_SAMPLE_B_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_B_O", 0x00000035>;
> >> -//def IMAGE_SAMPLE_B_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_B_CL_O", 0x00000036>;
> >> -//def IMAGE_SAMPLE_LZ_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_LZ_O", 0x00000037>;
> >> -//def IMAGE_SAMPLE_C_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_O", 0x00000038>;
> >> -//def IMAGE_SAMPLE_C_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_CL_O", 0x00000039>;
> >> -//def IMAGE_SAMPLE_C_D_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_D_O", 0x0000003a>;
> >> -//def IMAGE_SAMPLE_C_D_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_D_CL_O", 0x0000003b>;
> >> -//def IMAGE_SAMPLE_C_L_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_L_O", 0x0000003c>;
> >> -//def IMAGE_SAMPLE_C_B_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_B_O", 0x0000003d>;
> >> -//def IMAGE_SAMPLE_C_B_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_B_CL_O", 0x0000003e>;
> >> -//def IMAGE_SAMPLE_C_LZ_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_LZ_O", 0x0000003f>;
> >> +defm IMAGE_SAMPLE           : MIMG_Sampler <0x00000020, "IMAGE_SAMPLE">;
> >> +defm IMAGE_SAMPLE_CL        : MIMG_Sampler <0x00000021, "IMAGE_SAMPLE_CL">;
> >> +defm IMAGE_SAMPLE_D         : MIMG_Sampler <0x00000022, "IMAGE_SAMPLE_D">;
> >> +defm IMAGE_SAMPLE_D_CL      : MIMG_Sampler <0x00000023, "IMAGE_SAMPLE_D_CL">;
> >> +defm IMAGE_SAMPLE_L         : MIMG_Sampler <0x00000024, "IMAGE_SAMPLE_L">;
> >> +defm IMAGE_SAMPLE_B         : MIMG_Sampler <0x00000025, "IMAGE_SAMPLE_B">;
> >> +defm IMAGE_SAMPLE_B_CL      : MIMG_Sampler <0x00000026, "IMAGE_SAMPLE_B_CL">;
> >> +defm IMAGE_SAMPLE_LZ        : MIMG_Sampler <0x00000027, "IMAGE_SAMPLE_LZ">;
> >> +defm IMAGE_SAMPLE_C         : MIMG_Sampler <0x00000028, "IMAGE_SAMPLE_C">;
> >> +defm IMAGE_SAMPLE_C_CL      : MIMG_Sampler <0x00000029, "IMAGE_SAMPLE_C_CL">;
> >> +defm IMAGE_SAMPLE_C_D       : MIMG_Sampler <0x0000002a, "IMAGE_SAMPLE_C_D">;
> >> +defm IMAGE_SAMPLE_C_D_CL    : MIMG_Sampler <0x0000002b, "IMAGE_SAMPLE_C_D_CL">;
> >> +defm IMAGE_SAMPLE_C_L       : MIMG_Sampler <0x0000002c, "IMAGE_SAMPLE_C_L">;
> >> +defm IMAGE_SAMPLE_C_B       : MIMG_Sampler <0x0000002d, "IMAGE_SAMPLE_C_B">;
> >> +defm IMAGE_SAMPLE_C_B_CL    : MIMG_Sampler <0x0000002e, "IMAGE_SAMPLE_C_B_CL">;
> >> +defm IMAGE_SAMPLE_C_LZ      : MIMG_Sampler <0x0000002f, "IMAGE_SAMPLE_C_LZ">;
> >> +defm IMAGE_SAMPLE_O         : MIMG_Sampler <0x00000030, "IMAGE_SAMPLE_O">;
> >> +defm IMAGE_SAMPLE_CL_O      : MIMG_Sampler <0x00000031, "IMAGE_SAMPLE_CL_O">;
> >> +defm IMAGE_SAMPLE_D_O       : MIMG_Sampler <0x00000032, "IMAGE_SAMPLE_D_O">;
> >> +defm IMAGE_SAMPLE_D_CL_O    : MIMG_Sampler <0x00000033, "IMAGE_SAMPLE_D_CL_O">;
> >> +defm IMAGE_SAMPLE_L_O       : MIMG_Sampler <0x00000034, "IMAGE_SAMPLE_L_O">;
> >> +defm IMAGE_SAMPLE_B_O       : MIMG_Sampler <0x00000035, "IMAGE_SAMPLE_B_O">;
> >> +defm IMAGE_SAMPLE_B_CL_O    : MIMG_Sampler <0x00000036, "IMAGE_SAMPLE_B_CL_O">;
> >> +defm IMAGE_SAMPLE_LZ_O      : MIMG_Sampler <0x00000037, "IMAGE_SAMPLE_LZ_O">;
> >> +defm IMAGE_SAMPLE_C_O       : MIMG_Sampler <0x00000038, "IMAGE_SAMPLE_C_O">;
> >> +defm IMAGE_SAMPLE_C_CL_O    : MIMG_Sampler <0x00000039, "IMAGE_SAMPLE_C_CL_O">;
> >> +defm IMAGE_SAMPLE_C_D_O     : MIMG_Sampler <0x0000003a, "IMAGE_SAMPLE_C_D_O">;
> >> +defm IMAGE_SAMPLE_C_D_CL_O  : MIMG_Sampler <0x0000003b, "IMAGE_SAMPLE_C_D_CL_O">;
> >> +defm IMAGE_SAMPLE_C_L_O     : MIMG_Sampler <0x0000003c, "IMAGE_SAMPLE_C_L_O">;
> >> +defm IMAGE_SAMPLE_C_B_O     : MIMG_Sampler <0x0000003d, "IMAGE_SAMPLE_C_B_O">;
> >> +defm IMAGE_SAMPLE_C_B_CL_O  : MIMG_Sampler <0x0000003e, "IMAGE_SAMPLE_C_B_CL_O">;
> >> +defm IMAGE_SAMPLE_C_LZ_O    : MIMG_Sampler <0x0000003f, "IMAGE_SAMPLE_C_LZ_O">;
> >>  defm IMAGE_GATHER4          : MIMG_Gather <0x00000040, "IMAGE_GATHER4">;
> >>  defm IMAGE_GATHER4_CL       : MIMG_Gather <0x00000041, "IMAGE_GATHER4_CL">;
> >>  defm IMAGE_GATHER4_L        : MIMG_Gather <0x00000044, "IMAGE_GATHER4_L">;
> >> @@ -1025,15 +1025,15 @@ defm IMAGE_GATHER4_C_L_O    : MIMG_Gather <0x0000005c, "IMAGE_GATHER4_C_L_O">;
> >>  defm IMAGE_GATHER4_C_B_O    : MIMG_Gather <0x0000005d, "IMAGE_GATHER4_C_B_O">;
> >>  defm IMAGE_GATHER4_C_B_CL_O : MIMG_Gather <0x0000005e, "IMAGE_GATHER4_C_B_CL_O">;
> >>  defm IMAGE_GATHER4_C_LZ_O   : MIMG_Gather <0x0000005f, "IMAGE_GATHER4_C_LZ_O">;
> >> -defm IMAGE_GET_LOD : MIMG_Sampler <0x00000060, "IMAGE_GET_LOD">;
> >> -//def IMAGE_SAMPLE_CD : MIMG_NoPattern_ <"IMAGE_SAMPLE_CD", 0x00000068>;
> >> -//def IMAGE_SAMPLE_CD_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_CD_CL", 0x00000069>;
> >> -//def IMAGE_SAMPLE_C_CD : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_CD", 0x0000006a>;
> >> -//def IMAGE_SAMPLE_C_CD_CL : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_CD_CL", 0x0000006b>;
> >> -//def IMAGE_SAMPLE_CD_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_CD_O", 0x0000006c>;
> >> -//def IMAGE_SAMPLE_CD_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_CD_CL_O", 0x0000006d>;
> >> -//def IMAGE_SAMPLE_C_CD_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_CD_O", 0x0000006e>;
> >> -//def IMAGE_SAMPLE_C_CD_CL_O : MIMG_NoPattern_ <"IMAGE_SAMPLE_C_CD_CL_O", 0x0000006f>;
> >> +defm IMAGE_GET_LOD          : MIMG_Sampler <0x00000060, "IMAGE_GET_LOD">;
> >> +defm IMAGE_SAMPLE_CD        : MIMG_Sampler <0x00000068, "IMAGE_SAMPLE_CD">;
> >> +defm IMAGE_SAMPLE_CD_CL     : MIMG_Sampler <0x00000069, "IMAGE_SAMPLE_CD_CL">;
> >> +defm IMAGE_SAMPLE_C_CD      : MIMG_Sampler <0x0000006a, "IMAGE_SAMPLE_C_CD">;
> >> +defm IMAGE_SAMPLE_C_CD_CL   : MIMG_Sampler <0x0000006b, "IMAGE_SAMPLE_C_CD_CL">;
> >> +defm IMAGE_SAMPLE_CD_O      : MIMG_Sampler <0x0000006c, "IMAGE_SAMPLE_CD_O">;
> >> +defm IMAGE_SAMPLE_CD_CL_O   : MIMG_Sampler <0x0000006d, "IMAGE_SAMPLE_CD_CL_O">;
> >> +defm IMAGE_SAMPLE_C_CD_O    : MIMG_Sampler <0x0000006e, "IMAGE_SAMPLE_C_CD_O">;
> >> +defm IMAGE_SAMPLE_C_CD_CL_O : MIMG_Sampler <0x0000006f, "IMAGE_SAMPLE_C_CD_CL_O">;
> >>  //def IMAGE_RSRC256 : MIMG_NoPattern_RSRC256 <"IMAGE_RSRC256", 0x0000007e>;
> >>  //def IMAGE_SAMPLER : MIMG_NoPattern_ <"IMAGE_SAMPLER", 0x0000007f>;
> >>
> >> @@ -1849,6 +1849,7 @@ def : Pat <
> >>  /********** Image sampling patterns **********/
> >>  /********** ======================= **********/
> >>
> >> +// Image + sampler
> >>  class SampleRawPattern<SDPatternOperator name, MIMG opcode, ValueType vt> : Pat <
> >>    (name vt:$addr, v32i8:$rsrc, v16i8:$sampler, i32:$dmask, i32:$unorm,
> >>          i32:$r128, i32:$da, i32:$glc, i32:$slc, i32:$tfe, i32:$lwe),
> >> @@ -1857,6 +1858,78 @@ class SampleRawPattern<SDPatternOperator name, MIMG opcode, ValueType vt> : Pat
> >>            $addr, $rsrc, $sampler)
> >>  >;
> >>
> >> +multiclass SampleRawPatterns<SDPatternOperator name, string opcode> {
> >> +  def : SampleRawPattern<name, !cast<MIMG>(opcode # _V4_V1), i32>;
> >> +  def : SampleRawPattern<name, !cast<MIMG>(opcode # _V4_V2), v2i32>;
> >> +  def : SampleRawPattern<name, !cast<MIMG>(opcode # _V4_V4), v4i32>;
> >> +  def : SampleRawPattern<name, !cast<MIMG>(opcode # _V4_V8), v8i32>;
> >> +  def : SampleRawPattern<name, !cast<MIMG>(opcode # _V4_V16), v16i32>;
> >> +}
> >> +
> >> +// Image only
> >> +class ImagePattern<SDPatternOperator name, MIMG opcode, ValueType vt> : Pat <
> >> +  (name vt:$addr, v32i8:$rsrc, i32:$dmask, i32:$unorm,
> >> +        i32:$r128, i32:$da, i32:$glc, i32:$slc, i32:$tfe, i32:$lwe),
> >> +  (opcode (as_i32imm $dmask), (as_i1imm $unorm), (as_i1imm $glc), (as_i1imm $da),
> >> +          (as_i1imm $r128), (as_i1imm $tfe), (as_i1imm $lwe), (as_i1imm $slc),
> >> +          $addr, $rsrc)
> >> +>;
> >> +
> >> +multiclass ImagePatterns<SDPatternOperator name, string opcode> {
> >> +  def : ImagePattern<name, !cast<MIMG>(opcode # _V4_V1), i32>;
> >> +  def : ImagePattern<name, !cast<MIMG>(opcode # _V4_V2), v2i32>;
> >> +  def : ImagePattern<name, !cast<MIMG>(opcode # _V4_V4), v4i32>;
> >> +}
> >> +
> >> +// Basic sample
> >> +defm : SampleRawPatterns<int_SI_image_sample,           "IMAGE_SAMPLE">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_cl,        "IMAGE_SAMPLE_CL">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_d,         "IMAGE_SAMPLE_D">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_d_cl,      "IMAGE_SAMPLE_D_CL">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_l,         "IMAGE_SAMPLE_L">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_b,         "IMAGE_SAMPLE_B">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_b_cl,      "IMAGE_SAMPLE_B_CL">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_lz,        "IMAGE_SAMPLE_LZ">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_cd,        "IMAGE_SAMPLE_CD">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_cd_cl,     "IMAGE_SAMPLE_CD_CL">;
> >> +
> >> +// Sample with comparison
> >> +defm : SampleRawPatterns<int_SI_image_sample_c,         "IMAGE_SAMPLE_C">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_cl,      "IMAGE_SAMPLE_C_CL">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_d,       "IMAGE_SAMPLE_C_D">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_d_cl,    "IMAGE_SAMPLE_C_D_CL">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_l,       "IMAGE_SAMPLE_C_L">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_b,       "IMAGE_SAMPLE_C_B">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_b_cl,    "IMAGE_SAMPLE_C_B_CL">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_lz,      "IMAGE_SAMPLE_C_LZ">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_cd,      "IMAGE_SAMPLE_C_CD">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_cd_cl,   "IMAGE_SAMPLE_C_CD_CL">;
> >> +
> >> +// Sample with offsets
> >> +defm : SampleRawPatterns<int_SI_image_sample_o,         "IMAGE_SAMPLE_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_cl_o,      "IMAGE_SAMPLE_CL_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_d_o,       "IMAGE_SAMPLE_D_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_d_cl_o,    "IMAGE_SAMPLE_D_CL_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_l_o,       "IMAGE_SAMPLE_L_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_b_o,       "IMAGE_SAMPLE_B_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_b_cl_o,    "IMAGE_SAMPLE_B_CL_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_lz_o,      "IMAGE_SAMPLE_LZ_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_cd_o,      "IMAGE_SAMPLE_CD_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_cd_cl_o,   "IMAGE_SAMPLE_CD_CL_O">;
> >> +
> >> +// Sample with comparison and offsets
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_o,       "IMAGE_SAMPLE_C_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_cl_o,    "IMAGE_SAMPLE_C_CL_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_d_o,     "IMAGE_SAMPLE_C_D_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_d_cl_o,  "IMAGE_SAMPLE_C_D_CL_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_l_o,     "IMAGE_SAMPLE_C_L_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_b_o,     "IMAGE_SAMPLE_C_B_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_b_cl_o,  "IMAGE_SAMPLE_C_B_CL_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_lz_o,    "IMAGE_SAMPLE_C_LZ_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_cd_o,    "IMAGE_SAMPLE_C_CD_O">;
> >> +defm : SampleRawPatterns<int_SI_image_sample_c_cd_cl_o, "IMAGE_SAMPLE_C_CD_CL_O">;
> >> +
> >> +// Gather opcodes
> >>  // Only the variants which make sense are defined.
> >>  def : SampleRawPattern<int_SI_gather4,           IMAGE_GATHER4_V4_V2,        v2i32>;
> >>  def : SampleRawPattern<int_SI_gather4,           IMAGE_GATHER4_V4_V4,        v4i32>;
> >> @@ -1901,6 +1974,10 @@ def : SampleRawPattern<int_SI_getlod, IMAGE_GET_LOD_V4_V1, i32>;
> >>  def : SampleRawPattern<int_SI_getlod, IMAGE_GET_LOD_V4_V2, v2i32>;
> >>  def : SampleRawPattern<int_SI_getlod, IMAGE_GET_LOD_V4_V4, v4i32>;
> >>
> >> +def : ImagePattern<int_SI_getresinfo, IMAGE_GET_RESINFO_V4_V1, i32>;
> >> +defm : ImagePatterns<int_SI_image_load, "IMAGE_LOAD">;
> >> +defm : ImagePatterns<int_SI_image_load_mip, "IMAGE_LOAD_MIP">;
> >> +
> >>  /* SIsample for simple 1D texture lookup */
> >>  def : Pat <
> >>    (SIsample i32:$addr, v32i8:$rsrc, v4i32:$sampler, imm),
> >> diff --git a/lib/Target/R600/SIIntrinsics.td b/lib/Target/R600/SIIntrinsics.td
> >> index df690a4..fc0c850 100644
> >> --- a/lib/Target/R600/SIIntrinsics.td
> >> +++ b/lib/Target/R600/SIIntrinsics.td
> >> @@ -54,8 +54,6 @@ let TargetPrefix = "SI", isTarget = 1 in {
> >>
> >>    def int_SI_sendmsg : Intrinsic <[], [llvm_i32_ty, llvm_i32_ty], [IntrNoMem]>;
> >>
> >> -  class Sample : Intrinsic <[llvm_v4f32_ty], [llvm_anyvector_ty, llvm_v32i8_ty, llvm_anyint_ty, llvm_i32_ty], [IntrNoMem]>;
> >> -
> >>    // Fully-flexible SAMPLE instruction.
> >>    class SampleRaw : Intrinsic <
> >>      [llvm_v4f32_ty],    // vdata(VGPR)
> >> @@ -72,10 +70,68 @@ let TargetPrefix = "SI", isTarget = 1 in {
> >>       llvm_i32_ty],      // lwe(imm)
> >>      [IntrNoMem]>;
> >>
> >> -  def int_SI_sample : Sample;
> >> -  def int_SI_sampleb : Sample;
> >> -  def int_SI_sampled : Sample;
> >> -  def int_SI_samplel : Sample;
> >> +  // Image instruction without a sampler.
> >> +  class Image : Intrinsic <
> >> +    [llvm_v4f32_ty],    // vdata(VGPR)
> >> +    [llvm_anyint_ty,    // vaddr(VGPR)
> >> +     llvm_v32i8_ty,     // rsrc(SGPR)
> >
> >
> > We are trying to move away from using v*i8 types for resource descriptors,
> > since it requires us to declare v32i8 as a legal type, which causes a lot
> > of problems for us with the DAG Legalizer.
> >
> > We should use v8i32 here and also in SampleRaw we should use v8i32 for the
> > resource and v4i32 for the sampler.
> >
> > -Tom
> >
> >
> >> +     llvm_i32_ty,       // dmask(imm)
> >> +     llvm_i32_ty,       // unorm(imm)
> >> +     llvm_i32_ty,       // r128(imm)
> >> +     llvm_i32_ty,       // da(imm)
> >> +     llvm_i32_ty,       // glc(imm)
> >> +     llvm_i32_ty,       // slc(imm)
> >> +     llvm_i32_ty,       // tfe(imm)
> >> +     llvm_i32_ty],      // lwe(imm)
> >> +    [IntrNoMem]>;
> >> +
> >> +  // Basic sample
> >> +  def int_SI_image_sample : SampleRaw;
> >> +  def int_SI_image_sample_cl : SampleRaw;
> >> +  def int_SI_image_sample_d : SampleRaw;
> >> +  def int_SI_image_sample_d_cl : SampleRaw;
> >> +  def int_SI_image_sample_l : SampleRaw;
> >> +  def int_SI_image_sample_b : SampleRaw;
> >> +  def int_SI_image_sample_b_cl : SampleRaw;
> >> +  def int_SI_image_sample_lz : SampleRaw;
> >> +  def int_SI_image_sample_cd : SampleRaw;
> >> +  def int_SI_image_sample_cd_cl : SampleRaw;
> >> +
> >> +  // Sample with comparison
> >> +  def int_SI_image_sample_c : SampleRaw;
> >> +  def int_SI_image_sample_c_cl : SampleRaw;
> >> +  def int_SI_image_sample_c_d : SampleRaw;
> >> +  def int_SI_image_sample_c_d_cl : SampleRaw;
> >> +  def int_SI_image_sample_c_l : SampleRaw;
> >> +  def int_SI_image_sample_c_b : SampleRaw;
> >> +  def int_SI_image_sample_c_b_cl : SampleRaw;
> >> +  def int_SI_image_sample_c_lz : SampleRaw;
> >> +  def int_SI_image_sample_c_cd : SampleRaw;
> >> +  def int_SI_image_sample_c_cd_cl : SampleRaw;
> >> +
> >> +  // Sample with offsets
> >> +  def int_SI_image_sample_o : SampleRaw;
> >> +  def int_SI_image_sample_cl_o : SampleRaw;
> >> +  def int_SI_image_sample_d_o : SampleRaw;
> >> +  def int_SI_image_sample_d_cl_o : SampleRaw;
> >> +  def int_SI_image_sample_l_o : SampleRaw;
> >> +  def int_SI_image_sample_b_o : SampleRaw;
> >> +  def int_SI_image_sample_b_cl_o : SampleRaw;
> >> +  def int_SI_image_sample_lz_o : SampleRaw;
> >> +  def int_SI_image_sample_cd_o : SampleRaw;
> >> +  def int_SI_image_sample_cd_cl_o : SampleRaw;
> >> +
> >> +  // Sample with comparison and offsets
> >> +  def int_SI_image_sample_c_o : SampleRaw;
> >> +  def int_SI_image_sample_c_cl_o : SampleRaw;
> >> +  def int_SI_image_sample_c_d_o : SampleRaw;
> >> +  def int_SI_image_sample_c_d_cl_o : SampleRaw;
> >> +  def int_SI_image_sample_c_l_o : SampleRaw;
> >> +  def int_SI_image_sample_c_b_o : SampleRaw;
> >> +  def int_SI_image_sample_c_b_cl_o : SampleRaw;
> >> +  def int_SI_image_sample_c_lz_o : SampleRaw;
> >> +  def int_SI_image_sample_c_cd_o : SampleRaw;
> >> +  def int_SI_image_sample_c_cd_cl_o : SampleRaw;
> >>
> >>    // Basic gather4
> >>    def int_SI_gather4 : SampleRaw;
> >> @@ -111,8 +167,19 @@ let TargetPrefix = "SI", isTarget = 1 in {
> >>
> >>    def int_SI_getlod : SampleRaw;
> >>
> >> -  def int_SI_imageload : Intrinsic <[llvm_v4i32_ty], [llvm_anyvector_ty, llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
> >> +  // Image instrinsics.
> >> +  def int_SI_image_load : Image;
> >> +  def int_SI_image_load_mip : Image;
> >> +  def int_SI_getresinfo : Image;
> >>
> >> +  // Deprecated image and sample intrinsics.
> >> +  class Sample : Intrinsic <[llvm_v4f32_ty], [llvm_anyvector_ty, llvm_v32i8_ty, llvm_anyint_ty, llvm_i32_ty], [IntrNoMem]>;
> >> +
> >> +  def int_SI_sample : Sample;
> >> +  def int_SI_sampleb : Sample;
> >> +  def int_SI_sampled : Sample;
> >> +  def int_SI_samplel : Sample;
> >> +  def int_SI_imageload : Intrinsic <[llvm_v4i32_ty], [llvm_anyvector_ty, llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
> >>    def int_SI_resinfo : Intrinsic <[llvm_v4i32_ty], [llvm_i32_ty, llvm_v32i8_ty, llvm_i32_ty], [IntrNoMem]>;
> >>
> >>    /* Interpolation Intrinsics */
> >> diff --git a/test/CodeGen/R600/llvm.SI.image.ll b/test/CodeGen/R600/llvm.SI.image.ll
> >> new file mode 100644
> >> index 0000000..debe7c7
> >> --- /dev/null
> >> +++ b/test/CodeGen/R600/llvm.SI.image.ll
> >> @@ -0,0 +1,49 @@
> >> +;RUN: llc < %s -march=r600 -mcpu=verde -verify-machineinstrs | FileCheck %s
> >> +
> >> +;CHECK-LABEL: @image_load
> >> +;CHECK: IMAGE_LOAD {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @image_load() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.load.v4i32(<4 x i32> undef, <32 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @image_load_mip
> >> +;CHECK: IMAGE_LOAD_MIP {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @image_load_mip() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.load.mip.v4i32(<4 x i32> undef, <32 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @getresinfo
> >> +;CHECK: IMAGE_GET_RESINFO {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @getresinfo() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.getresinfo.i32(i32 undef, <32 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +declare <4 x float> @llvm.SI.image.load.v4i32(<4 x i32>, <32 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.load.mip.v4i32(<4 x i32>, <32 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.getresinfo.i32(i32, <32 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +
> >> +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float)
> >> +
> >> +attributes #0 = { "ShaderType"="0" }
> >> +attributes #1 = { nounwind readnone }
> >> diff --git a/test/CodeGen/R600/llvm.SI.image.sample.ll b/test/CodeGen/R600/llvm.SI.image.sample.ll
> >> new file mode 100644
> >> index 0000000..20358b2
> >> --- /dev/null
> >> +++ b/test/CodeGen/R600/llvm.SI.image.sample.ll
> >> @@ -0,0 +1,289 @@
> >> +;RUN: llc < %s -march=r600 -mcpu=verde -verify-machineinstrs | FileCheck %s
> >> +
> >> +;CHECK-LABEL: @sample
> >> +;CHECK: IMAGE_SAMPLE {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_cl
> >> +;CHECK: IMAGE_SAMPLE_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_d
> >> +;CHECK: IMAGE_SAMPLE_D {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_d() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.d.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_d_cl
> >> +;CHECK: IMAGE_SAMPLE_D_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_d_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.d.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_l
> >> +;CHECK: IMAGE_SAMPLE_L {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_l() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.l.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_b
> >> +;CHECK: IMAGE_SAMPLE_B {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_b() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.b.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_b_cl
> >> +;CHECK: IMAGE_SAMPLE_B_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_b_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.b.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_lz
> >> +;CHECK: IMAGE_SAMPLE_LZ {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_lz() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.lz.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_cd
> >> +;CHECK: IMAGE_SAMPLE_CD {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_cd() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.cd.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_cd_cl
> >> +;CHECK: IMAGE_SAMPLE_CD_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_cd_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.cd.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c
> >> +;CHECK: IMAGE_SAMPLE_C {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_cl
> >> +;CHECK: IMAGE_SAMPLE_C_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_d
> >> +;CHECK: IMAGE_SAMPLE_C_D {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_d() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.d.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_d_cl
> >> +;CHECK: IMAGE_SAMPLE_C_D_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_d_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.d.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_l
> >> +;CHECK: IMAGE_SAMPLE_C_L {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_l() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.l.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_b
> >> +;CHECK: IMAGE_SAMPLE_C_B {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_b() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.b.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_b_cl
> >> +;CHECK: IMAGE_SAMPLE_C_B_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_b_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.b.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_lz
> >> +;CHECK: IMAGE_SAMPLE_C_LZ {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_lz() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.lz.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_cd
> >> +;CHECK: IMAGE_SAMPLE_C_CD {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_cd() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.cd.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_cd_cl
> >> +;CHECK: IMAGE_SAMPLE_C_CD_CL {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_cd_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.cd.cl.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +
> >> +declare <4 x float> @llvm.SI.image.sample.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.d.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.d.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.l.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.b.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.b.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.lz.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.cd.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.cd.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +
> >> +declare <4 x float> @llvm.SI.image.sample.c.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.d.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.d.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.l.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.b.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.b.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.lz.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.cd.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.cd.cl.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +
> >> +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float)
> >> +
> >> +attributes #0 = { "ShaderType"="0" }
> >> +attributes #1 = { nounwind readnone }
> >> diff --git a/test/CodeGen/R600/llvm.SI.image.sample.o.ll b/test/CodeGen/R600/llvm.SI.image.sample.o.ll
> >> new file mode 100644
> >> index 0000000..6a79466
> >> --- /dev/null
> >> +++ b/test/CodeGen/R600/llvm.SI.image.sample.o.ll
> >> @@ -0,0 +1,289 @@
> >> +;RUN: llc < %s -march=r600 -mcpu=verde -verify-machineinstrs | FileCheck %s
> >> +
> >> +;CHECK-LABEL: @sample
> >> +;CHECK: IMAGE_SAMPLE_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_cl
> >> +;CHECK: IMAGE_SAMPLE_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_d
> >> +;CHECK: IMAGE_SAMPLE_D_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_d() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.d.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_d_cl
> >> +;CHECK: IMAGE_SAMPLE_D_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_d_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.d.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_l
> >> +;CHECK: IMAGE_SAMPLE_L_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_l() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.l.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_b
> >> +;CHECK: IMAGE_SAMPLE_B_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_b() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.b.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_b_cl
> >> +;CHECK: IMAGE_SAMPLE_B_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_b_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.b.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_lz
> >> +;CHECK: IMAGE_SAMPLE_LZ_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_lz() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.lz.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_cd
> >> +;CHECK: IMAGE_SAMPLE_CD_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_cd() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.cd.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_cd_cl
> >> +;CHECK: IMAGE_SAMPLE_CD_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_cd_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.cd.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c
> >> +;CHECK: IMAGE_SAMPLE_C_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_cl
> >> +;CHECK: IMAGE_SAMPLE_C_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_d
> >> +;CHECK: IMAGE_SAMPLE_C_D_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_d() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.d.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_d_cl
> >> +;CHECK: IMAGE_SAMPLE_C_D_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_d_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.d.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_l
> >> +;CHECK: IMAGE_SAMPLE_C_L_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_l() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.l.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_b
> >> +;CHECK: IMAGE_SAMPLE_C_B_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_b() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.b.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_b_cl
> >> +;CHECK: IMAGE_SAMPLE_C_B_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_b_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.b.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_lz
> >> +;CHECK: IMAGE_SAMPLE_C_LZ_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_lz() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.lz.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_cd
> >> +;CHECK: IMAGE_SAMPLE_C_CD_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_cd() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.cd.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +;CHECK-LABEL: @sample_c_cd_cl
> >> +;CHECK: IMAGE_SAMPLE_C_CD_CL_O {{v\[[0-9]+:[0-9]+\]}}, 15, 0, 0, 0, 0, 0, 0, 0, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}
> >> +define void @sample_c_cd_cl() #0 {
> >> +main_body:
> >> +  %r = call <4 x float> @llvm.SI.image.sample.c.cd.cl.o.v4i32(<4 x i32> undef, <32 x i8> undef, <16 x i8> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0)
> >> +  %r0 = extractelement <4 x float> %r, i32 0
> >> +  %r1 = extractelement <4 x float> %r, i32 1
> >> +  %r2 = extractelement <4 x float> %r, i32 2
> >> +  %r3 = extractelement <4 x float> %r, i32 3
> >> +  call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %r0, float %r1, float %r2, float %r3)
> >> +  ret void
> >> +}
> >> +
> >> +
> >> +declare <4 x float> @llvm.SI.image.sample.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.d.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.d.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.l.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.b.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.b.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.lz.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.cd.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.cd.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +
> >> +declare <4 x float> @llvm.SI.image.sample.c.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.d.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.d.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.l.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.b.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.b.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.lz.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.cd.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +declare <4 x float> @llvm.SI.image.sample.c.cd.cl.o.v4i32(<4 x i32>, <32 x i8>, <16 x i8>, i32, i32, i32, i32, i32, i32, i32, i32) #1
> >> +
> >> +declare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float)
> >> +
> >> +attributes #0 = { "ShaderType"="0" }
> >> +attributes #1 = { nounwind readnone }
> >> --
> >> 1.9.1
> >>
> >> _______________________________________________
> >> mesa-dev mailing list
> >> mesa-dev at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list