Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
      2 
      3 declare i32 @llvm.amdgcn.workitem.id.x() #0
      4 
      5 ; --------------------------------------------------------------------------------
      6 ; i32 compares
      7 ; --------------------------------------------------------------------------------
      8 
      9 ; GCN-LABEL: {{^}}commute_eq_64_i32:
     10 ; GCN: v_cmp_eq_i32_e32 vcc, 64, v{{[0-9]+}}
     11 define void @commute_eq_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     12   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     13   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     14   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     15   %val = load i32, i32 addrspace(1)* %gep.in
     16   %cmp = icmp eq i32 %val, 64
     17   %ext = sext i1 %cmp to i32
     18   store i32 %ext, i32 addrspace(1)* %gep.out
     19   ret void
     20 }
     21 
     22 ; GCN-LABEL: {{^}}commute_ne_64_i32:
     23 ; GCN: v_cmp_ne_i32_e32 vcc, 64, v{{[0-9]+}}
     24 define void @commute_ne_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     25   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     26   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     27   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     28   %val = load i32, i32 addrspace(1)* %gep.in
     29   %cmp = icmp ne i32 %val, 64
     30   %ext = sext i1 %cmp to i32
     31   store i32 %ext, i32 addrspace(1)* %gep.out
     32   ret void
     33 }
     34 
     35 ; FIXME: Why isn't this being folded as a constant?
     36 ; GCN-LABEL: {{^}}commute_ne_litk_i32:
     37 ; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x3039
     38 ; GCN: v_cmp_ne_i32_e32 vcc, [[K]], v{{[0-9]+}}
     39 define void @commute_ne_litk_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     40   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     41   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     42   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     43   %val = load i32, i32 addrspace(1)* %gep.in
     44   %cmp = icmp ne i32 %val, 12345
     45   %ext = sext i1 %cmp to i32
     46   store i32 %ext, i32 addrspace(1)* %gep.out
     47   ret void
     48 }
     49 
     50 ; GCN-LABEL: {{^}}commute_ugt_64_i32:
     51 ; GCN: v_cmp_lt_u32_e32 vcc, 64, v{{[0-9]+}}
     52 define void @commute_ugt_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     53   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     54   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     55   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     56   %val = load i32, i32 addrspace(1)* %gep.in
     57   %cmp = icmp ugt i32 %val, 64
     58   %ext = sext i1 %cmp to i32
     59   store i32 %ext, i32 addrspace(1)* %gep.out
     60   ret void
     61 }
     62 
     63 ; GCN-LABEL: {{^}}commute_uge_64_i32:
     64 ; GCN: v_cmp_lt_u32_e32 vcc, 63, v{{[0-9]+}}
     65 define void @commute_uge_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     66   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     67   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     68   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     69   %val = load i32, i32 addrspace(1)* %gep.in
     70   %cmp = icmp uge i32 %val, 64
     71   %ext = sext i1 %cmp to i32
     72   store i32 %ext, i32 addrspace(1)* %gep.out
     73   ret void
     74 }
     75 
     76 ; GCN-LABEL: {{^}}commute_ult_64_i32:
     77 ; GCN: v_cmp_gt_u32_e32 vcc, 64, v{{[0-9]+}}
     78 define void @commute_ult_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     79   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     80   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     81   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     82   %val = load i32, i32 addrspace(1)* %gep.in
     83   %cmp = icmp ult i32 %val, 64
     84   %ext = sext i1 %cmp to i32
     85   store i32 %ext, i32 addrspace(1)* %gep.out
     86   ret void
     87 }
     88 
     89 ; GCN-LABEL: {{^}}commute_ule_63_i32:
     90 ; GCN: v_cmp_gt_u32_e32 vcc, 64, v{{[0-9]+}}
     91 define void @commute_ule_63_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
     92   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
     93   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
     94   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
     95   %val = load i32, i32 addrspace(1)* %gep.in
     96   %cmp = icmp ule i32 %val, 63
     97   %ext = sext i1 %cmp to i32
     98   store i32 %ext, i32 addrspace(1)* %gep.out
     99   ret void
    100 }
    101 
    102 ; FIXME: Undo canonicalization to gt (x + 1) since it doesn't use the inline imm
    103 
    104 ; GCN-LABEL: {{^}}commute_ule_64_i32:
    105 ; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x41{{$}}
    106 ; GCN: v_cmp_gt_u32_e32 vcc, [[K]], v{{[0-9]+}}
    107 define void @commute_ule_64_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
    108   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    109   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
    110   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    111   %val = load i32, i32 addrspace(1)* %gep.in
    112   %cmp = icmp ule i32 %val, 64
    113   %ext = sext i1 %cmp to i32
    114   store i32 %ext, i32 addrspace(1)* %gep.out
    115   ret void
    116 }
    117 
    118 ; GCN-LABEL: {{^}}commute_sgt_neg1_i32:
    119 ; GCN: v_cmp_lt_i32_e32 vcc, -1, v{{[0-9]+}}
    120 define void @commute_sgt_neg1_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
    121   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    122   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
    123   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    124   %val = load i32, i32 addrspace(1)* %gep.in
    125   %cmp = icmp sgt i32 %val, -1
    126   %ext = sext i1 %cmp to i32
    127   store i32 %ext, i32 addrspace(1)* %gep.out
    128   ret void
    129 }
    130 
    131 ; GCN-LABEL: {{^}}commute_sge_neg2_i32:
    132 ; GCN: v_cmp_lt_i32_e32 vcc, -3, v{{[0-9]+}}
    133 define void @commute_sge_neg2_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
    134   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    135   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
    136   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    137   %val = load i32, i32 addrspace(1)* %gep.in
    138   %cmp = icmp sge i32 %val, -2
    139   %ext = sext i1 %cmp to i32
    140   store i32 %ext, i32 addrspace(1)* %gep.out
    141   ret void
    142 }
    143 
    144 ; GCN-LABEL: {{^}}commute_slt_neg16_i32:
    145 ; GCN: v_cmp_gt_i32_e32 vcc, -16, v{{[0-9]+}}
    146 define void @commute_slt_neg16_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
    147   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    148   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
    149   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    150   %val = load i32, i32 addrspace(1)* %gep.in
    151   %cmp = icmp slt i32 %val, -16
    152   %ext = sext i1 %cmp to i32
    153   store i32 %ext, i32 addrspace(1)* %gep.out
    154   ret void
    155 }
    156 
    157 ; GCN-LABEL: {{^}}commute_sle_5_i32:
    158 ; GCN: v_cmp_gt_i32_e32 vcc, 6, v{{[0-9]+}}
    159 define void @commute_sle_5_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) #1 {
    160   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    161   %gep.in = getelementptr i32, i32 addrspace(1)* %in, i32 %tid
    162   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    163   %val = load i32, i32 addrspace(1)* %gep.in
    164   %cmp = icmp sle i32 %val, 5
    165   %ext = sext i1 %cmp to i32
    166   store i32 %ext, i32 addrspace(1)* %gep.out
    167   ret void
    168 }
    169 
    170 ; --------------------------------------------------------------------------------
    171 ; i64 compares
    172 ; --------------------------------------------------------------------------------
    173 
    174 ; GCN-LABEL: {{^}}commute_eq_64_i64:
    175 ; GCN: v_cmp_eq_i64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
    176 define void @commute_eq_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    177   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    178   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    179   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    180   %val = load i64, i64 addrspace(1)* %gep.in
    181   %cmp = icmp eq i64 %val, 64
    182   %ext = sext i1 %cmp to i32
    183   store i32 %ext, i32 addrspace(1)* %gep.out
    184   ret void
    185 }
    186 
    187 ; GCN-LABEL: {{^}}commute_ne_64_i64:
    188 ; GCN: v_cmp_ne_i64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
    189 define void @commute_ne_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    190   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    191   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    192   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    193   %val = load i64, i64 addrspace(1)* %gep.in
    194   %cmp = icmp ne i64 %val, 64
    195   %ext = sext i1 %cmp to i32
    196   store i32 %ext, i32 addrspace(1)* %gep.out
    197   ret void
    198 }
    199 
    200 ; GCN-LABEL: {{^}}commute_ugt_64_i64:
    201 ; GCN: v_cmp_lt_u64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
    202 define void @commute_ugt_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    203   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    204   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    205   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    206   %val = load i64, i64 addrspace(1)* %gep.in
    207   %cmp = icmp ugt i64 %val, 64
    208   %ext = sext i1 %cmp to i32
    209   store i32 %ext, i32 addrspace(1)* %gep.out
    210   ret void
    211 }
    212 
    213 ; GCN-LABEL: {{^}}commute_uge_64_i64:
    214 ; GCN: v_cmp_lt_u64_e32 vcc, 63, v{{\[[0-9]+:[0-9]+\]}}
    215 define void @commute_uge_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    216   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    217   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    218   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    219   %val = load i64, i64 addrspace(1)* %gep.in
    220   %cmp = icmp uge i64 %val, 64
    221   %ext = sext i1 %cmp to i32
    222   store i32 %ext, i32 addrspace(1)* %gep.out
    223   ret void
    224 }
    225 
    226 ; GCN-LABEL: {{^}}commute_ult_64_i64:
    227 ; GCN: v_cmp_gt_u64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
    228 define void @commute_ult_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    229   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    230   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    231   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    232   %val = load i64, i64 addrspace(1)* %gep.in
    233   %cmp = icmp ult i64 %val, 64
    234   %ext = sext i1 %cmp to i32
    235   store i32 %ext, i32 addrspace(1)* %gep.out
    236   ret void
    237 }
    238 
    239 ; GCN-LABEL: {{^}}commute_ule_63_i64:
    240 ; GCN: v_cmp_gt_u64_e32 vcc, 64, v{{\[[0-9]+:[0-9]+\]}}
    241 define void @commute_ule_63_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    242   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    243   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    244   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    245   %val = load i64, i64 addrspace(1)* %gep.in
    246   %cmp = icmp ule i64 %val, 63
    247   %ext = sext i1 %cmp to i32
    248   store i32 %ext, i32 addrspace(1)* %gep.out
    249   ret void
    250 }
    251 
    252 ; FIXME: Undo canonicalization to gt (x + 1) since it doesn't use the inline imm
    253 
    254 ; GCN-LABEL: {{^}}commute_ule_64_i64:
    255 ; GCN-DAG: s_movk_i32 s[[KLO:[0-9]+]], 0x41{{$}}
    256 ; GCN: v_cmp_gt_u64_e32 vcc, s{{\[}}[[KLO]]:{{[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}
    257 define void @commute_ule_64_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    258   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    259   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    260   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    261   %val = load i64, i64 addrspace(1)* %gep.in
    262   %cmp = icmp ule i64 %val, 64
    263   %ext = sext i1 %cmp to i32
    264   store i32 %ext, i32 addrspace(1)* %gep.out
    265   ret void
    266 }
    267 
    268 ; GCN-LABEL: {{^}}commute_sgt_neg1_i64:
    269 ; GCN: v_cmp_lt_i64_e32 vcc, -1, v{{\[[0-9]+:[0-9]+\]}}
    270 define void @commute_sgt_neg1_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    271   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    272   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    273   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    274   %val = load i64, i64 addrspace(1)* %gep.in
    275   %cmp = icmp sgt i64 %val, -1
    276   %ext = sext i1 %cmp to i32
    277   store i32 %ext, i32 addrspace(1)* %gep.out
    278   ret void
    279 }
    280 
    281 ; GCN-LABEL: {{^}}commute_sge_neg2_i64:
    282 ; GCN: v_cmp_lt_i64_e32 vcc, -3, v{{\[[0-9]+:[0-9]+\]}}
    283 define void @commute_sge_neg2_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    284   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    285   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    286   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    287   %val = load i64, i64 addrspace(1)* %gep.in
    288   %cmp = icmp sge i64 %val, -2
    289   %ext = sext i1 %cmp to i32
    290   store i32 %ext, i32 addrspace(1)* %gep.out
    291   ret void
    292 }
    293 
    294 ; GCN-LABEL: {{^}}commute_slt_neg16_i64:
    295 ; GCN: v_cmp_gt_i64_e32 vcc, -16, v{{\[[0-9]+:[0-9]+\]}}
    296 define void @commute_slt_neg16_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    297   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    298   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    299   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    300   %val = load i64, i64 addrspace(1)* %gep.in
    301   %cmp = icmp slt i64 %val, -16
    302   %ext = sext i1 %cmp to i32
    303   store i32 %ext, i32 addrspace(1)* %gep.out
    304   ret void
    305 }
    306 
    307 ; GCN-LABEL: {{^}}commute_sle_5_i64:
    308 ; GCN: v_cmp_gt_i64_e32 vcc, 6, v{{\[[0-9]+:[0-9]+\]}}
    309 define void @commute_sle_5_i64(i32 addrspace(1)* %out, i64 addrspace(1)* %in) #1 {
    310   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    311   %gep.in = getelementptr i64, i64 addrspace(1)* %in, i32 %tid
    312   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    313   %val = load i64, i64 addrspace(1)* %gep.in
    314   %cmp = icmp sle i64 %val, 5
    315   %ext = sext i1 %cmp to i32
    316   store i32 %ext, i32 addrspace(1)* %gep.out
    317   ret void
    318 }
    319 
    320 ; --------------------------------------------------------------------------------
    321 ; f32 compares
    322 ; --------------------------------------------------------------------------------
    323 
    324 
    325 ; GCN-LABEL: {{^}}commute_oeq_2.0_f32:
    326 ; GCN: v_cmp_eq_f32_e32 vcc, 2.0, v{{[0-9]+}}
    327 define void @commute_oeq_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    328   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    329   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    330   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    331   %val = load float, float addrspace(1)* %gep.in
    332   %cmp = fcmp oeq float %val, 2.0
    333   %ext = sext i1 %cmp to i32
    334   store i32 %ext, i32 addrspace(1)* %gep.out
    335   ret void
    336 }
    337 
    338 
    339 ; GCN-LABEL: {{^}}commute_ogt_2.0_f32:
    340 ; GCN: v_cmp_lt_f32_e32 vcc, 2.0, v{{[0-9]+}}
    341 define void @commute_ogt_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    342   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    343   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    344   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    345   %val = load float, float addrspace(1)* %gep.in
    346   %cmp = fcmp ogt float %val, 2.0
    347   %ext = sext i1 %cmp to i32
    348   store i32 %ext, i32 addrspace(1)* %gep.out
    349   ret void
    350 }
    351 
    352 ; GCN-LABEL: {{^}}commute_oge_2.0_f32:
    353 ; GCN: v_cmp_le_f32_e32 vcc, 2.0, v{{[0-9]+}}
    354 define void @commute_oge_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    355   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    356   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    357   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    358   %val = load float, float addrspace(1)* %gep.in
    359   %cmp = fcmp oge float %val, 2.0
    360   %ext = sext i1 %cmp to i32
    361   store i32 %ext, i32 addrspace(1)* %gep.out
    362   ret void
    363 }
    364 
    365 ; GCN-LABEL: {{^}}commute_olt_2.0_f32:
    366 ; GCN: v_cmp_gt_f32_e32 vcc, 2.0, v{{[0-9]+}}
    367 define void @commute_olt_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    368   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    369   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    370   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    371   %val = load float, float addrspace(1)* %gep.in
    372   %cmp = fcmp olt float %val, 2.0
    373   %ext = sext i1 %cmp to i32
    374   store i32 %ext, i32 addrspace(1)* %gep.out
    375   ret void
    376 }
    377 
    378 ; GCN-LABEL: {{^}}commute_ole_2.0_f32:
    379 ; GCN: v_cmp_ge_f32_e32 vcc, 2.0, v{{[0-9]+}}
    380 define void @commute_ole_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    381   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    382   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    383   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    384   %val = load float, float addrspace(1)* %gep.in
    385   %cmp = fcmp ole float %val, 2.0
    386   %ext = sext i1 %cmp to i32
    387   store i32 %ext, i32 addrspace(1)* %gep.out
    388   ret void
    389 }
    390 
    391 ; GCN-LABEL: {{^}}commute_one_2.0_f32:
    392 ; GCN: v_cmp_lg_f32_e32 vcc, 2.0, v{{[0-9]+}}
    393 define void @commute_one_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    394   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    395   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    396   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    397   %val = load float, float addrspace(1)* %gep.in
    398   %cmp = fcmp one float %val, 2.0
    399   %ext = sext i1 %cmp to i32
    400   store i32 %ext, i32 addrspace(1)* %gep.out
    401   ret void
    402 }
    403 
    404 ; GCN-LABEL: {{^}}commute_ord_2.0_f32:
    405 ; GCN: v_cmp_o_f32_e32 vcc, [[REG:v[0-9]+]], [[REG]]
    406 define void @commute_ord_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    407   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    408   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    409   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    410   %val = load float, float addrspace(1)* %gep.in
    411   %cmp = fcmp ord float %val, 2.0
    412   %ext = sext i1 %cmp to i32
    413   store i32 %ext, i32 addrspace(1)* %gep.out
    414   ret void
    415 }
    416 
    417 ; GCN-LABEL: {{^}}commute_ueq_2.0_f32:
    418 ; GCN: v_cmp_nlg_f32_e32 vcc, 2.0, v{{[0-9]+}}
    419 define void @commute_ueq_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    420   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    421   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    422   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    423   %val = load float, float addrspace(1)* %gep.in
    424   %cmp = fcmp ueq float %val, 2.0
    425   %ext = sext i1 %cmp to i32
    426   store i32 %ext, i32 addrspace(1)* %gep.out
    427   ret void
    428 }
    429 
    430 ; GCN-LABEL: {{^}}commute_ugt_2.0_f32:
    431 ; GCN: v_cmp_nge_f32_e32 vcc, 2.0, v{{[0-9]+}}
    432 define void @commute_ugt_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    433   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    434   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    435   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    436   %val = load float, float addrspace(1)* %gep.in
    437   %cmp = fcmp ugt float %val, 2.0
    438   %ext = sext i1 %cmp to i32
    439   store i32 %ext, i32 addrspace(1)* %gep.out
    440   ret void
    441 }
    442 
    443 ; GCN-LABEL: {{^}}commute_uge_2.0_f32:
    444 ; GCN: v_cmp_ngt_f32_e32 vcc, 2.0, v{{[0-9]+}}
    445 define void @commute_uge_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    446   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    447   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    448   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    449   %val = load float, float addrspace(1)* %gep.in
    450   %cmp = fcmp uge float %val, 2.0
    451   %ext = sext i1 %cmp to i32
    452   store i32 %ext, i32 addrspace(1)* %gep.out
    453   ret void
    454 }
    455 
    456 ; GCN-LABEL: {{^}}commute_ult_2.0_f32:
    457 ; GCN: v_cmp_nle_f32_e32 vcc, 2.0, v{{[0-9]+}}
    458 define void @commute_ult_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    459   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    460   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    461   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    462   %val = load float, float addrspace(1)* %gep.in
    463   %cmp = fcmp ult float %val, 2.0
    464   %ext = sext i1 %cmp to i32
    465   store i32 %ext, i32 addrspace(1)* %gep.out
    466   ret void
    467 }
    468 
    469 ; GCN-LABEL: {{^}}commute_ule_2.0_f32:
    470 ; GCN: v_cmp_nlt_f32_e32 vcc, 2.0, v{{[0-9]+}}
    471 define void @commute_ule_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    472   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    473   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    474   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    475   %val = load float, float addrspace(1)* %gep.in
    476   %cmp = fcmp ule float %val, 2.0
    477   %ext = sext i1 %cmp to i32
    478   store i32 %ext, i32 addrspace(1)* %gep.out
    479   ret void
    480 }
    481 
    482 ; GCN-LABEL: {{^}}commute_une_2.0_f32:
    483 ; GCN: v_cmp_neq_f32_e32 vcc, 2.0, v{{[0-9]+}}
    484 define void @commute_une_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    485   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    486   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    487   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    488   %val = load float, float addrspace(1)* %gep.in
    489   %cmp = fcmp une float %val, 2.0
    490   %ext = sext i1 %cmp to i32
    491   store i32 %ext, i32 addrspace(1)* %gep.out
    492   ret void
    493 }
    494 
    495 ; GCN-LABEL: {{^}}commute_uno_2.0_f32:
    496 ; GCN: v_cmp_u_f32_e32 vcc, [[REG:v[0-9]+]], [[REG]]
    497 define void @commute_uno_2.0_f32(i32 addrspace(1)* %out, float addrspace(1)* %in) #1 {
    498   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    499   %gep.in = getelementptr float, float addrspace(1)* %in, i32 %tid
    500   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    501   %val = load float, float addrspace(1)* %gep.in
    502   %cmp = fcmp uno float %val, 2.0
    503   %ext = sext i1 %cmp to i32
    504   store i32 %ext, i32 addrspace(1)* %gep.out
    505   ret void
    506 }
    507 
    508 ; --------------------------------------------------------------------------------
    509 ; f64 compares
    510 ; --------------------------------------------------------------------------------
    511 
    512 
    513 ; GCN-LABEL: {{^}}commute_oeq_2.0_f64:
    514 ; GCN: v_cmp_eq_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    515 define void @commute_oeq_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    516   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    517   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    518   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    519   %val = load double, double addrspace(1)* %gep.in
    520   %cmp = fcmp oeq double %val, 2.0
    521   %ext = sext i1 %cmp to i32
    522   store i32 %ext, i32 addrspace(1)* %gep.out
    523   ret void
    524 }
    525 
    526 
    527 ; GCN-LABEL: {{^}}commute_ogt_2.0_f64:
    528 ; GCN: v_cmp_lt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    529 define void @commute_ogt_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    530   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    531   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    532   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    533   %val = load double, double addrspace(1)* %gep.in
    534   %cmp = fcmp ogt double %val, 2.0
    535   %ext = sext i1 %cmp to i32
    536   store i32 %ext, i32 addrspace(1)* %gep.out
    537   ret void
    538 }
    539 
    540 ; GCN-LABEL: {{^}}commute_oge_2.0_f64:
    541 ; GCN: v_cmp_le_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    542 define void @commute_oge_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    543   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    544   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    545   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    546   %val = load double, double addrspace(1)* %gep.in
    547   %cmp = fcmp oge double %val, 2.0
    548   %ext = sext i1 %cmp to i32
    549   store i32 %ext, i32 addrspace(1)* %gep.out
    550   ret void
    551 }
    552 
    553 ; GCN-LABEL: {{^}}commute_olt_2.0_f64:
    554 ; GCN: v_cmp_gt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    555 define void @commute_olt_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    556   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    557   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    558   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    559   %val = load double, double addrspace(1)* %gep.in
    560   %cmp = fcmp olt double %val, 2.0
    561   %ext = sext i1 %cmp to i32
    562   store i32 %ext, i32 addrspace(1)* %gep.out
    563   ret void
    564 }
    565 
    566 ; GCN-LABEL: {{^}}commute_ole_2.0_f64:
    567 ; GCN: v_cmp_ge_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    568 define void @commute_ole_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    569   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    570   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    571   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    572   %val = load double, double addrspace(1)* %gep.in
    573   %cmp = fcmp ole double %val, 2.0
    574   %ext = sext i1 %cmp to i32
    575   store i32 %ext, i32 addrspace(1)* %gep.out
    576   ret void
    577 }
    578 
    579 ; GCN-LABEL: {{^}}commute_one_2.0_f64:
    580 ; GCN: v_cmp_lg_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    581 define void @commute_one_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    582   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    583   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    584   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    585   %val = load double, double addrspace(1)* %gep.in
    586   %cmp = fcmp one double %val, 2.0
    587   %ext = sext i1 %cmp to i32
    588   store i32 %ext, i32 addrspace(1)* %gep.out
    589   ret void
    590 }
    591 
    592 ; GCN-LABEL: {{^}}commute_ord_2.0_f64:
    593 ; GCN: v_cmp_o_f64_e32 vcc, [[REG:v\[[0-9]+:[0-9]+\]]], [[REG]]
    594 define void @commute_ord_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    595   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    596   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    597   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    598   %val = load double, double addrspace(1)* %gep.in
    599   %cmp = fcmp ord double %val, 2.0
    600   %ext = sext i1 %cmp to i32
    601   store i32 %ext, i32 addrspace(1)* %gep.out
    602   ret void
    603 }
    604 
    605 ; GCN-LABEL: {{^}}commute_ueq_2.0_f64:
    606 ; GCN: v_cmp_nlg_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    607 define void @commute_ueq_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    608   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    609   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    610   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    611   %val = load double, double addrspace(1)* %gep.in
    612   %cmp = fcmp ueq double %val, 2.0
    613   %ext = sext i1 %cmp to i32
    614   store i32 %ext, i32 addrspace(1)* %gep.out
    615   ret void
    616 }
    617 
    618 ; GCN-LABEL: {{^}}commute_ugt_2.0_f64:
    619 ; GCN: v_cmp_nge_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    620 define void @commute_ugt_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    621   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    622   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    623   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    624   %val = load double, double addrspace(1)* %gep.in
    625   %cmp = fcmp ugt double %val, 2.0
    626   %ext = sext i1 %cmp to i32
    627   store i32 %ext, i32 addrspace(1)* %gep.out
    628   ret void
    629 }
    630 
    631 ; GCN-LABEL: {{^}}commute_uge_2.0_f64:
    632 ; GCN: v_cmp_ngt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    633 define void @commute_uge_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    634   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    635   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    636   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    637   %val = load double, double addrspace(1)* %gep.in
    638   %cmp = fcmp uge double %val, 2.0
    639   %ext = sext i1 %cmp to i32
    640   store i32 %ext, i32 addrspace(1)* %gep.out
    641   ret void
    642 }
    643 
    644 ; GCN-LABEL: {{^}}commute_ult_2.0_f64:
    645 ; GCN: v_cmp_nle_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    646 define void @commute_ult_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    647   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    648   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    649   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    650   %val = load double, double addrspace(1)* %gep.in
    651   %cmp = fcmp ult double %val, 2.0
    652   %ext = sext i1 %cmp to i32
    653   store i32 %ext, i32 addrspace(1)* %gep.out
    654   ret void
    655 }
    656 
    657 ; GCN-LABEL: {{^}}commute_ule_2.0_f64:
    658 ; GCN: v_cmp_nlt_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    659 define void @commute_ule_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    660   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    661   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    662   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    663   %val = load double, double addrspace(1)* %gep.in
    664   %cmp = fcmp ule double %val, 2.0
    665   %ext = sext i1 %cmp to i32
    666   store i32 %ext, i32 addrspace(1)* %gep.out
    667   ret void
    668 }
    669 
    670 ; GCN-LABEL: {{^}}commute_une_2.0_f64:
    671 ; GCN: v_cmp_neq_f64_e32 vcc, 2.0, v{{\[[0-9]+:[0-9]+\]}}
    672 define void @commute_une_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    673   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    674   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    675   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    676   %val = load double, double addrspace(1)* %gep.in
    677   %cmp = fcmp une double %val, 2.0
    678   %ext = sext i1 %cmp to i32
    679   store i32 %ext, i32 addrspace(1)* %gep.out
    680   ret void
    681 }
    682 
    683 ; GCN-LABEL: {{^}}commute_uno_2.0_f64:
    684 ; GCN: v_cmp_u_f64_e32 vcc, [[REG:v\[[0-9]+:[0-9]+\]]], [[REG]]
    685 define void @commute_uno_2.0_f64(i32 addrspace(1)* %out, double addrspace(1)* %in) #1 {
    686   %tid = call i32 @llvm.amdgcn.workitem.id.x() #0
    687   %gep.in = getelementptr double, double addrspace(1)* %in, i32 %tid
    688   %gep.out = getelementptr i32, i32 addrspace(1)* %out, i32 %tid
    689   %val = load double, double addrspace(1)* %gep.in
    690   %cmp = fcmp uno double %val, 2.0
    691   %ext = sext i1 %cmp to i32
    692   store i32 %ext, i32 addrspace(1)* %gep.out
    693   ret void
    694 }
    695 
    696 attributes #0 = { nounwind readnone }
    697 attributes #1 = { nounwind }
    698