1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s 3target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 4target triple = "arm64" 5 6define i1 @test_EQ_IllEbT(i64 %a, i64 %b) { 7; CHECK-LABEL: test_EQ_IllEbT: 8; CHECK: // %bb.0: // %entry 9; CHECK-NEXT: cmn x0, x1 10; CHECK-NEXT: cset w0, eq 11; CHECK-NEXT: ret 12entry: 13 %add = sub i64 0, %b 14 %cmp = icmp eq i64 %add, %a 15 ret i1 %cmp 16} 17 18define i1 @test_EQ_IliEbT(i64 %a, i32 %b) { 19; CHECK-LABEL: test_EQ_IliEbT: 20; CHECK: // %bb.0: // %entry 21; CHECK-NEXT: cmn x0, w1, sxtw 22; CHECK-NEXT: cset w0, eq 23; CHECK-NEXT: ret 24entry: 25 %conv = sext i32 %b to i64 26 %add = sub i64 0, %a 27 %cmp = icmp eq i64 %conv, %add 28 ret i1 %cmp 29} 30 31define i1 @test_EQ_IlsEbT(i64 %a, i16 %b) { 32; CHECK-LABEL: test_EQ_IlsEbT: 33; CHECK: // %bb.0: // %entry 34; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1 35; CHECK-NEXT: cmn x0, w1, sxth 36; CHECK-NEXT: cset w0, eq 37; CHECK-NEXT: ret 38entry: 39 %conv = sext i16 %b to i64 40 %add = sub i64 0, %a 41 %cmp = icmp eq i64 %conv, %add 42 ret i1 %cmp 43} 44 45define i1 @test_EQ_IlcEbT(i64 %a, i8 %b) { 46; CHECK-LABEL: test_EQ_IlcEbT: 47; CHECK: // %bb.0: // %entry 48; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1 49; CHECK-NEXT: cmn x0, w1, uxtb 50; CHECK-NEXT: cset w0, eq 51; CHECK-NEXT: ret 52entry: 53 %conv = zext i8 %b to i64 54 %add = sub i64 0, %a 55 %cmp = icmp eq i64 %conv, %add 56 ret i1 %cmp 57} 58 59define i1 @test_EQ_IilEbT(i32 %a, i64 %b) { 60; CHECK-LABEL: test_EQ_IilEbT: 61; CHECK: // %bb.0: // %entry 62; CHECK-NEXT: cmn x1, w0, sxtw 63; CHECK-NEXT: cset w0, eq 64; CHECK-NEXT: ret 65entry: 66 %conv = sext i32 %a to i64 67 %add = sub i64 0, %b 68 %cmp = icmp eq i64 %conv, %add 69 ret i1 %cmp 70} 71 72define i1 @test_EQ_IiiEbT(i32 %a, i32 %b) { 73; CHECK-LABEL: test_EQ_IiiEbT: 74; CHECK: // %bb.0: // %entry 75; CHECK-NEXT: cmn w0, w1 76; CHECK-NEXT: cset w0, eq 77; CHECK-NEXT: ret 78entry: 79 %add = sub i32 0, %b 80 %cmp = icmp eq i32 %add, %a 81 ret i1 %cmp 82} 83 84define i1 @test_EQ_IisEbT(i32 %a, i16 %b) { 85; CHECK-LABEL: test_EQ_IisEbT: 86; CHECK: // %bb.0: // %entry 87; CHECK-NEXT: cmn w0, w1, sxth 88; CHECK-NEXT: cset w0, eq 89; CHECK-NEXT: ret 90entry: 91 %conv = sext i16 %b to i32 92 %add = sub i32 0, %a 93 %cmp = icmp eq i32 %conv, %add 94 ret i1 %cmp 95} 96 97define i1 @test_EQ_IicEbT(i32 %a, i8 %b) { 98; CHECK-LABEL: test_EQ_IicEbT: 99; CHECK: // %bb.0: // %entry 100; CHECK-NEXT: cmn w0, w1, uxtb 101; CHECK-NEXT: cset w0, eq 102; CHECK-NEXT: ret 103entry: 104 %conv = zext i8 %b to i32 105 %add = sub i32 0, %a 106 %cmp = icmp eq i32 %conv, %add 107 ret i1 %cmp 108} 109 110define i1 @test_EQ_IslEbT(i16 %a, i64 %b) { 111; CHECK-LABEL: test_EQ_IslEbT: 112; CHECK: // %bb.0: // %entry 113; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 114; CHECK-NEXT: cmn x1, w0, sxth 115; CHECK-NEXT: cset w0, eq 116; CHECK-NEXT: ret 117entry: 118 %conv = sext i16 %a to i64 119 %add = sub i64 0, %b 120 %cmp = icmp eq i64 %conv, %add 121 ret i1 %cmp 122} 123 124define i1 @test_EQ_IsiEbT(i16 %a, i32 %b) { 125; CHECK-LABEL: test_EQ_IsiEbT: 126; CHECK: // %bb.0: // %entry 127; CHECK-NEXT: cmn w1, w0, sxth 128; CHECK-NEXT: cset w0, eq 129; CHECK-NEXT: ret 130entry: 131 %conv = sext i16 %a to i32 132 %add = sub i32 0, %b 133 %cmp = icmp eq i32 %conv, %add 134 ret i1 %cmp 135} 136 137define i1 @test_EQ_IssEbT(i16 %a, i16 %b) { 138; CHECK-LABEL: test_EQ_IssEbT: 139; CHECK: // %bb.0: // %entry 140; CHECK-NEXT: sxth w8, w0 141; CHECK-NEXT: cmn w8, w1, sxth 142; CHECK-NEXT: cset w0, eq 143; CHECK-NEXT: ret 144entry: 145 %conv = sext i16 %a to i32 146 %conv1 = sext i16 %b to i32 147 %add = sub nsw i32 0, %conv1 148 %cmp = icmp eq i32 %conv, %add 149 ret i1 %cmp 150} 151 152define i1 @test_EQ_IscEbT(i16 %a, i8 %b) { 153; CHECK-LABEL: test_EQ_IscEbT: 154; CHECK: // %bb.0: // %entry 155; CHECK-NEXT: sxth w8, w0 156; CHECK-NEXT: cmn w8, w1, uxtb 157; CHECK-NEXT: cset w0, eq 158; CHECK-NEXT: ret 159entry: 160 %conv = sext i16 %a to i32 161 %conv1 = zext i8 %b to i32 162 %add = sub nsw i32 0, %conv1 163 %cmp = icmp eq i32 %conv, %add 164 ret i1 %cmp 165} 166 167define i1 @test_EQ_IclEbT(i8 %a, i64 %b) { 168; CHECK-LABEL: test_EQ_IclEbT: 169; CHECK: // %bb.0: // %entry 170; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 171; CHECK-NEXT: cmn x1, w0, uxtb 172; CHECK-NEXT: cset w0, eq 173; CHECK-NEXT: ret 174entry: 175 %conv = zext i8 %a to i64 176 %add = sub i64 0, %b 177 %cmp = icmp eq i64 %conv, %add 178 ret i1 %cmp 179} 180 181define i1 @test_EQ_IciEbT(i8 %a, i32 %b) { 182; CHECK-LABEL: test_EQ_IciEbT: 183; CHECK: // %bb.0: // %entry 184; CHECK-NEXT: cmn w1, w0, uxtb 185; CHECK-NEXT: cset w0, eq 186; CHECK-NEXT: ret 187entry: 188 %conv = zext i8 %a to i32 189 %add = sub i32 0, %b 190 %cmp = icmp eq i32 %conv, %add 191 ret i1 %cmp 192} 193 194define i1 @test_EQ_IcsEbT(i8 %a, i16 %b) { 195; CHECK-LABEL: test_EQ_IcsEbT: 196; CHECK: // %bb.0: // %entry 197; CHECK-NEXT: and w8, w0, #0xff 198; CHECK-NEXT: cmn w8, w1, sxth 199; CHECK-NEXT: cset w0, eq 200; CHECK-NEXT: ret 201entry: 202 %conv = zext i8 %a to i32 203 %conv1 = sext i16 %b to i32 204 %add = sub nsw i32 0, %conv1 205 %cmp = icmp eq i32 %conv, %add 206 ret i1 %cmp 207} 208 209define i1 @test_EQ_IccEbT(i8 %a, i8 %b) { 210; CHECK-LABEL: test_EQ_IccEbT: 211; CHECK: // %bb.0: // %entry 212; CHECK-NEXT: and w8, w0, #0xff 213; CHECK-NEXT: cmn w8, w1, uxtb 214; CHECK-NEXT: cset w0, eq 215; CHECK-NEXT: ret 216entry: 217 %conv = zext i8 %a to i32 218 %conv1 = zext i8 %b to i32 219 %add = sub nsw i32 0, %conv1 220 %cmp = icmp eq i32 %conv, %add 221 ret i1 %cmp 222} 223 224define i1 @test_NE_IllEbT(i64 %a, i64 %b) { 225; CHECK-LABEL: test_NE_IllEbT: 226; CHECK: // %bb.0: // %entry 227; CHECK-NEXT: cmn x0, x1 228; CHECK-NEXT: cset w0, ne 229; CHECK-NEXT: ret 230entry: 231 %add = sub i64 0, %b 232 %cmp = icmp ne i64 %add, %a 233 ret i1 %cmp 234} 235 236define i1 @test_NE_IliEbT(i64 %a, i32 %b) { 237; CHECK-LABEL: test_NE_IliEbT: 238; CHECK: // %bb.0: // %entry 239; CHECK-NEXT: cmn x0, w1, sxtw 240; CHECK-NEXT: cset w0, ne 241; CHECK-NEXT: ret 242entry: 243 %conv = sext i32 %b to i64 244 %add = sub i64 0, %a 245 %cmp = icmp ne i64 %conv, %add 246 ret i1 %cmp 247} 248 249define i1 @test_NE_IlsEbT(i64 %a, i16 %b) { 250; CHECK-LABEL: test_NE_IlsEbT: 251; CHECK: // %bb.0: // %entry 252; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1 253; CHECK-NEXT: cmn x0, w1, sxth 254; CHECK-NEXT: cset w0, ne 255; CHECK-NEXT: ret 256entry: 257 %conv = sext i16 %b to i64 258 %add = sub i64 0, %a 259 %cmp = icmp ne i64 %conv, %add 260 ret i1 %cmp 261} 262 263define i1 @test_NE_IlcEbT(i64 %a, i8 %b) { 264; CHECK-LABEL: test_NE_IlcEbT: 265; CHECK: // %bb.0: // %entry 266; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1 267; CHECK-NEXT: cmn x0, w1, uxtb 268; CHECK-NEXT: cset w0, ne 269; CHECK-NEXT: ret 270entry: 271 %conv = zext i8 %b to i64 272 %add = sub i64 0, %a 273 %cmp = icmp ne i64 %conv, %add 274 ret i1 %cmp 275} 276 277define i1 @test_NE_IilEbT(i32 %a, i64 %b) { 278; CHECK-LABEL: test_NE_IilEbT: 279; CHECK: // %bb.0: // %entry 280; CHECK-NEXT: cmn x1, w0, sxtw 281; CHECK-NEXT: cset w0, ne 282; CHECK-NEXT: ret 283entry: 284 %conv = sext i32 %a to i64 285 %add = sub i64 0, %b 286 %cmp = icmp ne i64 %conv, %add 287 ret i1 %cmp 288} 289 290define i1 @test_NE_IiiEbT(i32 %a, i32 %b) { 291; CHECK-LABEL: test_NE_IiiEbT: 292; CHECK: // %bb.0: // %entry 293; CHECK-NEXT: cmn w0, w1 294; CHECK-NEXT: cset w0, ne 295; CHECK-NEXT: ret 296entry: 297 %add = sub i32 0, %b 298 %cmp = icmp ne i32 %add, %a 299 ret i1 %cmp 300} 301 302define i1 @test_NE_IisEbT(i32 %a, i16 %b) { 303; CHECK-LABEL: test_NE_IisEbT: 304; CHECK: // %bb.0: // %entry 305; CHECK-NEXT: cmn w0, w1, sxth 306; CHECK-NEXT: cset w0, ne 307; CHECK-NEXT: ret 308entry: 309 %conv = sext i16 %b to i32 310 %add = sub i32 0, %a 311 %cmp = icmp ne i32 %conv, %add 312 ret i1 %cmp 313} 314 315define i1 @test_NE_IicEbT(i32 %a, i8 %b) { 316; CHECK-LABEL: test_NE_IicEbT: 317; CHECK: // %bb.0: // %entry 318; CHECK-NEXT: cmn w0, w1, uxtb 319; CHECK-NEXT: cset w0, ne 320; CHECK-NEXT: ret 321entry: 322 %conv = zext i8 %b to i32 323 %add = sub i32 0, %a 324 %cmp = icmp ne i32 %conv, %add 325 ret i1 %cmp 326} 327 328define i1 @test_NE_IslEbT(i16 %a, i64 %b) { 329; CHECK-LABEL: test_NE_IslEbT: 330; CHECK: // %bb.0: // %entry 331; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 332; CHECK-NEXT: cmn x1, w0, sxth 333; CHECK-NEXT: cset w0, ne 334; CHECK-NEXT: ret 335entry: 336 %conv = sext i16 %a to i64 337 %add = sub i64 0, %b 338 %cmp = icmp ne i64 %conv, %add 339 ret i1 %cmp 340} 341 342define i1 @test_NE_IsiEbT(i16 %a, i32 %b) { 343; CHECK-LABEL: test_NE_IsiEbT: 344; CHECK: // %bb.0: // %entry 345; CHECK-NEXT: cmn w1, w0, sxth 346; CHECK-NEXT: cset w0, ne 347; CHECK-NEXT: ret 348entry: 349 %conv = sext i16 %a to i32 350 %add = sub i32 0, %b 351 %cmp = icmp ne i32 %conv, %add 352 ret i1 %cmp 353} 354 355define i1 @test_NE_IssEbT(i16 %a, i16 %b) { 356; CHECK-LABEL: test_NE_IssEbT: 357; CHECK: // %bb.0: // %entry 358; CHECK-NEXT: sxth w8, w0 359; CHECK-NEXT: cmn w8, w1, sxth 360; CHECK-NEXT: cset w0, ne 361; CHECK-NEXT: ret 362entry: 363 %conv = sext i16 %a to i32 364 %conv1 = sext i16 %b to i32 365 %add = sub nsw i32 0, %conv1 366 %cmp = icmp ne i32 %conv, %add 367 ret i1 %cmp 368} 369 370define i1 @test_NE_IscEbT(i16 %a, i8 %b) { 371; CHECK-LABEL: test_NE_IscEbT: 372; CHECK: // %bb.0: // %entry 373; CHECK-NEXT: sxth w8, w0 374; CHECK-NEXT: cmn w8, w1, uxtb 375; CHECK-NEXT: cset w0, ne 376; CHECK-NEXT: ret 377entry: 378 %conv = sext i16 %a to i32 379 %conv1 = zext i8 %b to i32 380 %add = sub nsw i32 0, %conv1 381 %cmp = icmp ne i32 %conv, %add 382 ret i1 %cmp 383} 384 385define i1 @test_NE_IclEbT(i8 %a, i64 %b) { 386; CHECK-LABEL: test_NE_IclEbT: 387; CHECK: // %bb.0: // %entry 388; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 389; CHECK-NEXT: cmn x1, w0, uxtb 390; CHECK-NEXT: cset w0, ne 391; CHECK-NEXT: ret 392entry: 393 %conv = zext i8 %a to i64 394 %add = sub i64 0, %b 395 %cmp = icmp ne i64 %conv, %add 396 ret i1 %cmp 397} 398 399define i1 @test_NE_IciEbT(i8 %a, i32 %b) { 400; CHECK-LABEL: test_NE_IciEbT: 401; CHECK: // %bb.0: // %entry 402; CHECK-NEXT: cmn w1, w0, uxtb 403; CHECK-NEXT: cset w0, ne 404; CHECK-NEXT: ret 405entry: 406 %conv = zext i8 %a to i32 407 %add = sub i32 0, %b 408 %cmp = icmp ne i32 %conv, %add 409 ret i1 %cmp 410} 411 412define i1 @test_NE_IcsEbT(i8 %a, i16 %b) { 413; CHECK-LABEL: test_NE_IcsEbT: 414; CHECK: // %bb.0: // %entry 415; CHECK-NEXT: and w8, w0, #0xff 416; CHECK-NEXT: cmn w8, w1, sxth 417; CHECK-NEXT: cset w0, ne 418; CHECK-NEXT: ret 419entry: 420 %conv = zext i8 %a to i32 421 %conv1 = sext i16 %b to i32 422 %add = sub nsw i32 0, %conv1 423 %cmp = icmp ne i32 %conv, %add 424 ret i1 %cmp 425} 426 427define i1 @test_NE_IccEbT(i8 %a, i8 %b) { 428; CHECK-LABEL: test_NE_IccEbT: 429; CHECK: // %bb.0: // %entry 430; CHECK-NEXT: and w8, w0, #0xff 431; CHECK-NEXT: cmn w8, w1, uxtb 432; CHECK-NEXT: cset w0, ne 433; CHECK-NEXT: ret 434entry: 435 %conv = zext i8 %a to i32 436 %conv1 = zext i8 %b to i32 437 %add = sub nsw i32 0, %conv1 438 %cmp = icmp ne i32 %conv, %add 439 ret i1 %cmp 440} 441