1 ;RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck --check-prefix=SI --check-prefix=GCN --check-prefix=FUNC %s 2 ;RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck --check-prefix=VI --check-prefix=GCN --check-prefix=FUNC %s 3 ;RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck --check-prefix=EG --check-prefix=FUNC %s 4 5 ;FUNC-LABEL: {{^}}test_udiv: 6 ;EG: RECIP_UINT 7 ;EG: LSHL {{.*}}, 1, 8 ;EG: BFE_UINT 9 ;EG: BFE_UINT 10 ;EG: BFE_UINT 11 ;EG: BFE_UINT 12 ;EG: BFE_UINT 13 ;EG: BFE_UINT 14 ;EG: BFE_UINT 15 ;EG: BFE_UINT 16 ;EG: BFE_UINT 17 ;EG: BFE_UINT 18 ;EG: BFE_UINT 19 ;EG: BFE_UINT 20 ;EG: BFE_UINT 21 ;EG: BFE_UINT 22 ;EG: BFE_UINT 23 ;EG: BFE_UINT 24 ;EG: BFE_UINT 25 ;EG: BFE_UINT 26 ;EG: BFE_UINT 27 ;EG: BFE_UINT 28 ;EG: BFE_UINT 29 ;EG: BFE_UINT 30 ;EG: BFE_UINT 31 ;EG: BFE_UINT 32 ;EG: BFE_UINT 33 ;EG: BFE_UINT 34 ;EG: BFE_UINT 35 ;EG: BFE_UINT 36 ;EG: BFE_UINT 37 ;EG: BFE_UINT 38 39 ;GCN: s_bfe_u32 40 ;GCN: s_bfe_u32 41 ;GCN: s_bfe_u32 42 ;GCN: s_bfe_u32 43 ;GCN: s_bfe_u32 44 ;GCN: s_bfe_u32 45 ;GCN: s_bfe_u32 46 ;GCN: s_bfe_u32 47 ;GCN: s_bfe_u32 48 ;GCN: s_bfe_u32 49 ;GCN: s_bfe_u32 50 ;GCN: s_bfe_u32 51 ;GCN: s_bfe_u32 52 ;GCN: s_bfe_u32 53 ;GCN: s_bfe_u32 54 ;GCN: s_bfe_u32 55 ;GCN: s_bfe_u32 56 ;GCN: s_bfe_u32 57 ;GCN: s_bfe_u32 58 ;GCN: s_bfe_u32 59 ;GCN: s_bfe_u32 60 ;GCN: s_bfe_u32 61 ;GCN: s_bfe_u32 62 ;GCN: s_bfe_u32 63 ;GCN: s_bfe_u32 64 ;GCN: s_bfe_u32 65 ;GCN: s_bfe_u32 66 ;GCN: s_bfe_u32 67 ;GCN: s_bfe_u32 68 ;GCN: s_bfe_u32 69 ;GCN-NOT: v_mad_f32 70 ;SI-NOT: v_lshr_b64 71 ;VI-NOT: v_lshrrev_b64 72 ;GCN: s_endpgm 73 define void @test_udiv(i64 addrspace(1)* %out, i64 %x, i64 %y) { 74 %result = udiv i64 %x, %y 75 store i64 %result, i64 addrspace(1)* %out 76 ret void 77 } 78 79 ;FUNC-LABEL: {{^}}test_urem: 80 ;EG: RECIP_UINT 81 ;EG: BFE_UINT 82 ;EG: BFE_UINT 83 ;EG: BFE_UINT 84 ;EG: BFE_UINT 85 ;EG: BFE_UINT 86 ;EG: BFE_UINT 87 ;EG: BFE_UINT 88 ;EG: BFE_UINT 89 ;EG: BFE_UINT 90 ;EG: BFE_UINT 91 ;EG: BFE_UINT 92 ;EG: BFE_UINT 93 ;EG: BFE_UINT 94 ;EG: BFE_UINT 95 ;EG: BFE_UINT 96 ;EG: BFE_UINT 97 ;EG: BFE_UINT 98 ;EG: BFE_UINT 99 ;EG: BFE_UINT 100 ;EG: BFE_UINT 101 ;EG: BFE_UINT 102 ;EG: BFE_UINT 103 ;EG: BFE_UINT 104 ;EG: BFE_UINT 105 ;EG: BFE_UINT 106 ;EG: BFE_UINT 107 ;EG: BFE_UINT 108 ;EG: BFE_UINT 109 ;EG: BFE_UINT 110 ;EG: BFE_UINT 111 ;EG: AND_INT {{.*}}, 1, 112 113 ;GCN: s_bfe_u32 114 ;GCN: s_bfe_u32 115 ;GCN: s_bfe_u32 116 ;GCN: s_bfe_u32 117 ;GCN: s_bfe_u32 118 ;GCN: s_bfe_u32 119 ;GCN: s_bfe_u32 120 ;GCN: s_bfe_u32 121 ;GCN: s_bfe_u32 122 ;GCN: s_bfe_u32 123 ;GCN: s_bfe_u32 124 ;GCN: s_bfe_u32 125 ;GCN: s_bfe_u32 126 ;GCN: s_bfe_u32 127 ;GCN: s_bfe_u32 128 ;GCN: s_bfe_u32 129 ;GCN: s_bfe_u32 130 ;GCN: s_bfe_u32 131 ;GCN: s_bfe_u32 132 ;GCN: s_bfe_u32 133 ;GCN: s_bfe_u32 134 ;GCN: s_bfe_u32 135 ;GCN: s_bfe_u32 136 ;GCN: s_bfe_u32 137 ;GCN: s_bfe_u32 138 ;GCN: s_bfe_u32 139 ;GCN: s_bfe_u32 140 ;GCN: s_bfe_u32 141 ;GCN: s_bfe_u32 142 ;GCN: s_bfe_u32 143 ;GCN-NOT: v_mad_f32 144 ;SI-NOT: v_lshr_b64 145 ;VI-NOT: v_lshrrev_b64 146 ;GCN: s_endpgm 147 define void @test_urem(i64 addrspace(1)* %out, i64 %x, i64 %y) { 148 %result = urem i64 %x, %y 149 store i64 %result, i64 addrspace(1)* %out 150 ret void 151 } 152 153 ;FUNC-LABEL: {{^}}test_udiv3264: 154 ;EG: RECIP_UINT 155 ;EG-NOT: BFE_UINT 156 157 ;GCN-NOT: s_bfe_u32 158 ;GCN-NOT: v_mad_f32 159 ;SI-NOT: v_lshr_b64 160 ;VI-NOT: v_lshrrev_b64 161 ;GCN: s_endpgm 162 define void @test_udiv3264(i64 addrspace(1)* %out, i64 %x, i64 %y) { 163 %1 = lshr i64 %x, 33 164 %2 = lshr i64 %y, 33 165 %result = udiv i64 %1, %2 166 store i64 %result, i64 addrspace(1)* %out 167 ret void 168 } 169 170 ;FUNC-LABEL: {{^}}test_urem3264: 171 ;EG: RECIP_UINT 172 ;EG-NOT: BFE_UINT 173 174 ;GCN-NOT: s_bfe_u32 175 ;GCN-NOT: v_mad_f32 176 ;SI-NOT: v_lshr_b64 177 ;VI-NOT: v_lshrrev_b64 178 ;GCN: s_endpgm 179 define void @test_urem3264(i64 addrspace(1)* %out, i64 %x, i64 %y) { 180 %1 = lshr i64 %x, 33 181 %2 = lshr i64 %y, 33 182 %result = urem i64 %1, %2 183 store i64 %result, i64 addrspace(1)* %out 184 ret void 185 } 186 187 ;FUNC-LABEL: {{^}}test_udiv2464: 188 ;EG: UINT_TO_FLT 189 ;EG: UINT_TO_FLT 190 ;EG: FLT_TO_UINT 191 ;EG-NOT: RECIP_UINT 192 ;EG-NOT: BFE_UINT 193 194 ;SI-NOT: v_lshr_b64 195 ;VI-NOT: v_lshrrev_b64 196 ;GCN: v_mad_f32 197 ;GCN: s_endpgm 198 define void @test_udiv2464(i64 addrspace(1)* %out, i64 %x, i64 %y) { 199 %1 = lshr i64 %x, 40 200 %2 = lshr i64 %y, 40 201 %result = udiv i64 %1, %2 202 store i64 %result, i64 addrspace(1)* %out 203 ret void 204 } 205 206 ;FUNC-LABEL: {{^}}test_urem2464: 207 ;EG: UINT_TO_FLT 208 ;EG: UINT_TO_FLT 209 ;EG: FLT_TO_UINT 210 ;EG-NOT: RECIP_UINT 211 ;EG-NOT: BFE_UINT 212 213 ;SI-NOT: v_lshr_b64 214 ;VI-NOT: v_lshrrev_b64 215 ;GCN: v_mad_f32 216 ;GCN: s_endpgm 217 define void @test_urem2464(i64 addrspace(1)* %out, i64 %x, i64 %y) { 218 %1 = lshr i64 %x, 40 219 %2 = lshr i64 %y, 40 220 %result = urem i64 %1, %2 221 store i64 %result, i64 addrspace(1)* %out 222 ret void 223 } 224