1 ; RUN: llc < %s -mtriple=armv8-linux-gnueabihf -mattr=+fp-armv8 -float-abi=hard | FileCheck %s 2 @varfloat = global float 0.0 3 @vardouble = global double 0.0 4 define void @test_vsel32sgt(i32 %lhs32, i32 %rhs32, float %a, float %b) { 5 ; CHECK: test_vsel32sgt 6 %tst1 = icmp sgt i32 %lhs32, %rhs32 7 %val1 = select i1 %tst1, float %a, float %b 8 store float %val1, float* @varfloat 9 ; CHECK: cmp r0, r1 10 ; CHECK: vselgt.f32 s0, s0, s1 11 ret void 12 } 13 define void @test_vsel64sgt(i32 %lhs32, i32 %rhs32, double %a, double %b) { 14 ; CHECK: test_vsel64sgt 15 %tst1 = icmp sgt i32 %lhs32, %rhs32 16 %val1 = select i1 %tst1, double %a, double %b 17 store double %val1, double* @vardouble 18 ; CHECK: cmp r0, r1 19 ; CHECK: vselgt.f64 d16, d0, d1 20 ret void 21 } 22 define void @test_vsel32sge(i32 %lhs32, i32 %rhs32, float %a, float %b) { 23 ; CHECK: test_vsel32sge 24 %tst1 = icmp sge i32 %lhs32, %rhs32 25 %val1 = select i1 %tst1, float %a, float %b 26 store float %val1, float* @varfloat 27 ; CHECK: cmp r0, r1 28 ; CHECK: vselge.f32 s0, s0, s1 29 ret void 30 } 31 define void @test_vsel64sge(i32 %lhs32, i32 %rhs32, double %a, double %b) { 32 ; CHECK: test_vsel64sge 33 %tst1 = icmp sge i32 %lhs32, %rhs32 34 %val1 = select i1 %tst1, double %a, double %b 35 store double %val1, double* @vardouble 36 ; CHECK: cmp r0, r1 37 ; CHECK: vselge.f64 d16, d0, d1 38 ret void 39 } 40 define void @test_vsel32eq(i32 %lhs32, i32 %rhs32, float %a, float %b) { 41 ; CHECK: test_vsel32eq 42 %tst1 = icmp eq i32 %lhs32, %rhs32 43 %val1 = select i1 %tst1, float %a, float %b 44 store float %val1, float* @varfloat 45 ; CHECK: cmp r0, r1 46 ; CHECK: vseleq.f32 s0, s0, s1 47 ret void 48 } 49 define void @test_vsel64eq(i32 %lhs32, i32 %rhs32, double %a, double %b) { 50 ; CHECK: test_vsel64eq 51 %tst1 = icmp eq i32 %lhs32, %rhs32 52 %val1 = select i1 %tst1, double %a, double %b 53 store double %val1, double* @vardouble 54 ; CHECK: cmp r0, r1 55 ; CHECK: vseleq.f64 d16, d0, d1 56 ret void 57 } 58 define void @test_vsel32slt(i32 %lhs32, i32 %rhs32, float %a, float %b) { 59 ; CHECK: test_vsel32slt 60 %tst1 = icmp slt i32 %lhs32, %rhs32 61 %val1 = select i1 %tst1, float %a, float %b 62 store float %val1, float* @varfloat 63 ; CHECK: cmp r0, r1 64 ; CHECK: vselge.f32 s0, s1, s0 65 ret void 66 } 67 define void @test_vsel64slt(i32 %lhs32, i32 %rhs32, double %a, double %b) { 68 ; CHECK: test_vsel64slt 69 %tst1 = icmp slt i32 %lhs32, %rhs32 70 %val1 = select i1 %tst1, double %a, double %b 71 store double %val1, double* @vardouble 72 ; CHECK: cmp r0, r1 73 ; CHECK: vselge.f64 d16, d1, d0 74 ret void 75 } 76 define void @test_vsel32sle(i32 %lhs32, i32 %rhs32, float %a, float %b) { 77 ; CHECK: test_vsel32sle 78 %tst1 = icmp sle i32 %lhs32, %rhs32 79 %val1 = select i1 %tst1, float %a, float %b 80 store float %val1, float* @varfloat 81 ; CHECK: cmp r0, r1 82 ; CHECK: vselgt.f32 s0, s1, s0 83 ret void 84 } 85 define void @test_vsel64sle(i32 %lhs32, i32 %rhs32, double %a, double %b) { 86 ; CHECK: test_vsel64sle 87 %tst1 = icmp sle i32 %lhs32, %rhs32 88 %val1 = select i1 %tst1, double %a, double %b 89 store double %val1, double* @vardouble 90 ; CHECK: cmp r0, r1 91 ; CHECK: vselgt.f64 d16, d1, d0 92 ret void 93 } 94 define void @test_vsel32ogt(float %lhs32, float %rhs32, float %a, float %b) { 95 ; CHECK: test_vsel32ogt 96 %tst1 = fcmp ogt float %lhs32, %rhs32 97 %val1 = select i1 %tst1, float %a, float %b 98 store float %val1, float* @varfloat 99 ; CHECK: vcmpe.f32 s0, s1 100 ; CHECK: vselgt.f32 s0, s2, s3 101 ret void 102 } 103 define void @test_vsel64ogt(float %lhs32, float %rhs32, double %a, double %b) { 104 ; CHECK: test_vsel64ogt 105 %tst1 = fcmp ogt float %lhs32, %rhs32 106 %val1 = select i1 %tst1, double %a, double %b 107 store double %val1, double* @vardouble 108 ; CHECK: vcmpe.f32 s0, s1 109 ; CHECK: vselgt.f64 d16, d1, d2 110 ret void 111 } 112 define void @test_vsel32oge(float %lhs32, float %rhs32, float %a, float %b) { 113 ; CHECK: test_vsel32oge 114 %tst1 = fcmp oge float %lhs32, %rhs32 115 %val1 = select i1 %tst1, float %a, float %b 116 store float %val1, float* @varfloat 117 ; CHECK: vcmpe.f32 s0, s1 118 ; CHECK: vselge.f32 s0, s2, s3 119 ret void 120 } 121 define void @test_vsel64oge(float %lhs32, float %rhs32, double %a, double %b) { 122 ; CHECK: test_vsel64oge 123 %tst1 = fcmp oge float %lhs32, %rhs32 124 %val1 = select i1 %tst1, double %a, double %b 125 store double %val1, double* @vardouble 126 ; CHECK: vcmpe.f32 s0, s1 127 ; CHECK: vselge.f64 d16, d1, d2 128 ret void 129 } 130 define void @test_vsel32oeq(float %lhs32, float %rhs32, float %a, float %b) { 131 ; CHECK: test_vsel32oeq 132 %tst1 = fcmp oeq float %lhs32, %rhs32 133 %val1 = select i1 %tst1, float %a, float %b 134 store float %val1, float* @varfloat 135 ; CHECK: vcmpe.f32 s0, s1 136 ; CHECK: vseleq.f32 s0, s2, s3 137 ret void 138 } 139 define void @test_vsel64oeq(float %lhs32, float %rhs32, double %a, double %b) { 140 ; CHECK: test_vsel64oeq 141 %tst1 = fcmp oeq float %lhs32, %rhs32 142 %val1 = select i1 %tst1, double %a, double %b 143 store double %val1, double* @vardouble 144 ; CHECK: vcmpe.f32 s0, s1 145 ; CHECK: vseleq.f64 d16, d1, d2 146 ret void 147 } 148 define void @test_vsel32ugt(float %lhs32, float %rhs32, float %a, float %b) { 149 ; CHECK: test_vsel32ugt 150 %tst1 = fcmp ugt float %lhs32, %rhs32 151 %val1 = select i1 %tst1, float %a, float %b 152 store float %val1, float* @varfloat 153 ; CHECK: vcmpe.f32 s1, s0 154 ; CHECK: vselge.f32 s0, s3, s2 155 ret void 156 } 157 define void @test_vsel64ugt(float %lhs32, float %rhs32, double %a, double %b) { 158 ; CHECK: test_vsel64ugt 159 %tst1 = fcmp ugt float %lhs32, %rhs32 160 %val1 = select i1 %tst1, double %a, double %b 161 store double %val1, double* @vardouble 162 ; CHECK: vcmpe.f32 s1, s0 163 ; CHECK: vselge.f64 d16, d2, d1 164 ret void 165 } 166 define void @test_vsel32uge(float %lhs32, float %rhs32, float %a, float %b) { 167 ; CHECK: test_vsel32uge 168 %tst1 = fcmp uge float %lhs32, %rhs32 169 %val1 = select i1 %tst1, float %a, float %b 170 store float %val1, float* @varfloat 171 ; CHECK: vcmpe.f32 s1, s0 172 ; CHECK: vselgt.f32 s0, s3, s2 173 ret void 174 } 175 define void @test_vsel64uge(float %lhs32, float %rhs32, double %a, double %b) { 176 ; CHECK: test_vsel64uge 177 %tst1 = fcmp uge float %lhs32, %rhs32 178 %val1 = select i1 %tst1, double %a, double %b 179 store double %val1, double* @vardouble 180 ; CHECK: vcmpe.f32 s1, s0 181 ; CHECK: vselgt.f64 d16, d2, d1 182 ret void 183 } 184 define void @test_vsel32olt(float %lhs32, float %rhs32, float %a, float %b) { 185 ; CHECK: test_vsel32olt 186 %tst1 = fcmp olt float %lhs32, %rhs32 187 %val1 = select i1 %tst1, float %a, float %b 188 store float %val1, float* @varfloat 189 ; CHECK: vcmpe.f32 s1, s0 190 ; CHECK: vselgt.f32 s0, s2, s3 191 ret void 192 } 193 define void @test_vsel64olt(float %lhs32, float %rhs32, double %a, double %b) { 194 ; CHECK: test_vsel64olt 195 %tst1 = fcmp olt float %lhs32, %rhs32 196 %val1 = select i1 %tst1, double %a, double %b 197 store double %val1, double* @vardouble 198 ; CHECK: vcmpe.f32 s1, s0 199 ; CHECK: vselgt.f64 d16, d1, d2 200 ret void 201 } 202 define void @test_vsel32ult(float %lhs32, float %rhs32, float %a, float %b) { 203 ; CHECK: test_vsel32ult 204 %tst1 = fcmp ult float %lhs32, %rhs32 205 %val1 = select i1 %tst1, float %a, float %b 206 store float %val1, float* @varfloat 207 ; CHECK: vcmpe.f32 s0, s1 208 ; CHECK: vselge.f32 s0, s3, s2 209 ret void 210 } 211 define void @test_vsel64ult(float %lhs32, float %rhs32, double %a, double %b) { 212 ; CHECK: test_vsel64ult 213 %tst1 = fcmp ult float %lhs32, %rhs32 214 %val1 = select i1 %tst1, double %a, double %b 215 store double %val1, double* @vardouble 216 ; CHECK: vcmpe.f32 s0, s1 217 ; CHECK: vselge.f64 d16, d2, d1 218 ret void 219 } 220 define void @test_vsel32ole(float %lhs32, float %rhs32, float %a, float %b) { 221 ; CHECK: test_vsel32ole 222 %tst1 = fcmp ole float %lhs32, %rhs32 223 %val1 = select i1 %tst1, float %a, float %b 224 store float %val1, float* @varfloat 225 ; CHECK: vcmpe.f32 s1, s0 226 ; CHECK: vselge.f32 s0, s2, s3 227 ret void 228 } 229 define void @test_vsel64ole(float %lhs32, float %rhs32, double %a, double %b) { 230 ; CHECK: test_vsel64ole 231 %tst1 = fcmp ole float %lhs32, %rhs32 232 %val1 = select i1 %tst1, double %a, double %b 233 store double %val1, double* @vardouble 234 ; CHECK: vcmpe.f32 s1, s0 235 ; CHECK: vselge.f64 d16, d1, d2 236 ret void 237 } 238 define void @test_vsel32ule(float %lhs32, float %rhs32, float %a, float %b) { 239 ; CHECK: test_vsel32ule 240 %tst1 = fcmp ule float %lhs32, %rhs32 241 %val1 = select i1 %tst1, float %a, float %b 242 store float %val1, float* @varfloat 243 ; CHECK: vcmpe.f32 s0, s1 244 ; CHECK: vselgt.f32 s0, s3, s2 245 ret void 246 } 247 define void @test_vsel64ule(float %lhs32, float %rhs32, double %a, double %b) { 248 ; CHECK: test_vsel64ule 249 %tst1 = fcmp ule float %lhs32, %rhs32 250 %val1 = select i1 %tst1, double %a, double %b 251 store double %val1, double* @vardouble 252 ; CHECK: vcmpe.f32 s0, s1 253 ; CHECK: vselgt.f64 d16, d2, d1 254 ret void 255 } 256 define void @test_vsel32ord(float %lhs32, float %rhs32, float %a, float %b) { 257 ; CHECK: test_vsel32ord 258 %tst1 = fcmp ord float %lhs32, %rhs32 259 %val1 = select i1 %tst1, float %a, float %b 260 store float %val1, float* @varfloat 261 ; CHECK: vcmpe.f32 s0, s1 262 ; CHECK: vselvs.f32 s0, s3, s2 263 ret void 264 } 265 define void @test_vsel64ord(float %lhs32, float %rhs32, double %a, double %b) { 266 ; CHECK: test_vsel64ord 267 %tst1 = fcmp ord float %lhs32, %rhs32 268 %val1 = select i1 %tst1, double %a, double %b 269 store double %val1, double* @vardouble 270 ; CHECK: vcmpe.f32 s0, s1 271 ; CHECK: vselvs.f64 d16, d2, d1 272 ret void 273 } 274 define void @test_vsel32une(float %lhs32, float %rhs32, float %a, float %b) { 275 ; CHECK: test_vsel32une 276 %tst1 = fcmp une float %lhs32, %rhs32 277 %val1 = select i1 %tst1, float %a, float %b 278 store float %val1, float* @varfloat 279 ; CHECK: vcmpe.f32 s0, s1 280 ; CHECK: vseleq.f32 s0, s3, s2 281 ret void 282 } 283 define void @test_vsel64une(float %lhs32, float %rhs32, double %a, double %b) { 284 ; CHECK: test_vsel64une 285 %tst1 = fcmp une float %lhs32, %rhs32 286 %val1 = select i1 %tst1, double %a, double %b 287 store double %val1, double* @vardouble 288 ; CHECK: vcmpe.f32 s0, s1 289 ; CHECK: vseleq.f64 d16, d2, d1 290 ret void 291 } 292 define void @test_vsel32uno(float %lhs32, float %rhs32, float %a, float %b) { 293 ; CHECK: test_vsel32uno 294 %tst1 = fcmp uno float %lhs32, %rhs32 295 %val1 = select i1 %tst1, float %a, float %b 296 store float %val1, float* @varfloat 297 ; CHECK: vcmpe.f32 s0, s1 298 ; CHECK: vselvs.f32 s0, s2, s3 299 ret void 300 } 301 define void @test_vsel64uno(float %lhs32, float %rhs32, double %a, double %b) { 302 ; CHECK: test_vsel64uno 303 %tst1 = fcmp uno float %lhs32, %rhs32 304 %val1 = select i1 %tst1, double %a, double %b 305 store double %val1, double* @vardouble 306 ; CHECK: vcmpe.f32 s0, s1 307 ; CHECK: vselvs.f64 d16, d1, d2 308 ret void 309 } 310