Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
      2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
      3 
      4 ; FUNC-LABEL {{^}}sextload_i1_to_i32_trunc_cmp_eq_0:
      5 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
      6 ; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]]
      7 ; SI: v_cmp_eq_i32_e32 vcc, 1, [[TMP]]{{$}}
      8 ; SI: s_xor_b64 s{{\[[0-9]+:[0-9]+\]}}, vcc, -1{{$}}
      9 ; SI: v_cndmask_b32_e64
     10 ; SI: buffer_store_byte
     11 define void @sextload_i1_to_i32_trunc_cmp_eq_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     12   %load = load i1, i1 addrspace(1)* %in
     13   %ext = sext i1 %load to i32
     14   %cmp = icmp eq i32 %ext, 0
     15   store i1 %cmp, i1 addrspace(1)* %out
     16   ret void
     17 }
     18 
     19 ; FIXME: The negate should be inverting the compare.
     20 ; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_eq_0:
     21 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
     22 ; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]]
     23 ; SI: v_cmp_eq_i32_e32 vcc, 1, [[TMP]]{{$}}
     24 ; SI-NEXT: s_xor_b64 [[NEG:s\[[0-9]+:[0-9]+\]]], vcc, -1
     25 ; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[NEG]]
     26 ; SI-NEXT: buffer_store_byte [[RESULT]]
     27 define void @zextload_i1_to_i32_trunc_cmp_eq_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     28   %load = load i1, i1 addrspace(1)* %in
     29   %ext = zext i1 %load to i32
     30   %cmp = icmp eq i32 %ext, 0
     31   store i1 %cmp, i1 addrspace(1)* %out
     32   ret void
     33 }
     34 
     35 ; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_eq_1:
     36 ; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}}
     37 ; SI: buffer_store_byte [[RESULT]]
     38 define void @sextload_i1_to_i32_trunc_cmp_eq_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     39   %load = load i1, i1 addrspace(1)* %in
     40   %ext = sext i1 %load to i32
     41   %cmp = icmp eq i32 %ext, 1
     42   store i1 %cmp, i1 addrspace(1)* %out
     43   ret void
     44 }
     45 
     46 ; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_eq_1:
     47 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
     48 ; SI: v_and_b32_e32 [[RESULT:v[0-9]+]], 1, [[LOAD]]
     49 ; SI-NEXT: buffer_store_byte [[RESULT]]
     50 define void @zextload_i1_to_i32_trunc_cmp_eq_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     51   %load = load i1, i1 addrspace(1)* %in
     52   %ext = zext i1 %load to i32
     53   %cmp = icmp eq i32 %ext, 1
     54   store i1 %cmp, i1 addrspace(1)* %out
     55   ret void
     56 }
     57 
     58 ; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_eq_neg1:
     59 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
     60 ; SI: v_and_b32_e32 [[RESULT:v[0-9]+]], 1, [[LOAD]]
     61 ; SI-NEXT: buffer_store_byte [[RESULT]]
     62 define void @sextload_i1_to_i32_trunc_cmp_eq_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     63   %load = load i1, i1 addrspace(1)* %in
     64   %ext = sext i1 %load to i32
     65   %cmp = icmp eq i32 %ext, -1
     66   store i1 %cmp, i1 addrspace(1)* %out
     67   ret void
     68 }
     69 
     70 ; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_eq_neg1:
     71 ; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 0{{$}}
     72 ; SI: buffer_store_byte [[RESULT]]
     73 define void @zextload_i1_to_i32_trunc_cmp_eq_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     74   %load = load i1, i1 addrspace(1)* %in
     75   %ext = zext i1 %load to i32
     76   %cmp = icmp eq i32 %ext, -1
     77   store i1 %cmp, i1 addrspace(1)* %out
     78   ret void
     79 }
     80 
     81 
     82 ; FUNC-LABEL {{^}}sextload_i1_to_i32_trunc_cmp_ne_0:
     83 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
     84 ; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]]
     85 ; SI-NEXT: buffer_store_byte [[RESULT]]
     86 define void @sextload_i1_to_i32_trunc_cmp_ne_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     87   %load = load i1, i1 addrspace(1)* %in
     88   %ext = sext i1 %load to i32
     89   %cmp = icmp ne i32 %ext, 0
     90   store i1 %cmp, i1 addrspace(1)* %out
     91   ret void
     92 }
     93 
     94 ; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_ne_0:
     95 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
     96 ; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]]
     97 ; SI-NEXT: buffer_store_byte [[RESULT]]
     98 define void @zextload_i1_to_i32_trunc_cmp_ne_0(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
     99   %load = load i1, i1 addrspace(1)* %in
    100   %ext = zext i1 %load to i32
    101   %cmp = icmp ne i32 %ext, 0
    102   store i1 %cmp, i1 addrspace(1)* %out
    103   ret void
    104 }
    105 
    106 ; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_ne_1:
    107 ; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}}
    108 ; SI: buffer_store_byte [[RESULT]]
    109 define void @sextload_i1_to_i32_trunc_cmp_ne_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
    110   %load = load i1, i1 addrspace(1)* %in
    111   %ext = sext i1 %load to i32
    112   %cmp = icmp ne i32 %ext, 1
    113   store i1 %cmp, i1 addrspace(1)* %out
    114   ret void
    115 }
    116 
    117 ; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_ne_1:
    118 ; SI: buffer_load_ubyte [[LOAD:v[0-9]+]]
    119 ; SI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]]
    120 ; SI: v_cmp_eq_i32_e32 vcc, 1, [[TMP]]{{$}}
    121 ; SI-NEXT: s_xor_b64 [[NEG:s\[[0-9]+:[0-9]+\]]], vcc, -1
    122 ; SI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[NEG]]
    123 ; SI-NEXT: buffer_store_byte [[RESULT]]
    124 define void @zextload_i1_to_i32_trunc_cmp_ne_1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
    125   %load = load i1, i1 addrspace(1)* %in
    126   %ext = zext i1 %load to i32
    127   %cmp = icmp ne i32 %ext, 1
    128   store i1 %cmp, i1 addrspace(1)* %out
    129   ret void
    130 }
    131 
    132 ; FIXME: This should be one compare.
    133 ; FUNC-LABEL: {{^}}sextload_i1_to_i32_trunc_cmp_ne_neg1:
    134 ; XSI: buffer_load_ubyte [[LOAD:v[0-9]+]]
    135 ; XSI: v_and_b32_e32 [[TMP:v[0-9]+]], 1, [[LOAD]]
    136 ; XSI: v_cmp_eq_i32_e64 [[CMP0:s\[[0-9]+:[0-9]+\]]], [[TMP]], 0{{$}}
    137 ; XSI-NEXT: v_cndmask_b32_e64 [[RESULT:v[0-9]+]], 0, 1, [[CMP0]]
    138 ; XSI-NEXT: buffer_store_byte [[RESULT]]
    139 define void @sextload_i1_to_i32_trunc_cmp_ne_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
    140   %load = load i1, i1 addrspace(1)* %in
    141   %ext = sext i1 %load to i32
    142   %cmp = icmp ne i32 %ext, -1
    143   store i1 %cmp, i1 addrspace(1)* %out
    144   ret void
    145 }
    146 
    147 ; FUNC-LABEL: {{^}}zextload_i1_to_i32_trunc_cmp_ne_neg1:
    148 ; SI: v_mov_b32_e32 [[RESULT:v[0-9]+]], 1{{$}}
    149 ; SI: buffer_store_byte [[RESULT]]
    150 define void @zextload_i1_to_i32_trunc_cmp_ne_neg1(i1 addrspace(1)* %out, i1 addrspace(1)* %in) nounwind {
    151   %load = load i1, i1 addrspace(1)* %in
    152   %ext = zext i1 %load to i32
    153   %cmp = icmp ne i32 %ext, -1
    154   store i1 %cmp, i1 addrspace(1)* %out
    155   ret void
    156 }
    157 
    158 ; FUNC-LABEL: {{^}}masked_load_i1_to_i32_trunc_cmp_ne_neg1:
    159 ; SI: buffer_load_sbyte [[LOAD:v[0-9]+]]
    160 ; SI: v_cmp_ne_i32_e32 vcc, -1, [[LOAD]]{{$}}
    161 ; SI-NEXT: v_cndmask_b32_e64
    162 ; SI-NEXT: buffer_store_byte
    163 define void @masked_load_i1_to_i32_trunc_cmp_ne_neg1(i1 addrspace(1)* %out, i8 addrspace(1)* %in) nounwind {
    164   %load = load i8, i8 addrspace(1)* %in
    165   %masked = and i8 %load, 255
    166   %ext = sext i8 %masked to i32
    167   %cmp = icmp ne i32 %ext, -1
    168   store i1 %cmp, i1 addrspace(1)* %out
    169   ret void
    170 }
    171