1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=thumbv6m-none-eabi | FileCheck %s --check-prefix=CHECKV6M 3; RUN: llc < %s -mtriple=thumbv7m-none-eabi | FileCheck %s --check-prefix=CHECKV7M 4; RUN: llc < %s -mtriple=thumbv7a-none-eabi | FileCheck %s --check-prefix=CHECKV7A 5 6define i32 @icmp64_sge_0(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) { 7; CHECKV6M-LABEL: icmp64_sge_0: 8; CHECKV6M: @ %bb.0: 9; CHECKV6M-NEXT: ldr r0, [sp, #8] 10; CHECKV6M-NEXT: lsls r0, r0, #31 11; CHECKV6M-NEXT: ldr r2, [sp, #4] 12; CHECKV6M-NEXT: ldr r0, [sp] 13; CHECKV6M-NEXT: beq .LBB0_4 14; CHECKV6M-NEXT: @ %bb.1: @ %then 15; CHECKV6M-NEXT: cmp r3, #0 16; CHECKV6M-NEXT: mov r3, r0 17; CHECKV6M-NEXT: blt .LBB0_7 18; CHECKV6M-NEXT: @ %bb.2: @ %then 19; CHECKV6M-NEXT: cmp r1, #0 20; CHECKV6M-NEXT: blt .LBB0_8 21; CHECKV6M-NEXT: .LBB0_3: @ %then 22; CHECKV6M-NEXT: adds r0, r0, r3 23; CHECKV6M-NEXT: bx lr 24; CHECKV6M-NEXT: .LBB0_4: @ %else 25; CHECKV6M-NEXT: cmp r1, #0 26; CHECKV6M-NEXT: bge .LBB0_6 27; CHECKV6M-NEXT: @ %bb.5: @ %else 28; CHECKV6M-NEXT: mov r0, r2 29; CHECKV6M-NEXT: .LBB0_6: @ %else 30; CHECKV6M-NEXT: bx lr 31; CHECKV6M-NEXT: .LBB0_7: @ %then 32; CHECKV6M-NEXT: mov r3, r2 33; CHECKV6M-NEXT: cmp r1, #0 34; CHECKV6M-NEXT: bge .LBB0_3 35; CHECKV6M-NEXT: .LBB0_8: @ %then 36; CHECKV6M-NEXT: mov r0, r2 37; CHECKV6M-NEXT: adds r0, r0, r3 38; CHECKV6M-NEXT: bx lr 39; 40; CHECKV7M-LABEL: icmp64_sge_0: 41; CHECKV7M: @ %bb.0: 42; CHECKV7M-NEXT: ldr r0, [sp, #8] 43; CHECKV7M-NEXT: lsls r0, r0, #31 44; CHECKV7M-NEXT: ldrd r2, r0, [sp] 45; CHECKV7M-NEXT: beq .LBB0_2 46; CHECKV7M-NEXT: @ %bb.1: @ %then 47; CHECKV7M-NEXT: cmp.w r3, #-1 48; CHECKV7M-NEXT: mov r3, r0 49; CHECKV7M-NEXT: it gt 50; CHECKV7M-NEXT: movgt r3, r2 51; CHECKV7M-NEXT: cmp.w r1, #-1 52; CHECKV7M-NEXT: it gt 53; CHECKV7M-NEXT: movgt r0, r2 54; CHECKV7M-NEXT: add r0, r3 55; CHECKV7M-NEXT: bx lr 56; CHECKV7M-NEXT: .LBB0_2: @ %else 57; CHECKV7M-NEXT: cmp.w r1, #-1 58; CHECKV7M-NEXT: it gt 59; CHECKV7M-NEXT: movgt r0, r2 60; CHECKV7M-NEXT: bx lr 61; 62; CHECKV7A-LABEL: icmp64_sge_0: 63; CHECKV7A: @ %bb.0: 64; CHECKV7A-NEXT: ldr r2, [sp, #8] 65; CHECKV7A-NEXT: ldrd r12, r0, [sp] 66; CHECKV7A-NEXT: lsls r2, r2, #31 67; CHECKV7A-NEXT: beq .LBB0_2 68; CHECKV7A-NEXT: @ %bb.1: @ %then 69; CHECKV7A-NEXT: cmp.w r3, #-1 70; CHECKV7A-NEXT: mov r2, r0 71; CHECKV7A-NEXT: it gt 72; CHECKV7A-NEXT: movgt r2, r12 73; CHECKV7A-NEXT: cmp.w r1, #-1 74; CHECKV7A-NEXT: it gt 75; CHECKV7A-NEXT: movgt r0, r12 76; CHECKV7A-NEXT: add r0, r2 77; CHECKV7A-NEXT: bx lr 78; CHECKV7A-NEXT: .LBB0_2: @ %else 79; CHECKV7A-NEXT: cmp.w r1, #-1 80; CHECKV7A-NEXT: it gt 81; CHECKV7A-NEXT: movgt r0, r12 82; CHECKV7A-NEXT: bx lr 83 br i1 %c, label %then, label %else 84then: 85 %c1 = icmp sge i64 %x, 0 86 %c2 = icmp sge i64 %y, 0 87 %s1 = select i1 %c1, i32 %a, i32 %b 88 %s2 = select i1 %c2, i32 %a, i32 %b 89 %r = add i32 %s1, %s2 90 ret i32 %r 91else: 92 %c3 = icmp sge i64 %x, 0 93 %s3 = select i1 %c3, i32 %a, i32 %b 94 ret i32 %s3 95} 96 97define i32 @icmp64_sgt_m1(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) { 98; CHECKV6M-LABEL: icmp64_sgt_m1: 99; CHECKV6M: @ %bb.0: 100; CHECKV6M-NEXT: ldr r0, [sp, #8] 101; CHECKV6M-NEXT: lsls r0, r0, #31 102; CHECKV6M-NEXT: ldr r2, [sp, #4] 103; CHECKV6M-NEXT: ldr r0, [sp] 104; CHECKV6M-NEXT: beq .LBB1_4 105; CHECKV6M-NEXT: @ %bb.1: @ %then 106; CHECKV6M-NEXT: cmp r3, #0 107; CHECKV6M-NEXT: mov r3, r0 108; CHECKV6M-NEXT: blt .LBB1_7 109; CHECKV6M-NEXT: @ %bb.2: @ %then 110; CHECKV6M-NEXT: cmp r1, #0 111; CHECKV6M-NEXT: blt .LBB1_8 112; CHECKV6M-NEXT: .LBB1_3: @ %then 113; CHECKV6M-NEXT: adds r0, r0, r3 114; CHECKV6M-NEXT: bx lr 115; CHECKV6M-NEXT: .LBB1_4: @ %else 116; CHECKV6M-NEXT: cmp r3, #0 117; CHECKV6M-NEXT: bge .LBB1_6 118; CHECKV6M-NEXT: @ %bb.5: @ %else 119; CHECKV6M-NEXT: mov r0, r2 120; CHECKV6M-NEXT: .LBB1_6: @ %else 121; CHECKV6M-NEXT: bx lr 122; CHECKV6M-NEXT: .LBB1_7: @ %then 123; CHECKV6M-NEXT: mov r3, r2 124; CHECKV6M-NEXT: cmp r1, #0 125; CHECKV6M-NEXT: bge .LBB1_3 126; CHECKV6M-NEXT: .LBB1_8: @ %then 127; CHECKV6M-NEXT: mov r0, r2 128; CHECKV6M-NEXT: adds r0, r0, r3 129; CHECKV6M-NEXT: bx lr 130; 131; CHECKV7M-LABEL: icmp64_sgt_m1: 132; CHECKV7M: @ %bb.0: 133; CHECKV7M-NEXT: ldr r0, [sp, #8] 134; CHECKV7M-NEXT: lsls r0, r0, #31 135; CHECKV7M-NEXT: ldrd r2, r0, [sp] 136; CHECKV7M-NEXT: beq .LBB1_2 137; CHECKV7M-NEXT: @ %bb.1: @ %then 138; CHECKV7M-NEXT: cmp.w r3, #-1 139; CHECKV7M-NEXT: mov r3, r0 140; CHECKV7M-NEXT: it gt 141; CHECKV7M-NEXT: movgt r3, r2 142; CHECKV7M-NEXT: cmp.w r1, #-1 143; CHECKV7M-NEXT: it gt 144; CHECKV7M-NEXT: movgt r0, r2 145; CHECKV7M-NEXT: add r0, r3 146; CHECKV7M-NEXT: bx lr 147; CHECKV7M-NEXT: .LBB1_2: @ %else 148; CHECKV7M-NEXT: cmp.w r3, #-1 149; CHECKV7M-NEXT: it gt 150; CHECKV7M-NEXT: movgt r0, r2 151; CHECKV7M-NEXT: bx lr 152; 153; CHECKV7A-LABEL: icmp64_sgt_m1: 154; CHECKV7A: @ %bb.0: 155; CHECKV7A-NEXT: ldr r2, [sp, #8] 156; CHECKV7A-NEXT: ldrd r12, r0, [sp] 157; CHECKV7A-NEXT: lsls r2, r2, #31 158; CHECKV7A-NEXT: beq .LBB1_2 159; CHECKV7A-NEXT: @ %bb.1: @ %then 160; CHECKV7A-NEXT: cmp.w r3, #-1 161; CHECKV7A-NEXT: mov r2, r0 162; CHECKV7A-NEXT: it gt 163; CHECKV7A-NEXT: movgt r2, r12 164; CHECKV7A-NEXT: cmp.w r1, #-1 165; CHECKV7A-NEXT: it gt 166; CHECKV7A-NEXT: movgt r0, r12 167; CHECKV7A-NEXT: add r0, r2 168; CHECKV7A-NEXT: bx lr 169; CHECKV7A-NEXT: .LBB1_2: @ %else 170; CHECKV7A-NEXT: cmp.w r3, #-1 171; CHECKV7A-NEXT: it gt 172; CHECKV7A-NEXT: movgt r0, r12 173; CHECKV7A-NEXT: bx lr 174 br i1 %c, label %then, label %else 175then: 176 %c1 = icmp sgt i64 %x, -1 177 %c2 = icmp sgt i64 %y, -1 178 %s1 = select i1 %c1, i32 %a, i32 %b 179 %s2 = select i1 %c2, i32 %a, i32 %b 180 %r = add i32 %s1, %s2 181 ret i32 %r 182else: 183 %c3 = icmp sgt i64 %y, -1 184 %s3 = select i1 %c3, i32 %a, i32 %b 185 ret i32 %s3 186} 187 188define i32 @icmp32_sge_0(i32 %x, i32 %y, i32 %a, i32 %b, i1 %c) { 189; CHECKV6M-LABEL: icmp32_sge_0: 190; CHECKV6M: @ %bb.0: 191; CHECKV6M-NEXT: .save {r4, lr} 192; CHECKV6M-NEXT: push {r4, lr} 193; CHECKV6M-NEXT: ldr r4, [sp, #8] 194; CHECKV6M-NEXT: lsls r4, r4, #31 195; CHECKV6M-NEXT: beq .LBB2_4 196; CHECKV6M-NEXT: @ %bb.1: @ %then 197; CHECKV6M-NEXT: cmp r1, #0 198; CHECKV6M-NEXT: mov r1, r2 199; CHECKV6M-NEXT: blt .LBB2_7 200; CHECKV6M-NEXT: @ %bb.2: @ %then 201; CHECKV6M-NEXT: cmp r0, #0 202; CHECKV6M-NEXT: blt .LBB2_8 203; CHECKV6M-NEXT: .LBB2_3: @ %then 204; CHECKV6M-NEXT: adds r0, r2, r1 205; CHECKV6M-NEXT: pop {r4, pc} 206; CHECKV6M-NEXT: .LBB2_4: @ %else 207; CHECKV6M-NEXT: cmp r0, #0 208; CHECKV6M-NEXT: bge .LBB2_6 209; CHECKV6M-NEXT: @ %bb.5: @ %else 210; CHECKV6M-NEXT: mov r2, r3 211; CHECKV6M-NEXT: .LBB2_6: @ %else 212; CHECKV6M-NEXT: mov r0, r2 213; CHECKV6M-NEXT: pop {r4, pc} 214; CHECKV6M-NEXT: .LBB2_7: @ %then 215; CHECKV6M-NEXT: mov r1, r3 216; CHECKV6M-NEXT: cmp r0, #0 217; CHECKV6M-NEXT: bge .LBB2_3 218; CHECKV6M-NEXT: .LBB2_8: @ %then 219; CHECKV6M-NEXT: mov r2, r3 220; CHECKV6M-NEXT: adds r0, r2, r1 221; CHECKV6M-NEXT: pop {r4, pc} 222; 223; CHECKV7M-LABEL: icmp32_sge_0: 224; CHECKV7M: @ %bb.0: 225; CHECKV7M-NEXT: mov r12, r3 226; CHECKV7M-NEXT: ldr r3, [sp] 227; CHECKV7M-NEXT: lsls r3, r3, #31 228; CHECKV7M-NEXT: beq .LBB2_2 229; CHECKV7M-NEXT: @ %bb.1: @ %then 230; CHECKV7M-NEXT: cmp.w r1, #-1 231; CHECKV7M-NEXT: mov r1, r12 232; CHECKV7M-NEXT: it gt 233; CHECKV7M-NEXT: movgt r1, r2 234; CHECKV7M-NEXT: cmp.w r0, #-1 235; CHECKV7M-NEXT: it gt 236; CHECKV7M-NEXT: movgt r12, r2 237; CHECKV7M-NEXT: add.w r0, r12, r1 238; CHECKV7M-NEXT: bx lr 239; CHECKV7M-NEXT: .LBB2_2: @ %else 240; CHECKV7M-NEXT: cmp.w r0, #-1 241; CHECKV7M-NEXT: it gt 242; CHECKV7M-NEXT: movgt r12, r2 243; CHECKV7M-NEXT: mov r0, r12 244; CHECKV7M-NEXT: bx lr 245; 246; CHECKV7A-LABEL: icmp32_sge_0: 247; CHECKV7A: @ %bb.0: 248; CHECKV7A-NEXT: mov r12, r3 249; CHECKV7A-NEXT: ldr r3, [sp] 250; CHECKV7A-NEXT: lsls r3, r3, #31 251; CHECKV7A-NEXT: beq .LBB2_2 252; CHECKV7A-NEXT: @ %bb.1: @ %then 253; CHECKV7A-NEXT: cmp.w r1, #-1 254; CHECKV7A-NEXT: mov r1, r12 255; CHECKV7A-NEXT: it gt 256; CHECKV7A-NEXT: movgt r1, r2 257; CHECKV7A-NEXT: cmp.w r0, #-1 258; CHECKV7A-NEXT: it gt 259; CHECKV7A-NEXT: movgt r12, r2 260; CHECKV7A-NEXT: add.w r0, r12, r1 261; CHECKV7A-NEXT: bx lr 262; CHECKV7A-NEXT: .LBB2_2: @ %else 263; CHECKV7A-NEXT: cmp.w r0, #-1 264; CHECKV7A-NEXT: it gt 265; CHECKV7A-NEXT: movgt r12, r2 266; CHECKV7A-NEXT: mov r0, r12 267; CHECKV7A-NEXT: bx lr 268 br i1 %c, label %then, label %else 269then: 270 %c1 = icmp sge i32 %x, 0 271 %c2 = icmp sge i32 %y, 0 272 %s1 = select i1 %c1, i32 %a, i32 %b 273 %s2 = select i1 %c2, i32 %a, i32 %b 274 %r = add i32 %s1, %s2 275 ret i32 %r 276else: 277 %c3 = icmp sge i32 %x, 0 278 %s3 = select i1 %c3, i32 %a, i32 %b 279 ret i32 %s3 280} 281 282define i32 @icmp32_sgt_m1(i32 %x, i32 %y, i32 %a, i32 %b, i1 %c) { 283; CHECKV6M-LABEL: icmp32_sgt_m1: 284; CHECKV6M: @ %bb.0: 285; CHECKV6M-NEXT: .save {r4, lr} 286; CHECKV6M-NEXT: push {r4, lr} 287; CHECKV6M-NEXT: ldr r4, [sp, #8] 288; CHECKV6M-NEXT: lsls r4, r4, #31 289; CHECKV6M-NEXT: beq .LBB3_4 290; CHECKV6M-NEXT: @ %bb.1: @ %then 291; CHECKV6M-NEXT: cmp r1, #0 292; CHECKV6M-NEXT: mov r1, r2 293; CHECKV6M-NEXT: blt .LBB3_7 294; CHECKV6M-NEXT: @ %bb.2: @ %then 295; CHECKV6M-NEXT: cmp r0, #0 296; CHECKV6M-NEXT: blt .LBB3_8 297; CHECKV6M-NEXT: .LBB3_3: @ %then 298; CHECKV6M-NEXT: adds r0, r2, r1 299; CHECKV6M-NEXT: pop {r4, pc} 300; CHECKV6M-NEXT: .LBB3_4: @ %else 301; CHECKV6M-NEXT: cmp r1, #0 302; CHECKV6M-NEXT: bge .LBB3_6 303; CHECKV6M-NEXT: @ %bb.5: @ %else 304; CHECKV6M-NEXT: mov r2, r3 305; CHECKV6M-NEXT: .LBB3_6: @ %else 306; CHECKV6M-NEXT: mov r0, r2 307; CHECKV6M-NEXT: pop {r4, pc} 308; CHECKV6M-NEXT: .LBB3_7: @ %then 309; CHECKV6M-NEXT: mov r1, r3 310; CHECKV6M-NEXT: cmp r0, #0 311; CHECKV6M-NEXT: bge .LBB3_3 312; CHECKV6M-NEXT: .LBB3_8: @ %then 313; CHECKV6M-NEXT: mov r2, r3 314; CHECKV6M-NEXT: adds r0, r2, r1 315; CHECKV6M-NEXT: pop {r4, pc} 316; 317; CHECKV7M-LABEL: icmp32_sgt_m1: 318; CHECKV7M: @ %bb.0: 319; CHECKV7M-NEXT: mov r12, r3 320; CHECKV7M-NEXT: ldr r3, [sp] 321; CHECKV7M-NEXT: lsls r3, r3, #31 322; CHECKV7M-NEXT: beq .LBB3_2 323; CHECKV7M-NEXT: @ %bb.1: @ %then 324; CHECKV7M-NEXT: cmp.w r1, #-1 325; CHECKV7M-NEXT: mov r1, r12 326; CHECKV7M-NEXT: it gt 327; CHECKV7M-NEXT: movgt r1, r2 328; CHECKV7M-NEXT: cmp.w r0, #-1 329; CHECKV7M-NEXT: it gt 330; CHECKV7M-NEXT: movgt r12, r2 331; CHECKV7M-NEXT: add.w r0, r12, r1 332; CHECKV7M-NEXT: bx lr 333; CHECKV7M-NEXT: .LBB3_2: @ %else 334; CHECKV7M-NEXT: cmp.w r1, #-1 335; CHECKV7M-NEXT: it gt 336; CHECKV7M-NEXT: movgt r12, r2 337; CHECKV7M-NEXT: mov r0, r12 338; CHECKV7M-NEXT: bx lr 339; 340; CHECKV7A-LABEL: icmp32_sgt_m1: 341; CHECKV7A: @ %bb.0: 342; CHECKV7A-NEXT: mov r12, r3 343; CHECKV7A-NEXT: ldr r3, [sp] 344; CHECKV7A-NEXT: lsls r3, r3, #31 345; CHECKV7A-NEXT: beq .LBB3_2 346; CHECKV7A-NEXT: @ %bb.1: @ %then 347; CHECKV7A-NEXT: cmp.w r1, #-1 348; CHECKV7A-NEXT: mov r1, r12 349; CHECKV7A-NEXT: it gt 350; CHECKV7A-NEXT: movgt r1, r2 351; CHECKV7A-NEXT: cmp.w r0, #-1 352; CHECKV7A-NEXT: it gt 353; CHECKV7A-NEXT: movgt r12, r2 354; CHECKV7A-NEXT: add.w r0, r12, r1 355; CHECKV7A-NEXT: bx lr 356; CHECKV7A-NEXT: .LBB3_2: @ %else 357; CHECKV7A-NEXT: cmp.w r1, #-1 358; CHECKV7A-NEXT: it gt 359; CHECKV7A-NEXT: movgt r12, r2 360; CHECKV7A-NEXT: mov r0, r12 361; CHECKV7A-NEXT: bx lr 362 br i1 %c, label %then, label %else 363then: 364 %c1 = icmp sgt i32 %x, -1 365 %c2 = icmp sgt i32 %y, -1 366 %s1 = select i1 %c1, i32 %a, i32 %b 367 %s2 = select i1 %c2, i32 %a, i32 %b 368 %r = add i32 %s1, %s2 369 ret i32 %r 370else: 371 %c3 = icmp sgt i32 %y, -1 372 %s3 = select i1 %c3, i32 %a, i32 %b 373 ret i32 %s3 374} 375 376define i32 @icmp64_sle_m1(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) { 377; CHECKV6M-LABEL: icmp64_sle_m1: 378; CHECKV6M: @ %bb.0: 379; CHECKV6M-NEXT: ldr r0, [sp, #8] 380; CHECKV6M-NEXT: lsls r0, r0, #31 381; CHECKV6M-NEXT: ldr r2, [sp, #4] 382; CHECKV6M-NEXT: ldr r0, [sp] 383; CHECKV6M-NEXT: beq .LBB4_4 384; CHECKV6M-NEXT: @ %bb.1: @ %then 385; CHECKV6M-NEXT: cmp r3, #0 386; CHECKV6M-NEXT: mov r3, r0 387; CHECKV6M-NEXT: bpl .LBB4_7 388; CHECKV6M-NEXT: @ %bb.2: @ %then 389; CHECKV6M-NEXT: cmp r1, #0 390; CHECKV6M-NEXT: bpl .LBB4_8 391; CHECKV6M-NEXT: .LBB4_3: @ %then 392; CHECKV6M-NEXT: adds r0, r0, r3 393; CHECKV6M-NEXT: bx lr 394; CHECKV6M-NEXT: .LBB4_4: @ %else 395; CHECKV6M-NEXT: cmp r3, #0 396; CHECKV6M-NEXT: bmi .LBB4_6 397; CHECKV6M-NEXT: @ %bb.5: @ %else 398; CHECKV6M-NEXT: mov r0, r2 399; CHECKV6M-NEXT: .LBB4_6: @ %else 400; CHECKV6M-NEXT: bx lr 401; CHECKV6M-NEXT: .LBB4_7: @ %then 402; CHECKV6M-NEXT: mov r3, r2 403; CHECKV6M-NEXT: cmp r1, #0 404; CHECKV6M-NEXT: bmi .LBB4_3 405; CHECKV6M-NEXT: .LBB4_8: @ %then 406; CHECKV6M-NEXT: mov r0, r2 407; CHECKV6M-NEXT: adds r0, r0, r3 408; CHECKV6M-NEXT: bx lr 409; 410; CHECKV7M-LABEL: icmp64_sle_m1: 411; CHECKV7M: @ %bb.0: 412; CHECKV7M-NEXT: ldr r0, [sp, #8] 413; CHECKV7M-NEXT: lsls r0, r0, #31 414; CHECKV7M-NEXT: ldrd r2, r0, [sp] 415; CHECKV7M-NEXT: beq .LBB4_2 416; CHECKV7M-NEXT: @ %bb.1: @ %then 417; CHECKV7M-NEXT: cmp r3, #0 418; CHECKV7M-NEXT: mov r3, r0 419; CHECKV7M-NEXT: it mi 420; CHECKV7M-NEXT: movmi r3, r2 421; CHECKV7M-NEXT: cmp r1, #0 422; CHECKV7M-NEXT: it mi 423; CHECKV7M-NEXT: movmi r0, r2 424; CHECKV7M-NEXT: add r0, r3 425; CHECKV7M-NEXT: bx lr 426; CHECKV7M-NEXT: .LBB4_2: @ %else 427; CHECKV7M-NEXT: cmp r3, #0 428; CHECKV7M-NEXT: it mi 429; CHECKV7M-NEXT: movmi r0, r2 430; CHECKV7M-NEXT: bx lr 431; 432; CHECKV7A-LABEL: icmp64_sle_m1: 433; CHECKV7A: @ %bb.0: 434; CHECKV7A-NEXT: ldr r2, [sp, #8] 435; CHECKV7A-NEXT: ldrd r12, r0, [sp] 436; CHECKV7A-NEXT: lsls r2, r2, #31 437; CHECKV7A-NEXT: beq .LBB4_2 438; CHECKV7A-NEXT: @ %bb.1: @ %then 439; CHECKV7A-NEXT: cmp r3, #0 440; CHECKV7A-NEXT: mov r2, r0 441; CHECKV7A-NEXT: it mi 442; CHECKV7A-NEXT: movmi r2, r12 443; CHECKV7A-NEXT: cmp r1, #0 444; CHECKV7A-NEXT: it mi 445; CHECKV7A-NEXT: movmi r0, r12 446; CHECKV7A-NEXT: add r0, r2 447; CHECKV7A-NEXT: bx lr 448; CHECKV7A-NEXT: .LBB4_2: @ %else 449; CHECKV7A-NEXT: cmp r3, #0 450; CHECKV7A-NEXT: it mi 451; CHECKV7A-NEXT: movmi r0, r12 452; CHECKV7A-NEXT: bx lr 453 br i1 %c, label %then, label %else 454then: 455 %c1 = icmp sle i64 %x, -1 456 %c2 = icmp sle i64 %y, -1 457 %s1 = select i1 %c1, i32 %a, i32 %b 458 %s2 = select i1 %c2, i32 %a, i32 %b 459 %r = add i32 %s1, %s2 460 ret i32 %r 461else: 462 %c3 = icmp sle i64 %y, -1 463 %s3 = select i1 %c3, i32 %a, i32 %b 464 ret i32 %s3 465} 466 467define i32 @icmp64_ule_m1(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) { 468; CHECKV6M-LABEL: icmp64_ule_m1: 469; CHECKV6M: @ %bb.0: 470; CHECKV6M-NEXT: .save {r4, r5, r6, r7, lr} 471; CHECKV6M-NEXT: push {r4, r5, r6, r7, lr} 472; CHECKV6M-NEXT: mov r4, r0 473; CHECKV6M-NEXT: ldr r0, [sp, #28] 474; CHECKV6M-NEXT: lsls r0, r0, #31 475; CHECKV6M-NEXT: ldr r6, .LCPI5_0 476; CHECKV6M-NEXT: ldr r5, [sp, #24] 477; CHECKV6M-NEXT: ldr r0, [sp, #20] 478; CHECKV6M-NEXT: beq .LBB5_6 479; CHECKV6M-NEXT: @ %bb.1: @ %then 480; CHECKV6M-NEXT: movs r7, #0 481; CHECKV6M-NEXT: subs r2, r2, r6 482; CHECKV6M-NEXT: sbcs r3, r7 483; CHECKV6M-NEXT: mov r2, r0 484; CHECKV6M-NEXT: blo .LBB5_3 485; CHECKV6M-NEXT: @ %bb.2: @ %then 486; CHECKV6M-NEXT: mov r2, r5 487; CHECKV6M-NEXT: .LBB5_3: @ %then 488; CHECKV6M-NEXT: subs r3, r4, r6 489; CHECKV6M-NEXT: sbcs r1, r7 490; CHECKV6M-NEXT: blo .LBB5_5 491; CHECKV6M-NEXT: @ %bb.4: @ %then 492; CHECKV6M-NEXT: mov r0, r5 493; CHECKV6M-NEXT: .LBB5_5: @ %then 494; CHECKV6M-NEXT: adds r0, r0, r2 495; CHECKV6M-NEXT: pop {r4, r5, r6, r7, pc} 496; CHECKV6M-NEXT: .LBB5_6: @ %else 497; CHECKV6M-NEXT: movs r1, #0 498; CHECKV6M-NEXT: subs r2, r2, r6 499; CHECKV6M-NEXT: sbcs r3, r1 500; CHECKV6M-NEXT: blo .LBB5_8 501; CHECKV6M-NEXT: @ %bb.7: @ %else 502; CHECKV6M-NEXT: mov r0, r5 503; CHECKV6M-NEXT: .LBB5_8: @ %else 504; CHECKV6M-NEXT: pop {r4, r5, r6, r7, pc} 505; CHECKV6M-NEXT: .p2align 2 506; CHECKV6M-NEXT: @ %bb.9: 507; CHECKV6M-NEXT: .LCPI5_0: 508; CHECKV6M-NEXT: .long 131073 @ 0x20001 509; 510; CHECKV7M-LABEL: icmp64_ule_m1: 511; CHECKV7M: @ %bb.0: 512; CHECKV7M-NEXT: .save {r4, lr} 513; CHECKV7M-NEXT: push {r4, lr} 514; CHECKV7M-NEXT: mov r12, r0 515; CHECKV7M-NEXT: ldr r0, [sp, #16] 516; CHECKV7M-NEXT: movs r4, #1 517; CHECKV7M-NEXT: movt r4, #2 518; CHECKV7M-NEXT: lsls r0, r0, #31 519; CHECKV7M-NEXT: ldrd lr, r0, [sp, #8] 520; CHECKV7M-NEXT: beq .LBB5_2 521; CHECKV7M-NEXT: @ %bb.1: @ %then 522; CHECKV7M-NEXT: subs r2, r2, r4 523; CHECKV7M-NEXT: sbcs r2, r3, #0 524; CHECKV7M-NEXT: mov r2, r0 525; CHECKV7M-NEXT: it lo 526; CHECKV7M-NEXT: movlo r2, lr 527; CHECKV7M-NEXT: subs.w r3, r12, r4 528; CHECKV7M-NEXT: sbcs r1, r1, #0 529; CHECKV7M-NEXT: it lo 530; CHECKV7M-NEXT: movlo r0, lr 531; CHECKV7M-NEXT: add r0, r2 532; CHECKV7M-NEXT: pop {r4, pc} 533; CHECKV7M-NEXT: .LBB5_2: @ %else 534; CHECKV7M-NEXT: subs r1, r2, r4 535; CHECKV7M-NEXT: sbcs r1, r3, #0 536; CHECKV7M-NEXT: it lo 537; CHECKV7M-NEXT: movlo r0, lr 538; CHECKV7M-NEXT: pop {r4, pc} 539; 540; CHECKV7A-LABEL: icmp64_ule_m1: 541; CHECKV7A: @ %bb.0: 542; CHECKV7A-NEXT: .save {r4, lr} 543; CHECKV7A-NEXT: push {r4, lr} 544; CHECKV7A-NEXT: ldr r4, [sp, #16] 545; CHECKV7A-NEXT: mov r12, r0 546; CHECKV7A-NEXT: ldrd lr, r0, [sp, #8] 547; CHECKV7A-NEXT: lsls r4, r4, #31 548; CHECKV7A-NEXT: movw r4, #1 549; CHECKV7A-NEXT: movt r4, #2 550; CHECKV7A-NEXT: beq .LBB5_2 551; CHECKV7A-NEXT: @ %bb.1: @ %then 552; CHECKV7A-NEXT: subs r2, r2, r4 553; CHECKV7A-NEXT: sbcs r2, r3, #0 554; CHECKV7A-NEXT: mov r2, r0 555; CHECKV7A-NEXT: it lo 556; CHECKV7A-NEXT: movlo r2, lr 557; CHECKV7A-NEXT: subs.w r3, r12, r4 558; CHECKV7A-NEXT: sbcs r1, r1, #0 559; CHECKV7A-NEXT: it lo 560; CHECKV7A-NEXT: movlo r0, lr 561; CHECKV7A-NEXT: add r0, r2 562; CHECKV7A-NEXT: pop {r4, pc} 563; CHECKV7A-NEXT: .LBB5_2: @ %else 564; CHECKV7A-NEXT: subs r1, r2, r4 565; CHECKV7A-NEXT: sbcs r1, r3, #0 566; CHECKV7A-NEXT: it lo 567; CHECKV7A-NEXT: movlo r0, lr 568; CHECKV7A-NEXT: pop {r4, pc} 569 br i1 %c, label %then, label %else 570then: 571 %c1 = icmp ult i64 %x, 131073 572 %c2 = icmp ult i64 %y, 131073 573 %s1 = select i1 %c1, i32 %a, i32 %b 574 %s2 = select i1 %c2, i32 %a, i32 %b 575 %r = add i32 %s1, %s2 576 ret i32 %r 577else: 578 %c3 = icmp ult i64 %y, 131073 579 %s3 = select i1 %c3, i32 %a, i32 %b 580 ret i32 %s3 581} 582 583define i32 @icmp64_uge_m2(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) { 584; CHECKV6M-LABEL: icmp64_uge_m2: 585; CHECKV6M: @ %bb.0: 586; CHECKV6M-NEXT: .save {r4, r5, r6, r7, lr} 587; CHECKV6M-NEXT: push {r4, r5, r6, r7, lr} 588; CHECKV6M-NEXT: mov r4, r0 589; CHECKV6M-NEXT: movs r0, #1 590; CHECKV6M-NEXT: lsls r6, r0, #17 591; CHECKV6M-NEXT: ldr r0, [sp, #28] 592; CHECKV6M-NEXT: lsls r0, r0, #31 593; CHECKV6M-NEXT: ldr r5, [sp, #24] 594; CHECKV6M-NEXT: ldr r0, [sp, #20] 595; CHECKV6M-NEXT: beq .LBB6_6 596; CHECKV6M-NEXT: @ %bb.1: @ %then 597; CHECKV6M-NEXT: movs r7, #0 598; CHECKV6M-NEXT: subs r2, r2, r6 599; CHECKV6M-NEXT: sbcs r3, r7 600; CHECKV6M-NEXT: mov r2, r0 601; CHECKV6M-NEXT: bhs .LBB6_3 602; CHECKV6M-NEXT: @ %bb.2: @ %then 603; CHECKV6M-NEXT: mov r2, r5 604; CHECKV6M-NEXT: .LBB6_3: @ %then 605; CHECKV6M-NEXT: subs r3, r4, r6 606; CHECKV6M-NEXT: sbcs r1, r7 607; CHECKV6M-NEXT: bhs .LBB6_5 608; CHECKV6M-NEXT: @ %bb.4: @ %then 609; CHECKV6M-NEXT: mov r0, r5 610; CHECKV6M-NEXT: .LBB6_5: @ %then 611; CHECKV6M-NEXT: adds r0, r0, r2 612; CHECKV6M-NEXT: pop {r4, r5, r6, r7, pc} 613; CHECKV6M-NEXT: .LBB6_6: @ %else 614; CHECKV6M-NEXT: movs r1, #0 615; CHECKV6M-NEXT: subs r2, r2, r6 616; CHECKV6M-NEXT: sbcs r3, r1 617; CHECKV6M-NEXT: bhs .LBB6_8 618; CHECKV6M-NEXT: @ %bb.7: @ %else 619; CHECKV6M-NEXT: mov r0, r5 620; CHECKV6M-NEXT: .LBB6_8: @ %else 621; CHECKV6M-NEXT: pop {r4, r5, r6, r7, pc} 622; 623; CHECKV7M-LABEL: icmp64_uge_m2: 624; CHECKV7M: @ %bb.0: 625; CHECKV7M-NEXT: .save {r7, lr} 626; CHECKV7M-NEXT: push {r7, lr} 627; CHECKV7M-NEXT: mov r12, r0 628; CHECKV7M-NEXT: ldr r0, [sp, #16] 629; CHECKV7M-NEXT: lsls r0, r0, #31 630; CHECKV7M-NEXT: ldrd lr, r0, [sp, #8] 631; CHECKV7M-NEXT: beq .LBB6_2 632; CHECKV7M-NEXT: @ %bb.1: @ %then 633; CHECKV7M-NEXT: orrs.w r2, r3, r2, lsr #17 634; CHECKV7M-NEXT: mov r2, r0 635; CHECKV7M-NEXT: it ne 636; CHECKV7M-NEXT: movne r2, lr 637; CHECKV7M-NEXT: orrs.w r1, r1, r12, lsr #17 638; CHECKV7M-NEXT: it ne 639; CHECKV7M-NEXT: movne r0, lr 640; CHECKV7M-NEXT: add r0, r2 641; CHECKV7M-NEXT: pop {r7, pc} 642; CHECKV7M-NEXT: .LBB6_2: @ %else 643; CHECKV7M-NEXT: orrs.w r1, r3, r2, lsr #17 644; CHECKV7M-NEXT: it ne 645; CHECKV7M-NEXT: movne r0, lr 646; CHECKV7M-NEXT: pop {r7, pc} 647; 648; CHECKV7A-LABEL: icmp64_uge_m2: 649; CHECKV7A: @ %bb.0: 650; CHECKV7A-NEXT: .save {r4, lr} 651; CHECKV7A-NEXT: push {r4, lr} 652; CHECKV7A-NEXT: ldr r4, [sp, #16] 653; CHECKV7A-NEXT: mov r12, r0 654; CHECKV7A-NEXT: ldrd lr, r0, [sp, #8] 655; CHECKV7A-NEXT: lsls r4, r4, #31 656; CHECKV7A-NEXT: beq .LBB6_2 657; CHECKV7A-NEXT: @ %bb.1: @ %then 658; CHECKV7A-NEXT: orrs.w r2, r3, r2, lsr #17 659; CHECKV7A-NEXT: mov r2, r0 660; CHECKV7A-NEXT: it ne 661; CHECKV7A-NEXT: movne r2, lr 662; CHECKV7A-NEXT: orrs.w r1, r1, r12, lsr #17 663; CHECKV7A-NEXT: it ne 664; CHECKV7A-NEXT: movne r0, lr 665; CHECKV7A-NEXT: add r0, r2 666; CHECKV7A-NEXT: pop {r4, pc} 667; CHECKV7A-NEXT: .LBB6_2: @ %else 668; CHECKV7A-NEXT: orrs.w r1, r3, r2, lsr #17 669; CHECKV7A-NEXT: it ne 670; CHECKV7A-NEXT: movne r0, lr 671; CHECKV7A-NEXT: pop {r4, pc} 672 br i1 %c, label %then, label %else 673then: 674 %c1 = icmp uge i64 %x, 131072 675 %c2 = icmp uge i64 %y, 131072 676 %s1 = select i1 %c1, i32 %a, i32 %b 677 %s2 = select i1 %c2, i32 %a, i32 %b 678 %r = add i32 %s1, %s2 679 ret i32 %r 680else: 681 %c3 = icmp uge i64 %y, 131072 682 %s3 = select i1 %c3, i32 %a, i32 %b 683 ret i32 %s3 684} 685 686define i32 @icmp64_ugt_m1(i64 %x, i64 %y, i32 %a, i32 %b, i1 %c) { 687; CHECKV6M-LABEL: icmp64_ugt_m1: 688; CHECKV6M: @ %bb.0: 689; CHECKV6M-NEXT: .save {r4, r5, r6, r7, lr} 690; CHECKV6M-NEXT: push {r4, r5, r6, r7, lr} 691; CHECKV6M-NEXT: mov r4, r0 692; CHECKV6M-NEXT: ldr r0, [sp, #28] 693; CHECKV6M-NEXT: lsls r0, r0, #31 694; CHECKV6M-NEXT: ldr r6, .LCPI7_0 695; CHECKV6M-NEXT: ldr r5, [sp, #24] 696; CHECKV6M-NEXT: ldr r0, [sp, #20] 697; CHECKV6M-NEXT: beq .LBB7_6 698; CHECKV6M-NEXT: @ %bb.1: @ %then 699; CHECKV6M-NEXT: movs r7, #0 700; CHECKV6M-NEXT: subs r2, r6, r2 701; CHECKV6M-NEXT: mov r2, r7 702; CHECKV6M-NEXT: sbcs r2, r3 703; CHECKV6M-NEXT: mov r2, r0 704; CHECKV6M-NEXT: blo .LBB7_3 705; CHECKV6M-NEXT: @ %bb.2: @ %then 706; CHECKV6M-NEXT: mov r2, r5 707; CHECKV6M-NEXT: .LBB7_3: @ %then 708; CHECKV6M-NEXT: subs r3, r6, r4 709; CHECKV6M-NEXT: sbcs r7, r1 710; CHECKV6M-NEXT: blo .LBB7_5 711; CHECKV6M-NEXT: @ %bb.4: @ %then 712; CHECKV6M-NEXT: mov r0, r5 713; CHECKV6M-NEXT: .LBB7_5: @ %then 714; CHECKV6M-NEXT: adds r0, r0, r2 715; CHECKV6M-NEXT: pop {r4, r5, r6, r7, pc} 716; CHECKV6M-NEXT: .LBB7_6: @ %else 717; CHECKV6M-NEXT: movs r1, #0 718; CHECKV6M-NEXT: subs r2, r6, r2 719; CHECKV6M-NEXT: sbcs r1, r3 720; CHECKV6M-NEXT: blo .LBB7_8 721; CHECKV6M-NEXT: @ %bb.7: @ %else 722; CHECKV6M-NEXT: mov r0, r5 723; CHECKV6M-NEXT: .LBB7_8: @ %else 724; CHECKV6M-NEXT: pop {r4, r5, r6, r7, pc} 725; CHECKV6M-NEXT: .p2align 2 726; CHECKV6M-NEXT: @ %bb.9: 727; CHECKV6M-NEXT: .LCPI7_0: 728; CHECKV6M-NEXT: .long 131073 @ 0x20001 729; 730; CHECKV7M-LABEL: icmp64_ugt_m1: 731; CHECKV7M: @ %bb.0: 732; CHECKV7M-NEXT: .save {r4, r5, r7, lr} 733; CHECKV7M-NEXT: push {r4, r5, r7, lr} 734; CHECKV7M-NEXT: mov r12, r0 735; CHECKV7M-NEXT: ldr r0, [sp, #24] 736; CHECKV7M-NEXT: movs r4, #1 737; CHECKV7M-NEXT: movt r4, #2 738; CHECKV7M-NEXT: lsls r0, r0, #31 739; CHECKV7M-NEXT: ldrd lr, r0, [sp, #16] 740; CHECKV7M-NEXT: beq .LBB7_2 741; CHECKV7M-NEXT: @ %bb.1: @ %then 742; CHECKV7M-NEXT: subs r2, r4, r2 743; CHECKV7M-NEXT: mov.w r5, #0 744; CHECKV7M-NEXT: sbcs.w r2, r5, r3 745; CHECKV7M-NEXT: mov r2, r0 746; CHECKV7M-NEXT: it lo 747; CHECKV7M-NEXT: movlo r2, lr 748; CHECKV7M-NEXT: subs.w r3, r4, r12 749; CHECKV7M-NEXT: sbcs.w r1, r5, r1 750; CHECKV7M-NEXT: it lo 751; CHECKV7M-NEXT: movlo r0, lr 752; CHECKV7M-NEXT: add r0, r2 753; CHECKV7M-NEXT: pop {r4, r5, r7, pc} 754; CHECKV7M-NEXT: .LBB7_2: @ %else 755; CHECKV7M-NEXT: movs r1, #0 756; CHECKV7M-NEXT: subs r2, r4, r2 757; CHECKV7M-NEXT: sbcs r1, r3 758; CHECKV7M-NEXT: it lo 759; CHECKV7M-NEXT: movlo r0, lr 760; CHECKV7M-NEXT: pop {r4, r5, r7, pc} 761; 762; CHECKV7A-LABEL: icmp64_ugt_m1: 763; CHECKV7A: @ %bb.0: 764; CHECKV7A-NEXT: .save {r4, r5, r7, lr} 765; CHECKV7A-NEXT: push {r4, r5, r7, lr} 766; CHECKV7A-NEXT: ldr r4, [sp, #24] 767; CHECKV7A-NEXT: mov r12, r0 768; CHECKV7A-NEXT: ldrd lr, r0, [sp, #16] 769; CHECKV7A-NEXT: lsls r4, r4, #31 770; CHECKV7A-NEXT: movw r4, #1 771; CHECKV7A-NEXT: movt r4, #2 772; CHECKV7A-NEXT: beq .LBB7_2 773; CHECKV7A-NEXT: @ %bb.1: @ %then 774; CHECKV7A-NEXT: subs r2, r4, r2 775; CHECKV7A-NEXT: mov.w r5, #0 776; CHECKV7A-NEXT: sbcs.w r2, r5, r3 777; CHECKV7A-NEXT: mov r2, r0 778; CHECKV7A-NEXT: it lo 779; CHECKV7A-NEXT: movlo r2, lr 780; CHECKV7A-NEXT: subs.w r3, r4, r12 781; CHECKV7A-NEXT: sbcs.w r1, r5, r1 782; CHECKV7A-NEXT: it lo 783; CHECKV7A-NEXT: movlo r0, lr 784; CHECKV7A-NEXT: add r0, r2 785; CHECKV7A-NEXT: pop {r4, r5, r7, pc} 786; CHECKV7A-NEXT: .LBB7_2: @ %else 787; CHECKV7A-NEXT: movs r1, #0 788; CHECKV7A-NEXT: subs r2, r4, r2 789; CHECKV7A-NEXT: sbcs r1, r3 790; CHECKV7A-NEXT: it lo 791; CHECKV7A-NEXT: movlo r0, lr 792; CHECKV7A-NEXT: pop {r4, r5, r7, pc} 793 br i1 %c, label %then, label %else 794then: 795 %c1 = icmp ugt i64 %x, 131073 796 %c2 = icmp ugt i64 %y, 131073 797 %s1 = select i1 %c1, i32 %a, i32 %b 798 %s2 = select i1 %c2, i32 %a, i32 %b 799 %r = add i32 %s1, %s2 800 ret i32 %r 801else: 802 %c3 = icmp ugt i64 %y, 131073 803 %s3 = select i1 %c3, i32 %a, i32 %b 804 ret i32 %s3 805} 806