1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=xtensa -disable-block-placement -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s 4 5define i32 @f_eq(i32 %a, ptr %b) nounwind { 6; CHECK-LABEL: f_eq: 7; CHECK: l32i a8, a3, 0 8; CHECK-NEXT: beq a2, a8, .LBB0_2 9; CHECK-NEXT: # %bb.1: 10; CHECK-NEXT: or a2, a8, a8 11; CHECK-NEXT: .LBB0_2: 12; CHECK-NEXT: ret 13 %val1 = load i32, ptr %b 14 %tst1 = icmp eq i32 %a, %val1 15 %val2 = select i1 %tst1, i32 %a, i32 %val1 16 ret i32 %val2 17} 18 19define i32 @f_ne(i32 %a, ptr %b) nounwind { 20; CHECK-LABEL: f_ne: 21; CHECK: l32i a8, a3, 0 22; CHECK-NEXT: bne a2, a8, .LBB1_2 23; CHECK-NEXT: # %bb.1: 24; CHECK-NEXT: or a2, a8, a8 25; CHECK-NEXT: .LBB1_2: 26; CHECK-NEXT: ret 27 %val1 = load i32, ptr %b 28 %tst1 = icmp ne i32 %a, %val1 29 %val2 = select i1 %tst1, i32 %a, i32 %val1 30 ret i32 %val2 31} 32 33define i32 @f_ugt(i32 %a, ptr %b) nounwind { 34; CHECK-LABEL: f_ugt: 35; CHECK: or a8, a2, a2 36; CHECK-NEXT: l32i a2, a3, 0 37; CHECK-NEXT: bgeu a2, a8, .LBB2_2 38; CHECK-NEXT: # %bb.1: 39; CHECK-NEXT: or a2, a8, a8 40; CHECK-NEXT: .LBB2_2: 41; CHECK-NEXT: ret 42 %val1 = load i32, ptr %b 43 %tst1 = icmp ugt i32 %a, %val1 44 %val2 = select i1 %tst1, i32 %a, i32 %val1 45 ret i32 %val2 46} 47 48define i32 @f_uge(i32 %a, ptr %b) nounwind { 49; CHECK-LABEL: f_uge: 50; CHECK: l32i a8, a3, 0 51; CHECK-NEXT: bgeu a2, a8, .LBB3_2 52; CHECK-NEXT: # %bb.1: 53; CHECK-NEXT: or a2, a8, a8 54; CHECK-NEXT: .LBB3_2: 55; CHECK-NEXT: ret 56 %val1 = load i32, ptr %b 57 %tst1 = icmp uge i32 %a, %val1 58 %val2 = select i1 %tst1, i32 %a, i32 %val1 59 ret i32 %val2 60} 61 62define i32 @f_ult(i32 %a, ptr %b) nounwind { 63; CHECK-LABEL: f_ult: 64; CHECK: l32i a8, a3, 0 65; CHECK-NEXT: bltu a2, a8, .LBB4_2 66; CHECK-NEXT: # %bb.1: 67; CHECK-NEXT: or a2, a8, a8 68; CHECK-NEXT: .LBB4_2: 69; CHECK-NEXT: ret 70 %val1 = load i32, ptr %b 71 %tst1 = icmp ult i32 %a, %val1 72 %val2 = select i1 %tst1, i32 %a, i32 %val1 73 ret i32 %val2 74} 75 76define i32 @f_ule(i32 %a, ptr %b) nounwind { 77; CHECK-LABEL: f_ule: 78; CHECK: or a8, a2, a2 79; CHECK-NEXT: l32i a2, a3, 0 80; CHECK-NEXT: bltu a2, a8, .LBB5_2 81; CHECK-NEXT: # %bb.1: 82; CHECK-NEXT: or a2, a8, a8 83; CHECK-NEXT: .LBB5_2: 84; CHECK-NEXT: ret 85 %val1 = load i32, ptr %b 86 %tst1 = icmp ule i32 %a, %val1 87 %val2 = select i1 %tst1, i32 %a, i32 %val1 88 ret i32 %val2 89} 90 91define i32 @f_sgt(i32 %a, ptr %b) nounwind { 92; CHECK-LABEL: f_sgt: 93; CHECK: or a8, a2, a2 94; CHECK-NEXT: l32i a2, a3, 0 95; CHECK-NEXT: bge a2, a8, .LBB6_2 96; CHECK-NEXT: # %bb.1: 97; CHECK-NEXT: or a2, a8, a8 98; CHECK-NEXT: .LBB6_2: 99; CHECK-NEXT: ret 100 %val1 = load i32, ptr %b 101 %tst1 = icmp sgt i32 %a, %val1 102 %val2 = select i1 %tst1, i32 %a, i32 %val1 103 ret i32 %val2 104} 105 106define i32 @f_sge(i32 %a, ptr %b) nounwind { 107; CHECK-LABEL: f_sge: 108; CHECK: l32i a8, a3, 0 109; CHECK-NEXT: bge a2, a8, .LBB7_2 110; CHECK-NEXT: # %bb.1: 111; CHECK-NEXT: or a2, a8, a8 112; CHECK-NEXT: .LBB7_2: 113; CHECK-NEXT: ret 114 %val1 = load i32, ptr %b 115 %tst1 = icmp sge i32 %a, %val1 116 %val2 = select i1 %tst1, i32 %a, i32 %val1 117 ret i32 %val2 118} 119 120define i32 @f_slt(i32 %a, ptr %b) nounwind { 121; CHECK-LABEL: f_slt: 122; CHECK: l32i a8, a3, 0 123; CHECK-NEXT: blt a2, a8, .LBB8_2 124; CHECK-NEXT: # %bb.1: 125; CHECK-NEXT: or a2, a8, a8 126; CHECK-NEXT: .LBB8_2: 127; CHECK-NEXT: ret 128 %val1 = load i32, ptr %b 129 %tst1 = icmp slt i32 %a, %val1 130 %val2 = select i1 %tst1, i32 %a, i32 %val1 131 ret i32 %val2 132} 133 134define i32 @f_sle(i32 %a, ptr %b) nounwind { 135; CHECK-LABEL: f_sle: 136; CHECK: or a8, a2, a2 137; CHECK-NEXT: l32i a2, a3, 0 138; CHECK-NEXT: blt a2, a8, .LBB9_2 139; CHECK-NEXT: # %bb.1: 140; CHECK-NEXT: or a2, a8, a8 141; CHECK-NEXT: .LBB9_2: 142; CHECK-NEXT: ret 143 %val1 = load i32, ptr %b 144 %tst1 = icmp sle i32 %a, %val1 145 %val2 = select i1 %tst1, i32 %a, i32 %val1 146 ret i32 %val2 147} 148 149define i32 @f_slt_imm(i32 %a, ptr %b) nounwind { 150; CHECK-LABEL: f_slt_imm: 151; CHECK: movi a8, 1 152; CHECK-NEXT: blt a2, a8, .LBB10_2 153; CHECK-NEXT: # %bb.1: 154; CHECK-NEXT: l32i a2, a3, 0 155; CHECK-NEXT: .LBB10_2: 156; CHECK-NEXT: ret 157 %val1 = load i32, ptr %b 158 %tst1 = icmp slt i32 %a, 1 159 %val2 = select i1 %tst1, i32 %a, i32 %val1 160 ret i32 %val2 161} 162 163define i32 @f_sgt_imm(i32 %a, ptr %b) nounwind { 164; CHECK-LABEL: f_sgt_imm: 165; CHECK: movi a8, -1 166; CHECK-NEXT: blt a8, a2, .LBB11_2 167; CHECK-NEXT: # %bb.1: 168; CHECK-NEXT: l32i a2, a3, 0 169; CHECK-NEXT: .LBB11_2: 170; CHECK-NEXT: ret 171 %val1 = load i32, ptr %b 172 %tst1 = icmp sgt i32 %a, -1 173 %val2 = select i1 %tst1, i32 %a, i32 %val1 174 ret i32 %val2 175} 176 177define i32 @f_ult_imm(i32 %a, ptr %b) nounwind { 178; CHECK-LABEL: f_ult_imm: 179; CHECK: movi a8, 1024 180; CHECK-NEXT: bltu a2, a8, .LBB12_2 181; CHECK-NEXT: # %bb.1: 182; CHECK-NEXT: l32i a2, a3, 0 183; CHECK-NEXT: .LBB12_2: 184; CHECK-NEXT: ret 185 %val1 = load i32, ptr %b 186 %tst1 = icmp ult i32 %a, 1024 187 %val2 = select i1 %tst1, i32 %a, i32 %val1 188 ret i32 %val2 189} 190 191; Tests for i64 operands 192 193define i64 @f_eq_i64(i64 %a, ptr %b) nounwind { 194; CHECK-LABEL: f_eq_i64: 195; CHECK: l32i a8, a4, 4 196; CHECK-NEXT: xor a9, a3, a8 197; CHECK-NEXT: l32i a11, a4, 0 198; CHECK-NEXT: xor a10, a2, a11 199; CHECK-NEXT: or a9, a10, a9 200; CHECK-NEXT: movi a10, 0 201; CHECK-NEXT: beq a9, a10, .LBB13_2 202; CHECK-NEXT: # %bb.1: 203; CHECK-NEXT: or a2, a11, a11 204; CHECK-NEXT: .LBB13_2: 205; CHECK-NEXT: beq a9, a10, .LBB13_4 206; CHECK-NEXT: # %bb.3: 207; CHECK-NEXT: or a3, a8, a8 208; CHECK-NEXT: .LBB13_4: 209; CHECK-NEXT: ret 210 %val1 = load i64, ptr %b 211 %tst1 = icmp eq i64 %a, %val1 212 %val2 = select i1 %tst1, i64 %a, i64 %val1 213 ret i64 %val2 214} 215 216define i64 @f_ne_i64(i64 %a, ptr %b) nounwind { 217; CHECK-LABEL: f_ne_i64: 218; CHECK: l32i a8, a4, 4 219; CHECK-NEXT: xor a9, a3, a8 220; CHECK-NEXT: l32i a11, a4, 0 221; CHECK-NEXT: xor a10, a2, a11 222; CHECK-NEXT: or a9, a10, a9 223; CHECK-NEXT: movi a10, 0 224; CHECK-NEXT: bne a9, a10, .LBB14_2 225; CHECK-NEXT: # %bb.1: 226; CHECK-NEXT: or a2, a11, a11 227; CHECK-NEXT: .LBB14_2: 228; CHECK-NEXT: bne a9, a10, .LBB14_4 229; CHECK-NEXT: # %bb.3: 230; CHECK-NEXT: or a3, a8, a8 231; CHECK-NEXT: .LBB14_4: 232; CHECK-NEXT: ret 233 %val1 = load i64, ptr %b 234 %tst1 = icmp ne i64 %a, %val1 235 %val2 = select i1 %tst1, i64 %a, i64 %val1 236 ret i64 %val2 237} 238 239define i64 @f_ugt_i64(i64 %a, ptr %b) nounwind { 240; CHECK-LABEL: f_ugt_i64: 241; CHECK: l32i a8, a4, 4 242; CHECK-NEXT: movi a9, 0 243; CHECK-NEXT: movi a10, 1 244; CHECK-NEXT: or a7, a10, a10 245; CHECK-NEXT: bltu a8, a3, .LBB15_2 246; CHECK-NEXT: # %bb.1: 247; CHECK-NEXT: or a7, a9, a9 248; CHECK-NEXT: .LBB15_2: 249; CHECK-NEXT: l32i a11, a4, 0 250; CHECK-NEXT: bltu a11, a2, .LBB15_4 251; CHECK-NEXT: # %bb.3: 252; CHECK-NEXT: or a10, a9, a9 253; CHECK-NEXT: .LBB15_4: 254; CHECK-NEXT: beq a3, a8, .LBB15_6 255; CHECK-NEXT: # %bb.5: 256; CHECK-NEXT: or a10, a7, a7 257; CHECK-NEXT: .LBB15_6: 258; CHECK-NEXT: bne a10, a9, .LBB15_8 259; CHECK-NEXT: # %bb.7: 260; CHECK-NEXT: or a2, a11, a11 261; CHECK-NEXT: .LBB15_8: 262; CHECK-NEXT: bne a10, a9, .LBB15_10 263; CHECK-NEXT: # %bb.9: 264; CHECK-NEXT: or a3, a8, a8 265; CHECK-NEXT: .LBB15_10: 266; CHECK-NEXT: ret 267 %val1 = load i64, ptr %b 268 %tst1 = icmp ugt i64 %a, %val1 269 %val2 = select i1 %tst1, i64 %a, i64 %val1 270 ret i64 %val2 271} 272 273define i64 @f_uge_i64(i64 %a, ptr %b) nounwind { 274; CHECK-LABEL: f_uge_i64: 275; CHECK: l32i a8, a4, 4 276; CHECK-NEXT: movi a9, 0 277; CHECK-NEXT: movi a10, 1 278; CHECK-NEXT: or a7, a10, a10 279; CHECK-NEXT: bgeu a3, a8, .LBB16_2 280; CHECK-NEXT: # %bb.1: 281; CHECK-NEXT: or a7, a9, a9 282; CHECK-NEXT: .LBB16_2: 283; CHECK-NEXT: l32i a11, a4, 0 284; CHECK-NEXT: bgeu a2, a11, .LBB16_4 285; CHECK-NEXT: # %bb.3: 286; CHECK-NEXT: or a10, a9, a9 287; CHECK-NEXT: .LBB16_4: 288; CHECK-NEXT: beq a3, a8, .LBB16_6 289; CHECK-NEXT: # %bb.5: 290; CHECK-NEXT: or a10, a7, a7 291; CHECK-NEXT: .LBB16_6: 292; CHECK-NEXT: bne a10, a9, .LBB16_8 293; CHECK-NEXT: # %bb.7: 294; CHECK-NEXT: or a2, a11, a11 295; CHECK-NEXT: .LBB16_8: 296; CHECK-NEXT: bne a10, a9, .LBB16_10 297; CHECK-NEXT: # %bb.9: 298; CHECK-NEXT: or a3, a8, a8 299; CHECK-NEXT: .LBB16_10: 300; CHECK-NEXT: ret 301 %val1 = load i64, ptr %b 302 %tst1 = icmp uge i64 %a, %val1 303 %val2 = select i1 %tst1, i64 %a, i64 %val1 304 ret i64 %val2 305} 306 307define i64 @f_ult_i64(i64 %a, ptr %b) nounwind { 308; CHECK-LABEL: f_ult_i64: 309; CHECK: l32i a8, a4, 4 310; CHECK-NEXT: movi a9, 0 311; CHECK-NEXT: movi a10, 1 312; CHECK-NEXT: or a7, a10, a10 313; CHECK-NEXT: bltu a3, a8, .LBB17_2 314; CHECK-NEXT: # %bb.1: 315; CHECK-NEXT: or a7, a9, a9 316; CHECK-NEXT: .LBB17_2: 317; CHECK-NEXT: l32i a11, a4, 0 318; CHECK-NEXT: bltu a2, a11, .LBB17_4 319; CHECK-NEXT: # %bb.3: 320; CHECK-NEXT: or a10, a9, a9 321; CHECK-NEXT: .LBB17_4: 322; CHECK-NEXT: beq a3, a8, .LBB17_6 323; CHECK-NEXT: # %bb.5: 324; CHECK-NEXT: or a10, a7, a7 325; CHECK-NEXT: .LBB17_6: 326; CHECK-NEXT: bne a10, a9, .LBB17_8 327; CHECK-NEXT: # %bb.7: 328; CHECK-NEXT: or a2, a11, a11 329; CHECK-NEXT: .LBB17_8: 330; CHECK-NEXT: bne a10, a9, .LBB17_10 331; CHECK-NEXT: # %bb.9: 332; CHECK-NEXT: or a3, a8, a8 333; CHECK-NEXT: .LBB17_10: 334; CHECK-NEXT: ret 335 %val1 = load i64, ptr %b 336 %tst1 = icmp ult i64 %a, %val1 337 %val2 = select i1 %tst1, i64 %a, i64 %val1 338 ret i64 %val2 339} 340 341define i64 @f_ule_i64(i64 %a, ptr %b) nounwind { 342; CHECK-LABEL: f_ule_i64: 343; CHECK: l32i a8, a4, 4 344; CHECK-NEXT: movi a9, 0 345; CHECK-NEXT: movi a10, 1 346; CHECK-NEXT: or a7, a10, a10 347; CHECK-NEXT: bgeu a8, a3, .LBB18_2 348; CHECK-NEXT: # %bb.1: 349; CHECK-NEXT: or a7, a9, a9 350; CHECK-NEXT: .LBB18_2: 351; CHECK-NEXT: l32i a11, a4, 0 352; CHECK-NEXT: bgeu a11, a2, .LBB18_4 353; CHECK-NEXT: # %bb.3: 354; CHECK-NEXT: or a10, a9, a9 355; CHECK-NEXT: .LBB18_4: 356; CHECK-NEXT: beq a3, a8, .LBB18_6 357; CHECK-NEXT: # %bb.5: 358; CHECK-NEXT: or a10, a7, a7 359; CHECK-NEXT: .LBB18_6: 360; CHECK-NEXT: bne a10, a9, .LBB18_8 361; CHECK-NEXT: # %bb.7: 362; CHECK-NEXT: or a2, a11, a11 363; CHECK-NEXT: .LBB18_8: 364; CHECK-NEXT: bne a10, a9, .LBB18_10 365; CHECK-NEXT: # %bb.9: 366; CHECK-NEXT: or a3, a8, a8 367; CHECK-NEXT: .LBB18_10: 368; CHECK-NEXT: ret 369 %val1 = load i64, ptr %b 370 %tst1 = icmp ule i64 %a, %val1 371 %val2 = select i1 %tst1, i64 %a, i64 %val1 372 ret i64 %val2 373} 374 375define i64 @f_sgt_i64(i64 %a, ptr %b) nounwind { 376; CHECK-LABEL: f_sgt_i64: 377; CHECK: l32i a8, a4, 4 378; CHECK-NEXT: movi a9, 0 379; CHECK-NEXT: movi a10, 1 380; CHECK-NEXT: or a7, a10, a10 381; CHECK-NEXT: blt a8, a3, .LBB19_2 382; CHECK-NEXT: # %bb.1: 383; CHECK-NEXT: or a7, a9, a9 384; CHECK-NEXT: .LBB19_2: 385; CHECK-NEXT: l32i a11, a4, 0 386; CHECK-NEXT: bltu a11, a2, .LBB19_4 387; CHECK-NEXT: # %bb.3: 388; CHECK-NEXT: or a10, a9, a9 389; CHECK-NEXT: .LBB19_4: 390; CHECK-NEXT: beq a3, a8, .LBB19_6 391; CHECK-NEXT: # %bb.5: 392; CHECK-NEXT: or a10, a7, a7 393; CHECK-NEXT: .LBB19_6: 394; CHECK-NEXT: bne a10, a9, .LBB19_8 395; CHECK-NEXT: # %bb.7: 396; CHECK-NEXT: or a2, a11, a11 397; CHECK-NEXT: .LBB19_8: 398; CHECK-NEXT: bne a10, a9, .LBB19_10 399; CHECK-NEXT: # %bb.9: 400; CHECK-NEXT: or a3, a8, a8 401; CHECK-NEXT: .LBB19_10: 402; CHECK-NEXT: ret 403 %val1 = load i64, ptr %b 404 %tst1 = icmp sgt i64 %a, %val1 405 %val2 = select i1 %tst1, i64 %a, i64 %val1 406 ret i64 %val2 407} 408 409define i64 @f_sge_i64(i64 %a, ptr %b) nounwind { 410; CHECK-LABEL: f_sge_i64: 411; CHECK: l32i a8, a4, 4 412; CHECK-NEXT: movi a9, 0 413; CHECK-NEXT: movi a10, 1 414; CHECK-NEXT: or a7, a10, a10 415; CHECK-NEXT: bge a3, a8, .LBB20_2 416; CHECK-NEXT: # %bb.1: 417; CHECK-NEXT: or a7, a9, a9 418; CHECK-NEXT: .LBB20_2: 419; CHECK-NEXT: l32i a11, a4, 0 420; CHECK-NEXT: bgeu a2, a11, .LBB20_4 421; CHECK-NEXT: # %bb.3: 422; CHECK-NEXT: or a10, a9, a9 423; CHECK-NEXT: .LBB20_4: 424; CHECK-NEXT: beq a3, a8, .LBB20_6 425; CHECK-NEXT: # %bb.5: 426; CHECK-NEXT: or a10, a7, a7 427; CHECK-NEXT: .LBB20_6: 428; CHECK-NEXT: bne a10, a9, .LBB20_8 429; CHECK-NEXT: # %bb.7: 430; CHECK-NEXT: or a2, a11, a11 431; CHECK-NEXT: .LBB20_8: 432; CHECK-NEXT: bne a10, a9, .LBB20_10 433; CHECK-NEXT: # %bb.9: 434; CHECK-NEXT: or a3, a8, a8 435; CHECK-NEXT: .LBB20_10: 436; CHECK-NEXT: ret 437 %val1 = load i64, ptr %b 438 %tst1 = icmp sge i64 %a, %val1 439 %val2 = select i1 %tst1, i64 %a, i64 %val1 440 ret i64 %val2 441} 442 443define i64 @f_slt_i64(i64 %a, ptr %b) nounwind { 444; CHECK-LABEL: f_slt_i64: 445; CHECK: l32i a8, a4, 4 446; CHECK-NEXT: movi a9, 0 447; CHECK-NEXT: movi a10, 1 448; CHECK-NEXT: or a7, a10, a10 449; CHECK-NEXT: blt a3, a8, .LBB21_2 450; CHECK-NEXT: # %bb.1: 451; CHECK-NEXT: or a7, a9, a9 452; CHECK-NEXT: .LBB21_2: 453; CHECK-NEXT: l32i a11, a4, 0 454; CHECK-NEXT: bltu a2, a11, .LBB21_4 455; CHECK-NEXT: # %bb.3: 456; CHECK-NEXT: or a10, a9, a9 457; CHECK-NEXT: .LBB21_4: 458; CHECK-NEXT: beq a3, a8, .LBB21_6 459; CHECK-NEXT: # %bb.5: 460; CHECK-NEXT: or a10, a7, a7 461; CHECK-NEXT: .LBB21_6: 462; CHECK-NEXT: bne a10, a9, .LBB21_8 463; CHECK-NEXT: # %bb.7: 464; CHECK-NEXT: or a2, a11, a11 465; CHECK-NEXT: .LBB21_8: 466; CHECK-NEXT: bne a10, a9, .LBB21_10 467; CHECK-NEXT: # %bb.9: 468; CHECK-NEXT: or a3, a8, a8 469; CHECK-NEXT: .LBB21_10: 470; CHECK-NEXT: ret 471 %val1 = load i64, ptr %b 472 %tst1 = icmp slt i64 %a, %val1 473 %val2 = select i1 %tst1, i64 %a, i64 %val1 474 ret i64 %val2 475} 476 477define i64 @f_sle_i64(i64 %a, ptr %b) nounwind { 478; CHECK-LABEL: f_sle_i64: 479; CHECK: l32i a8, a4, 4 480; CHECK-NEXT: movi a9, 0 481; CHECK-NEXT: movi a10, 1 482; CHECK-NEXT: or a7, a10, a10 483; CHECK-NEXT: bge a8, a3, .LBB22_2 484; CHECK-NEXT: # %bb.1: 485; CHECK-NEXT: or a7, a9, a9 486; CHECK-NEXT: .LBB22_2: 487; CHECK-NEXT: l32i a11, a4, 0 488; CHECK-NEXT: bgeu a11, a2, .LBB22_4 489; CHECK-NEXT: # %bb.3: 490; CHECK-NEXT: or a10, a9, a9 491; CHECK-NEXT: .LBB22_4: 492; CHECK-NEXT: beq a3, a8, .LBB22_6 493; CHECK-NEXT: # %bb.5: 494; CHECK-NEXT: or a10, a7, a7 495; CHECK-NEXT: .LBB22_6: 496; CHECK-NEXT: bne a10, a9, .LBB22_8 497; CHECK-NEXT: # %bb.7: 498; CHECK-NEXT: or a2, a11, a11 499; CHECK-NEXT: .LBB22_8: 500; CHECK-NEXT: bne a10, a9, .LBB22_10 501; CHECK-NEXT: # %bb.9: 502; CHECK-NEXT: or a3, a8, a8 503; CHECK-NEXT: .LBB22_10: 504; CHECK-NEXT: ret 505 %val1 = load i64, ptr %b 506 %tst1 = icmp sle i64 %a, %val1 507 %val2 = select i1 %tst1, i64 %a, i64 %val1 508 ret i64 %val2 509} 510