Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=GCN %s
      2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -strict-whitespace -check-prefix=GCN %s
      3 
      4 declare void @llvm.amdgcn.exp.f32(i32, i32, float, float, float, float, i1, i1) #1
      5 declare void @llvm.amdgcn.exp.i32(i32, i32, i32, i32, i32, i32, i1, i1) #1
      6 
      7 ; GCN-LABEL: {{^}}test_export_zeroes_f32:
      8 ; GCN: exp mrt0 off, off, off, off{{$}}
      9 ; GCN: exp mrt0 off, off, off, off done{{$}}
     10 define amdgpu_kernel void @test_export_zeroes_f32() #0 {
     11 
     12   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float 0.0, float 0.0, float 0.0, float 0.0, i1 false, i1 false)
     13   call void @llvm.amdgcn.exp.f32(i32 0, i32 0, float 0.0, float 0.0, float 0.0, float 0.0, i1 true, i1 false)
     14   ret void
     15 }
     16 
     17 ; FIXME: Should not set up registers for the unused source registers.
     18 
     19 ; GCN-LABEL: {{^}}test_export_en_src0_f32:
     20 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     21 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     22 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     23 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     24 ; GCN: exp mrt0 [[SRC0]], off, off, off done{{$}}
     25 define amdgpu_kernel void @test_export_en_src0_f32() #0 {
     26   call void @llvm.amdgcn.exp.f32(i32 0, i32 1, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     27   ret void
     28 }
     29 
     30 ; GCN-LABEL: {{^}}test_export_en_src1_f32:
     31 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     32 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     33 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     34 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     35 ; GCN: exp mrt0 off, [[SRC1]], off, off done{{$}}
     36 define amdgpu_kernel void @test_export_en_src1_f32() #0 {
     37   call void @llvm.amdgcn.exp.f32(i32 0, i32 2, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     38   ret void
     39 }
     40 
     41 ; GCN-LABEL: {{^}}test_export_en_src2_f32:
     42 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     43 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     44 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     45 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     46 ; GCN: exp mrt0 off, off, [[SRC2]], off done{{$}}
     47 define amdgpu_kernel void @test_export_en_src2_f32() #0 {
     48   call void @llvm.amdgcn.exp.f32(i32 0, i32 4, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     49   ret void
     50 }
     51 
     52 ; GCN-LABEL: {{^}}test_export_en_src3_f32:
     53 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     54 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     55 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     56 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     57 ; GCN: exp mrt0 off, off, off, [[SRC3]] done{{$}}
     58 define amdgpu_kernel void @test_export_en_src3_f32() #0 {
     59   call void @llvm.amdgcn.exp.f32(i32 0, i32 8, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     60   ret void
     61 }
     62 
     63 ; GCN-LABEL: {{^}}test_export_en_src0_src1_f32:
     64 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     65 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     66 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     67 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     68 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done{{$}}
     69 define amdgpu_kernel void @test_export_en_src0_src1_f32() #0 {
     70   call void @llvm.amdgcn.exp.f32(i32 0, i32 3, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     71   ret void
     72 }
     73 
     74 ; GCN-LABEL: {{^}}test_export_en_src0_src2_f32:
     75 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     76 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     77 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     78 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     79 ; GCN: exp mrt0 [[SRC0]], off, [[SRC2]], off done{{$}}
     80 define amdgpu_kernel void @test_export_en_src0_src2_f32() #0 {
     81   call void @llvm.amdgcn.exp.f32(i32 0, i32 5, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     82   ret void
     83 }
     84 
     85 ; GCN-LABEL: {{^}}test_export_en_src0_src3_f32:
     86 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
     87 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
     88 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
     89 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
     90 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]]{{$}}
     91 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]] done{{$}}
     92 define amdgpu_kernel void @test_export_en_src0_src3_f32() #0 {
     93   call void @llvm.amdgcn.exp.f32(i32 0, i32 9, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
     94   call void @llvm.amdgcn.exp.f32(i32 0, i32 9, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
     95   ret void
     96 }
     97 
     98 ; GCN-LABEL: {{^}}test_export_en_src0_src1_src2_src3_f32:
     99 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    100 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    101 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    102 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    103 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    104 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    105 define amdgpu_kernel void @test_export_en_src0_src1_src2_src3_f32() #0 {
    106   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    107   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    108   ret void
    109 }
    110 
    111 ; GCN-LABEL: {{^}}test_export_mrt7_f32:
    112 ; GCN-DAG: v_mov_b32_e32 [[VHALF:v[0-9]+]], 0.5
    113 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]]{{$}}
    114 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]] done{{$}}
    115 define amdgpu_kernel void @test_export_mrt7_f32() #0 {
    116   call void @llvm.amdgcn.exp.f32(i32 7, i32 15, float 0.5, float 0.5, float 0.5, float 0.5, i1 false, i1 false)
    117   call void @llvm.amdgcn.exp.f32(i32 7, i32 15, float 0.5, float 0.5, float 0.5, float 0.5, i1 true, i1 false)
    118   ret void
    119 }
    120 
    121 ; GCN-LABEL: {{^}}test_export_z_f32:
    122 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    123 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    124 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    125 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    126 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    127 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    128 define amdgpu_kernel void @test_export_z_f32() #0 {
    129   call void @llvm.amdgcn.exp.f32(i32 8, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    130   call void @llvm.amdgcn.exp.f32(i32 8, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    131   ret void
    132 }
    133 
    134 ; GCN-LABEL: {{^}}test_export_null_f32:
    135 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    136 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    137 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    138 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    139 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    140 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    141 define amdgpu_kernel void @test_export_null_f32() #0 {
    142   call void @llvm.amdgcn.exp.f32(i32 9, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    143   call void @llvm.amdgcn.exp.f32(i32 9, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    144   ret void
    145 }
    146 
    147 ; GCN-LABEL: {{^}}test_export_reserved10_f32:
    148 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    149 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    150 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    151 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    152 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    153 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    154 define amdgpu_kernel void @test_export_reserved10_f32() #0 {
    155   call void @llvm.amdgcn.exp.f32(i32 10, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    156   call void @llvm.amdgcn.exp.f32(i32 10, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    157   ret void
    158 }
    159 
    160 ; GCN-LABEL: {{^}}test_export_reserved11_f32:
    161 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    162 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    163 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    164 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    165 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    166 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    167 define amdgpu_kernel void @test_export_reserved11_f32() #0 {
    168   call void @llvm.amdgcn.exp.f32(i32 11, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    169   call void @llvm.amdgcn.exp.f32(i32 11, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    170   ret void
    171 }
    172 
    173 ; GCN-LABEL: {{^}}test_export_pos0_f32:
    174 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    175 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    176 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    177 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    178 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    179 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    180 define amdgpu_kernel void @test_export_pos0_f32() #0 {
    181   call void @llvm.amdgcn.exp.f32(i32 12, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    182   call void @llvm.amdgcn.exp.f32(i32 12, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    183   ret void
    184 }
    185 
    186 ; GCN-LABEL: {{^}}test_export_pos3_f32:
    187 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    188 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    189 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    190 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    191 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    192 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    193 define amdgpu_kernel void @test_export_pos3_f32() #0 {
    194   call void @llvm.amdgcn.exp.f32(i32 15, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    195   call void @llvm.amdgcn.exp.f32(i32 15, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    196   ret void
    197 }
    198 
    199 ; GCN-LABEL: {{^}}test_export_param0_f32:
    200 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    201 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    202 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    203 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    204 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    205 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    206 define amdgpu_kernel void @test_export_param0_f32() #0 {
    207   call void @llvm.amdgcn.exp.f32(i32 32, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    208   call void @llvm.amdgcn.exp.f32(i32 32, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    209   ret void
    210 }
    211 
    212 ; GCN-LABEL: {{^}}test_export_param31_f32:
    213 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    214 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    215 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    216 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    217 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    218 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    219 define amdgpu_kernel void @test_export_param31_f32() #0 {
    220   call void @llvm.amdgcn.exp.f32(i32 63, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 false)
    221   call void @llvm.amdgcn.exp.f32(i32 63, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 false)
    222   ret void
    223 }
    224 
    225 ; GCN-LABEL: {{^}}test_export_vm_f32:
    226 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1.0
    227 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2.0
    228 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 0.5
    229 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4.0
    230 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] vm{{$}}
    231 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done vm{{$}}
    232 define amdgpu_kernel void @test_export_vm_f32() #0 {
    233   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 false, i1 true)
    234   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float 1.0, float 2.0, float 0.5, float 4.0, i1 true, i1 true)
    235   ret void
    236 }
    237 
    238 
    239 
    240 
    241 
    242 
    243 
    244 
    245 
    246 
    247 
    248 
    249 
    250 
    251 
    252 ; GCN-LABEL: {{^}}test_export_zeroes_i32:
    253 ; GCN: exp mrt0 off, off, off, off{{$}}
    254 ; GCN: exp mrt0 off, off, off, off done{{$}}
    255 define amdgpu_kernel void @test_export_zeroes_i32() #0 {
    256 
    257   call void @llvm.amdgcn.exp.i32(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i1 false, i1 false)
    258   call void @llvm.amdgcn.exp.i32(i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i1 true, i1 false)
    259   ret void
    260 }
    261 
    262 ; FIXME: Should not set up registers for the unused source registers.
    263 
    264 ; GCN-LABEL: {{^}}test_export_en_src0_i32:
    265 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    266 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    267 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    268 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    269 ; GCN: exp mrt0 [[SRC0]], off, off, off done{{$}}
    270 define amdgpu_kernel void @test_export_en_src0_i32() #0 {
    271   call void @llvm.amdgcn.exp.i32(i32 0, i32 1, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    272   ret void
    273 }
    274 
    275 ; GCN-LABEL: {{^}}test_export_en_src1_i32:
    276 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    277 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    278 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    279 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    280 ; GCN: exp mrt0 off, [[SRC1]], off, off done{{$}}
    281 define amdgpu_kernel void @test_export_en_src1_i32() #0 {
    282   call void @llvm.amdgcn.exp.i32(i32 0, i32 2, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    283   ret void
    284 }
    285 
    286 ; GCN-LABEL: {{^}}test_export_en_src2_i32:
    287 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    288 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    289 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    290 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    291 ; GCN: exp mrt0 off, off, [[SRC2]], off done{{$}}
    292 define amdgpu_kernel void @test_export_en_src2_i32() #0 {
    293   call void @llvm.amdgcn.exp.i32(i32 0, i32 4, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    294   ret void
    295 }
    296 
    297 ; GCN-LABEL: {{^}}test_export_en_src3_i32:
    298 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    299 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    300 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    301 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    302 ; GCN: exp mrt0 off, off, off, [[SRC3]] done{{$}}
    303 define amdgpu_kernel void @test_export_en_src3_i32() #0 {
    304   call void @llvm.amdgcn.exp.i32(i32 0, i32 8, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    305   ret void
    306 }
    307 
    308 ; GCN-LABEL: {{^}}test_export_en_src0_src1_i32:
    309 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    310 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    311 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    312 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    313 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], off, off done{{$}}
    314 define amdgpu_kernel void @test_export_en_src0_src1_i32() #0 {
    315   call void @llvm.amdgcn.exp.i32(i32 0, i32 3, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    316   ret void
    317 }
    318 
    319 ; GCN-LABEL: {{^}}test_export_en_src0_src2_i32:
    320 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    321 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    322 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    323 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    324 ; GCN: exp mrt0 [[SRC0]], off, [[SRC2]], off done{{$}}
    325 define amdgpu_kernel void @test_export_en_src0_src2_i32() #0 {
    326   call void @llvm.amdgcn.exp.i32(i32 0, i32 5, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    327   ret void
    328 }
    329 
    330 ; GCN-LABEL: {{^}}test_export_en_src0_src3_i32:
    331 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    332 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    333 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    334 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    335 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]]{{$}}
    336 ; GCN: exp mrt0 [[SRC0]], off, off, [[SRC3]] done{{$}}
    337 define amdgpu_kernel void @test_export_en_src0_src3_i32() #0 {
    338   call void @llvm.amdgcn.exp.i32(i32 0, i32 9, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    339   call void @llvm.amdgcn.exp.i32(i32 0, i32 9, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    340   ret void
    341 }
    342 
    343 ; GCN-LABEL: {{^}}test_export_en_src0_src1_src2_src3_i32:
    344 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    345 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    346 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    347 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    348 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    349 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    350 define amdgpu_kernel void @test_export_en_src0_src1_src2_src3_i32() #0 {
    351   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    352   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    353   ret void
    354 }
    355 
    356 ; GCN-LABEL: {{^}}test_export_mrt7_i32:
    357 ; GCN-DAG: v_mov_b32_e32 [[VHALF:v[0-9]+]], 5
    358 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]]{{$}}
    359 ; GCN: exp mrt7 [[VHALF]], [[VHALF]], [[VHALF]], [[VHALF]] done{{$}}
    360 define amdgpu_kernel void @test_export_mrt7_i32() #0 {
    361   call void @llvm.amdgcn.exp.i32(i32 7, i32 15, i32 5, i32 5, i32 5, i32 5, i1 false, i1 false)
    362   call void @llvm.amdgcn.exp.i32(i32 7, i32 15, i32 5, i32 5, i32 5, i32 5, i1 true, i1 false)
    363   ret void
    364 }
    365 
    366 ; GCN-LABEL: {{^}}test_export_z_i32:
    367 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    368 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    369 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    370 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    371 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    372 ; GCN: exp mrtz [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    373 define amdgpu_kernel void @test_export_z_i32() #0 {
    374   call void @llvm.amdgcn.exp.i32(i32 8, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    375   call void @llvm.amdgcn.exp.i32(i32 8, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    376   ret void
    377 }
    378 
    379 ; GCN-LABEL: {{^}}test_export_null_i32:
    380 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    381 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    382 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    383 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    384 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    385 ; GCN: exp null [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    386 define amdgpu_kernel void @test_export_null_i32() #0 {
    387   call void @llvm.amdgcn.exp.i32(i32 9, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    388   call void @llvm.amdgcn.exp.i32(i32 9, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    389   ret void
    390 }
    391 
    392 ; GCN-LABEL: {{^}}test_export_reserved10_i32:
    393 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    394 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    395 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    396 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    397 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    398 ; GCN: exp invalid_target_10 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    399 define amdgpu_kernel void @test_export_reserved10_i32() #0 {
    400   call void @llvm.amdgcn.exp.i32(i32 10, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    401   call void @llvm.amdgcn.exp.i32(i32 10, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    402   ret void
    403 }
    404 
    405 ; GCN-LABEL: {{^}}test_export_reserved11_i32:
    406 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    407 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    408 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    409 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    410 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    411 ; GCN: exp invalid_target_11 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    412 define amdgpu_kernel void @test_export_reserved11_i32() #0 {
    413   call void @llvm.amdgcn.exp.i32(i32 11, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    414   call void @llvm.amdgcn.exp.i32(i32 11, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    415   ret void
    416 }
    417 
    418 ; GCN-LABEL: {{^}}test_export_pos0_i32:
    419 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    420 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    421 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    422 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    423 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    424 ; GCN: exp pos0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    425 define amdgpu_kernel void @test_export_pos0_i32() #0 {
    426   call void @llvm.amdgcn.exp.i32(i32 12, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    427   call void @llvm.amdgcn.exp.i32(i32 12, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    428   ret void
    429 }
    430 
    431 ; GCN-LABEL: {{^}}test_export_pos3_i32:
    432 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    433 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    434 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    435 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    436 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    437 ; GCN: exp pos3 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    438 define amdgpu_kernel void @test_export_pos3_i32() #0 {
    439   call void @llvm.amdgcn.exp.i32(i32 15, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    440   call void @llvm.amdgcn.exp.i32(i32 15, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    441   ret void
    442 }
    443 
    444 ; GCN-LABEL: {{^}}test_export_param0_i32:
    445 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    446 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    447 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    448 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    449 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    450 ; GCN: exp param0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    451 define amdgpu_kernel void @test_export_param0_i32() #0 {
    452   call void @llvm.amdgcn.exp.i32(i32 32, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    453   call void @llvm.amdgcn.exp.i32(i32 32, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    454   ret void
    455 }
    456 
    457 ; GCN-LABEL: {{^}}test_export_param31_i32:
    458 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    459 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    460 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    461 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    462 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]]{{$}}
    463 ; GCN: exp param31 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done{{$}}
    464 define amdgpu_kernel void @test_export_param31_i32() #0 {
    465   call void @llvm.amdgcn.exp.i32(i32 63, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 false)
    466   call void @llvm.amdgcn.exp.i32(i32 63, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 false)
    467   ret void
    468 }
    469 
    470 ; GCN-LABEL: {{^}}test_export_vm_i32:
    471 ; GCN-DAG: v_mov_b32_e32 [[SRC0:v[0-9]+]], 1
    472 ; GCN-DAG: v_mov_b32_e32 [[SRC1:v[0-9]+]], 2
    473 ; GCN-DAG: v_mov_b32_e32 [[SRC2:v[0-9]+]], 5
    474 ; GCN-DAG: v_mov_b32_e32 [[SRC3:v[0-9]+]], 4
    475 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] vm{{$}}
    476 ; GCN: exp mrt0 [[SRC0]], [[SRC1]], [[SRC2]], [[SRC3]] done vm{{$}}
    477 define amdgpu_kernel void @test_export_vm_i32() #0 {
    478   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 false, i1 true)
    479   call void @llvm.amdgcn.exp.i32(i32 0, i32 15, i32 1, i32 2, i32 5, i32 4, i1 true, i1 true)
    480   ret void
    481 }
    482 
    483 ; GCN-LABEL: {{^}}test_if_export_f32:
    484 ; GCN: s_cbranch_execz
    485 ; GCN: exp
    486 define amdgpu_ps void @test_if_export_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
    487   %cc = icmp eq i32 %flag, 0
    488   br i1 %cc, label %end, label %exp
    489 
    490 exp:
    491   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 false, i1 false)
    492   br label %end
    493 
    494 end:
    495   ret void
    496 }
    497 
    498 ; GCN-LABEL: {{^}}test_if_export_vm_f32:
    499 ; GCN: s_cbranch_execz
    500 ; GCN: exp
    501 define amdgpu_ps void @test_if_export_vm_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
    502   %cc = icmp eq i32 %flag, 0
    503   br i1 %cc, label %end, label %exp
    504 
    505 exp:
    506   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 false, i1 true)
    507   br label %end
    508 
    509 end:
    510   ret void
    511 }
    512 
    513 ; GCN-LABEL: {{^}}test_if_export_done_f32:
    514 ; GCN: s_cbranch_execz
    515 ; GCN: exp
    516 define amdgpu_ps void @test_if_export_done_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
    517   %cc = icmp eq i32 %flag, 0
    518   br i1 %cc, label %end, label %exp
    519 
    520 exp:
    521   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 true, i1 false)
    522   br label %end
    523 
    524 end:
    525   ret void
    526 }
    527 
    528 ; GCN-LABEL: {{^}}test_if_export_vm_done_f32:
    529 ; GCN: s_cbranch_execz
    530 ; GCN: exp
    531 define amdgpu_ps void @test_if_export_vm_done_f32(i32 %flag, float %x, float %y, float %z, float %w) #0 {
    532   %cc = icmp eq i32 %flag, 0
    533   br i1 %cc, label %end, label %exp
    534 
    535 exp:
    536   call void @llvm.amdgcn.exp.f32(i32 0, i32 15, float %x, float %y, float %z, float %w, i1 true, i1 true)
    537   br label %end
    538 
    539 end:
    540   ret void
    541 }
    542 
    543 attributes #0 = { nounwind }
    544 attributes #1 = { nounwind inaccessiblememonly }
    545