1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=armv6 < %s | FileCheck %s --check-prefixes=ARM,ARM6 3; RUN: llc -mtriple=armv7 < %s | FileCheck %s --check-prefixes=ARM,ARM78 4; RUN: llc -mtriple=armv8a < %s | FileCheck %s --check-prefixes=ARM,ARM78 5; RUN: llc -mtriple=thumbv6 < %s | FileCheck %s --check-prefixes=THUMB,THUMB6 6; RUN: llc -mtriple=thumbv7 < %s | FileCheck %s --check-prefixes=THUMB,THUMB78 7; RUN: llc -mtriple=thumbv8-eabi < %s | FileCheck %s --check-prefixes=THUMB,THUMB78 8 9; We are looking for the following pattern here: 10; (X & (C << Y)) ==/!= 0 11; It may be optimal to hoist the constant: 12; ((X l>> Y) & C) ==/!= 0 13 14;------------------------------------------------------------------------------; 15; A few scalar test 16;------------------------------------------------------------------------------; 17 18; i8 scalar 19 20define i1 @scalar_i8_signbit_eq(i8 %x, i8 %y) nounwind { 21; ARM-LABEL: scalar_i8_signbit_eq: 22; ARM: @ %bb.0: 23; ARM-NEXT: uxtb r1, r1 24; ARM-NEXT: uxtb r0, r0 25; ARM-NEXT: lsr r0, r0, r1 26; ARM-NEXT: mov r1, #1 27; ARM-NEXT: eor r0, r1, r0, lsr #7 28; ARM-NEXT: bx lr 29; 30; THUMB6-LABEL: scalar_i8_signbit_eq: 31; THUMB6: @ %bb.0: 32; THUMB6-NEXT: uxtb r1, r1 33; THUMB6-NEXT: uxtb r0, r0 34; THUMB6-NEXT: lsrs r0, r1 35; THUMB6-NEXT: movs r1, #128 36; THUMB6-NEXT: ands r1, r0 37; THUMB6-NEXT: rsbs r0, r1, #0 38; THUMB6-NEXT: adcs r0, r1 39; THUMB6-NEXT: bx lr 40; 41; THUMB78-LABEL: scalar_i8_signbit_eq: 42; THUMB78: @ %bb.0: 43; THUMB78-NEXT: uxtb r1, r1 44; THUMB78-NEXT: uxtb r0, r0 45; THUMB78-NEXT: lsrs r0, r1 46; THUMB78-NEXT: movs r1, #1 47; THUMB78-NEXT: eor.w r0, r1, r0, lsr #7 48; THUMB78-NEXT: bx lr 49 %t0 = shl i8 128, %y 50 %t1 = and i8 %t0, %x 51 %res = icmp eq i8 %t1, 0 52 ret i1 %res 53} 54 55define i1 @scalar_i8_lowestbit_eq(i8 %x, i8 %y) nounwind { 56; ARM-LABEL: scalar_i8_lowestbit_eq: 57; ARM: @ %bb.0: 58; ARM-NEXT: uxtb r1, r1 59; ARM-NEXT: uxtb r0, r0 60; ARM-NEXT: mov r2, #1 61; ARM-NEXT: bic r0, r2, r0, lsr r1 62; ARM-NEXT: bx lr 63; 64; THUMB6-LABEL: scalar_i8_lowestbit_eq: 65; THUMB6: @ %bb.0: 66; THUMB6-NEXT: uxtb r1, r1 67; THUMB6-NEXT: uxtb r0, r0 68; THUMB6-NEXT: lsrs r0, r1 69; THUMB6-NEXT: movs r1, #1 70; THUMB6-NEXT: ands r1, r0 71; THUMB6-NEXT: rsbs r0, r1, #0 72; THUMB6-NEXT: adcs r0, r1 73; THUMB6-NEXT: bx lr 74; 75; THUMB78-LABEL: scalar_i8_lowestbit_eq: 76; THUMB78: @ %bb.0: 77; THUMB78-NEXT: uxtb r1, r1 78; THUMB78-NEXT: uxtb r0, r0 79; THUMB78-NEXT: lsrs r0, r1 80; THUMB78-NEXT: movs r1, #1 81; THUMB78-NEXT: bic.w r0, r1, r0 82; THUMB78-NEXT: bx lr 83 %t0 = shl i8 1, %y 84 %t1 = and i8 %t0, %x 85 %res = icmp eq i8 %t1, 0 86 ret i1 %res 87} 88 89define i1 @scalar_i8_bitsinmiddle_eq(i8 %x, i8 %y) nounwind { 90; ARM-LABEL: scalar_i8_bitsinmiddle_eq: 91; ARM: @ %bb.0: 92; ARM-NEXT: uxtb r1, r1 93; ARM-NEXT: uxtb r0, r0 94; ARM-NEXT: mov r2, #24 95; ARM-NEXT: and r0, r2, r0, lsr r1 96; ARM-NEXT: clz r0, r0 97; ARM-NEXT: lsr r0, r0, #5 98; ARM-NEXT: bx lr 99; 100; THUMB6-LABEL: scalar_i8_bitsinmiddle_eq: 101; THUMB6: @ %bb.0: 102; THUMB6-NEXT: uxtb r1, r1 103; THUMB6-NEXT: uxtb r0, r0 104; THUMB6-NEXT: lsrs r0, r1 105; THUMB6-NEXT: movs r1, #24 106; THUMB6-NEXT: ands r1, r0 107; THUMB6-NEXT: rsbs r0, r1, #0 108; THUMB6-NEXT: adcs r0, r1 109; THUMB6-NEXT: bx lr 110; 111; THUMB78-LABEL: scalar_i8_bitsinmiddle_eq: 112; THUMB78: @ %bb.0: 113; THUMB78-NEXT: uxtb r1, r1 114; THUMB78-NEXT: uxtb r0, r0 115; THUMB78-NEXT: lsrs r0, r1 116; THUMB78-NEXT: and r0, r0, #24 117; THUMB78-NEXT: clz r0, r0 118; THUMB78-NEXT: lsrs r0, r0, #5 119; THUMB78-NEXT: bx lr 120 %t0 = shl i8 24, %y 121 %t1 = and i8 %t0, %x 122 %res = icmp eq i8 %t1, 0 123 ret i1 %res 124} 125 126; i16 scalar 127 128define i1 @scalar_i16_signbit_eq(i16 %x, i16 %y) nounwind { 129; ARM-LABEL: scalar_i16_signbit_eq: 130; ARM: @ %bb.0: 131; ARM-NEXT: uxth r1, r1 132; ARM-NEXT: uxth r0, r0 133; ARM-NEXT: lsr r0, r0, r1 134; ARM-NEXT: mov r1, #1 135; ARM-NEXT: eor r0, r1, r0, lsr #15 136; ARM-NEXT: bx lr 137; 138; THUMB6-LABEL: scalar_i16_signbit_eq: 139; THUMB6: @ %bb.0: 140; THUMB6-NEXT: uxth r1, r1 141; THUMB6-NEXT: uxth r0, r0 142; THUMB6-NEXT: lsrs r0, r1 143; THUMB6-NEXT: movs r1, #1 144; THUMB6-NEXT: lsls r1, r1, #15 145; THUMB6-NEXT: ands r1, r0 146; THUMB6-NEXT: rsbs r0, r1, #0 147; THUMB6-NEXT: adcs r0, r1 148; THUMB6-NEXT: bx lr 149; 150; THUMB78-LABEL: scalar_i16_signbit_eq: 151; THUMB78: @ %bb.0: 152; THUMB78-NEXT: uxth r1, r1 153; THUMB78-NEXT: uxth r0, r0 154; THUMB78-NEXT: lsrs r0, r1 155; THUMB78-NEXT: movs r1, #1 156; THUMB78-NEXT: eor.w r0, r1, r0, lsr #15 157; THUMB78-NEXT: bx lr 158 %t0 = shl i16 32768, %y 159 %t1 = and i16 %t0, %x 160 %res = icmp eq i16 %t1, 0 161 ret i1 %res 162} 163 164define i1 @scalar_i16_lowestbit_eq(i16 %x, i16 %y) nounwind { 165; ARM-LABEL: scalar_i16_lowestbit_eq: 166; ARM: @ %bb.0: 167; ARM-NEXT: uxth r1, r1 168; ARM-NEXT: uxth r0, r0 169; ARM-NEXT: mov r2, #1 170; ARM-NEXT: bic r0, r2, r0, lsr r1 171; ARM-NEXT: bx lr 172; 173; THUMB6-LABEL: scalar_i16_lowestbit_eq: 174; THUMB6: @ %bb.0: 175; THUMB6-NEXT: uxth r1, r1 176; THUMB6-NEXT: uxth r0, r0 177; THUMB6-NEXT: lsrs r0, r1 178; THUMB6-NEXT: movs r1, #1 179; THUMB6-NEXT: ands r1, r0 180; THUMB6-NEXT: rsbs r0, r1, #0 181; THUMB6-NEXT: adcs r0, r1 182; THUMB6-NEXT: bx lr 183; 184; THUMB78-LABEL: scalar_i16_lowestbit_eq: 185; THUMB78: @ %bb.0: 186; THUMB78-NEXT: uxth r1, r1 187; THUMB78-NEXT: uxth r0, r0 188; THUMB78-NEXT: lsrs r0, r1 189; THUMB78-NEXT: movs r1, #1 190; THUMB78-NEXT: bic.w r0, r1, r0 191; THUMB78-NEXT: bx lr 192 %t0 = shl i16 1, %y 193 %t1 = and i16 %t0, %x 194 %res = icmp eq i16 %t1, 0 195 ret i1 %res 196} 197 198define i1 @scalar_i16_bitsinmiddle_eq(i16 %x, i16 %y) nounwind { 199; ARM-LABEL: scalar_i16_bitsinmiddle_eq: 200; ARM: @ %bb.0: 201; ARM-NEXT: uxth r1, r1 202; ARM-NEXT: uxth r0, r0 203; ARM-NEXT: mov r2, #4080 204; ARM-NEXT: and r0, r2, r0, lsr r1 205; ARM-NEXT: clz r0, r0 206; ARM-NEXT: lsr r0, r0, #5 207; ARM-NEXT: bx lr 208; 209; THUMB6-LABEL: scalar_i16_bitsinmiddle_eq: 210; THUMB6: @ %bb.0: 211; THUMB6-NEXT: uxth r1, r1 212; THUMB6-NEXT: uxth r0, r0 213; THUMB6-NEXT: lsrs r0, r1 214; THUMB6-NEXT: movs r1, #255 215; THUMB6-NEXT: lsls r1, r1, #4 216; THUMB6-NEXT: ands r1, r0 217; THUMB6-NEXT: rsbs r0, r1, #0 218; THUMB6-NEXT: adcs r0, r1 219; THUMB6-NEXT: bx lr 220; 221; THUMB78-LABEL: scalar_i16_bitsinmiddle_eq: 222; THUMB78: @ %bb.0: 223; THUMB78-NEXT: uxth r1, r1 224; THUMB78-NEXT: uxth r0, r0 225; THUMB78-NEXT: lsrs r0, r1 226; THUMB78-NEXT: and r0, r0, #4080 227; THUMB78-NEXT: clz r0, r0 228; THUMB78-NEXT: lsrs r0, r0, #5 229; THUMB78-NEXT: bx lr 230 %t0 = shl i16 4080, %y 231 %t1 = and i16 %t0, %x 232 %res = icmp eq i16 %t1, 0 233 ret i1 %res 234} 235 236; i32 scalar 237 238define i1 @scalar_i32_signbit_eq(i32 %x, i32 %y) nounwind { 239; ARM-LABEL: scalar_i32_signbit_eq: 240; ARM: @ %bb.0: 241; ARM-NEXT: mvn r0, r0, lsr r1 242; ARM-NEXT: lsr r0, r0, #31 243; ARM-NEXT: bx lr 244; 245; THUMB6-LABEL: scalar_i32_signbit_eq: 246; THUMB6: @ %bb.0: 247; THUMB6-NEXT: lsrs r0, r1 248; THUMB6-NEXT: movs r1, #1 249; THUMB6-NEXT: lsls r1, r1, #31 250; THUMB6-NEXT: ands r0, r1 251; THUMB6-NEXT: rsbs r1, r0, #0 252; THUMB6-NEXT: adcs r0, r1 253; THUMB6-NEXT: bx lr 254; 255; THUMB78-LABEL: scalar_i32_signbit_eq: 256; THUMB78: @ %bb.0: 257; THUMB78-NEXT: lsrs r0, r1 258; THUMB78-NEXT: mvns r0, r0 259; THUMB78-NEXT: lsrs r0, r0, #31 260; THUMB78-NEXT: bx lr 261 %t0 = shl i32 2147483648, %y 262 %t1 = and i32 %t0, %x 263 %res = icmp eq i32 %t1, 0 264 ret i1 %res 265} 266 267define i1 @scalar_i32_lowestbit_eq(i32 %x, i32 %y) nounwind { 268; ARM-LABEL: scalar_i32_lowestbit_eq: 269; ARM: @ %bb.0: 270; ARM-NEXT: mov r2, #1 271; ARM-NEXT: bic r0, r2, r0, lsr r1 272; ARM-NEXT: bx lr 273; 274; THUMB6-LABEL: scalar_i32_lowestbit_eq: 275; THUMB6: @ %bb.0: 276; THUMB6-NEXT: lsrs r0, r1 277; THUMB6-NEXT: movs r1, #1 278; THUMB6-NEXT: ands r0, r1 279; THUMB6-NEXT: rsbs r1, r0, #0 280; THUMB6-NEXT: adcs r0, r1 281; THUMB6-NEXT: bx lr 282; 283; THUMB78-LABEL: scalar_i32_lowestbit_eq: 284; THUMB78: @ %bb.0: 285; THUMB78-NEXT: lsrs r0, r1 286; THUMB78-NEXT: movs r1, #1 287; THUMB78-NEXT: bic.w r0, r1, r0 288; THUMB78-NEXT: bx lr 289 %t0 = shl i32 1, %y 290 %t1 = and i32 %t0, %x 291 %res = icmp eq i32 %t1, 0 292 ret i1 %res 293} 294 295define i1 @scalar_i32_bitsinmiddle_eq(i32 %x, i32 %y) nounwind { 296; ARM6-LABEL: scalar_i32_bitsinmiddle_eq: 297; ARM6: @ %bb.0: 298; ARM6-NEXT: mov r2, #65280 299; ARM6-NEXT: orr r2, r2, #16711680 300; ARM6-NEXT: and r0, r2, r0, lsr r1 301; ARM6-NEXT: clz r0, r0 302; ARM6-NEXT: lsr r0, r0, #5 303; ARM6-NEXT: bx lr 304; 305; ARM78-LABEL: scalar_i32_bitsinmiddle_eq: 306; ARM78: @ %bb.0: 307; ARM78-NEXT: movw r2, #65280 308; ARM78-NEXT: movt r2, #255 309; ARM78-NEXT: and r0, r2, r0, lsr r1 310; ARM78-NEXT: clz r0, r0 311; ARM78-NEXT: lsr r0, r0, #5 312; ARM78-NEXT: bx lr 313; 314; THUMB6-LABEL: scalar_i32_bitsinmiddle_eq: 315; THUMB6: @ %bb.0: 316; THUMB6-NEXT: lsrs r0, r1 317; THUMB6-NEXT: ldr r1, .LCPI8_0 318; THUMB6-NEXT: ands r0, r1 319; THUMB6-NEXT: rsbs r1, r0, #0 320; THUMB6-NEXT: adcs r0, r1 321; THUMB6-NEXT: bx lr 322; THUMB6-NEXT: .p2align 2 323; THUMB6-NEXT: @ %bb.1: 324; THUMB6-NEXT: .LCPI8_0: 325; THUMB6-NEXT: .long 16776960 @ 0xffff00 326; 327; THUMB78-LABEL: scalar_i32_bitsinmiddle_eq: 328; THUMB78: @ %bb.0: 329; THUMB78-NEXT: lsrs r0, r1 330; THUMB78-NEXT: movw r1, #65280 331; THUMB78-NEXT: movt r1, #255 332; THUMB78-NEXT: ands r0, r1 333; THUMB78-NEXT: clz r0, r0 334; THUMB78-NEXT: lsrs r0, r0, #5 335; THUMB78-NEXT: bx lr 336 %t0 = shl i32 16776960, %y 337 %t1 = and i32 %t0, %x 338 %res = icmp eq i32 %t1, 0 339 ret i1 %res 340} 341 342; i64 scalar 343 344define i1 @scalar_i64_signbit_eq(i64 %x, i64 %y) nounwind { 345; ARM6-LABEL: scalar_i64_signbit_eq: 346; ARM6: @ %bb.0: 347; ARM6-NEXT: lsr r0, r1, r2 348; ARM6-NEXT: subs r1, r2, #32 349; ARM6-NEXT: movpl r0, #0 350; ARM6-NEXT: mvn r0, r0 351; ARM6-NEXT: lsr r0, r0, #31 352; ARM6-NEXT: bx lr 353; 354; ARM78-LABEL: scalar_i64_signbit_eq: 355; ARM78: @ %bb.0: 356; ARM78-NEXT: lsr r0, r1, r2 357; ARM78-NEXT: subs r1, r2, #32 358; ARM78-NEXT: movwpl r0, #0 359; ARM78-NEXT: mvn r0, r0 360; ARM78-NEXT: lsr r0, r0, #31 361; ARM78-NEXT: bx lr 362; 363; THUMB6-LABEL: scalar_i64_signbit_eq: 364; THUMB6: @ %bb.0: 365; THUMB6-NEXT: push {r7, lr} 366; THUMB6-NEXT: bl __lshrdi3 367; THUMB6-NEXT: movs r0, #1 368; THUMB6-NEXT: lsls r2, r0, #31 369; THUMB6-NEXT: ands r2, r1 370; THUMB6-NEXT: rsbs r0, r2, #0 371; THUMB6-NEXT: adcs r0, r2 372; THUMB6-NEXT: pop {r7, pc} 373; 374; THUMB78-LABEL: scalar_i64_signbit_eq: 375; THUMB78: @ %bb.0: 376; THUMB78-NEXT: lsr.w r0, r1, r2 377; THUMB78-NEXT: subs.w r1, r2, #32 378; THUMB78-NEXT: it pl 379; THUMB78-NEXT: movpl r0, #0 380; THUMB78-NEXT: mvns r0, r0 381; THUMB78-NEXT: lsrs r0, r0, #31 382; THUMB78-NEXT: bx lr 383 %t0 = shl i64 9223372036854775808, %y 384 %t1 = and i64 %t0, %x 385 %res = icmp eq i64 %t1, 0 386 ret i1 %res 387} 388 389define i1 @scalar_i64_lowestbit_eq(i64 %x, i64 %y) nounwind { 390; ARM-LABEL: scalar_i64_lowestbit_eq: 391; ARM: @ %bb.0: 392; ARM-NEXT: rsb r3, r2, #32 393; ARM-NEXT: lsr r0, r0, r2 394; ARM-NEXT: subs r2, r2, #32 395; ARM-NEXT: orr r0, r0, r1, lsl r3 396; ARM-NEXT: lsrpl r0, r1, r2 397; ARM-NEXT: mov r1, #1 398; ARM-NEXT: bic r0, r1, r0 399; ARM-NEXT: bx lr 400; 401; THUMB6-LABEL: scalar_i64_lowestbit_eq: 402; THUMB6: @ %bb.0: 403; THUMB6-NEXT: push {r7, lr} 404; THUMB6-NEXT: bl __lshrdi3 405; THUMB6-NEXT: movs r1, #1 406; THUMB6-NEXT: ands r0, r1 407; THUMB6-NEXT: rsbs r1, r0, #0 408; THUMB6-NEXT: adcs r0, r1 409; THUMB6-NEXT: pop {r7, pc} 410; 411; THUMB78-LABEL: scalar_i64_lowestbit_eq: 412; THUMB78: @ %bb.0: 413; THUMB78-NEXT: rsb.w r3, r2, #32 414; THUMB78-NEXT: lsrs r0, r2 415; THUMB78-NEXT: subs r2, #32 416; THUMB78-NEXT: lsl.w r3, r1, r3 417; THUMB78-NEXT: orr.w r0, r0, r3 418; THUMB78-NEXT: it pl 419; THUMB78-NEXT: lsrpl.w r0, r1, r2 420; THUMB78-NEXT: movs r1, #1 421; THUMB78-NEXT: bic.w r0, r1, r0 422; THUMB78-NEXT: bx lr 423 %t0 = shl i64 1, %y 424 %t1 = and i64 %t0, %x 425 %res = icmp eq i64 %t1, 0 426 ret i1 %res 427} 428 429define i1 @scalar_i64_bitsinmiddle_eq(i64 %x, i64 %y) nounwind { 430; ARM6-LABEL: scalar_i64_bitsinmiddle_eq: 431; ARM6: @ %bb.0: 432; ARM6-NEXT: rsb r3, r2, #32 433; ARM6-NEXT: lsr r0, r0, r2 434; ARM6-NEXT: orr r0, r0, r1, lsl r3 435; ARM6-NEXT: subs r3, r2, #32 436; ARM6-NEXT: lsrpl r0, r1, r3 437; ARM6-NEXT: lsr r1, r1, r2 438; ARM6-NEXT: movpl r1, #0 439; ARM6-NEXT: pkhbt r0, r1, r0 440; ARM6-NEXT: clz r0, r0 441; ARM6-NEXT: lsr r0, r0, #5 442; ARM6-NEXT: bx lr 443; 444; ARM78-LABEL: scalar_i64_bitsinmiddle_eq: 445; ARM78: @ %bb.0: 446; ARM78-NEXT: rsb r3, r2, #32 447; ARM78-NEXT: lsr r0, r0, r2 448; ARM78-NEXT: orr r0, r0, r1, lsl r3 449; ARM78-NEXT: subs r3, r2, #32 450; ARM78-NEXT: lsrpl r0, r1, r3 451; ARM78-NEXT: lsr r1, r1, r2 452; ARM78-NEXT: movwpl r1, #0 453; ARM78-NEXT: pkhbt r0, r1, r0 454; ARM78-NEXT: clz r0, r0 455; ARM78-NEXT: lsr r0, r0, #5 456; ARM78-NEXT: bx lr 457; 458; THUMB6-LABEL: scalar_i64_bitsinmiddle_eq: 459; THUMB6: @ %bb.0: 460; THUMB6-NEXT: push {r7, lr} 461; THUMB6-NEXT: bl __lshrdi3 462; THUMB6-NEXT: ldr r2, .LCPI11_0 463; THUMB6-NEXT: ands r2, r0 464; THUMB6-NEXT: uxth r0, r1 465; THUMB6-NEXT: adds r1, r2, r0 466; THUMB6-NEXT: rsbs r0, r1, #0 467; THUMB6-NEXT: adcs r0, r1 468; THUMB6-NEXT: pop {r7, pc} 469; THUMB6-NEXT: .p2align 2 470; THUMB6-NEXT: @ %bb.1: 471; THUMB6-NEXT: .LCPI11_0: 472; THUMB6-NEXT: .long 4294901760 @ 0xffff0000 473; 474; THUMB78-LABEL: scalar_i64_bitsinmiddle_eq: 475; THUMB78: @ %bb.0: 476; THUMB78-NEXT: rsb.w r3, r2, #32 477; THUMB78-NEXT: lsrs r0, r2 478; THUMB78-NEXT: lsl.w r3, r1, r3 479; THUMB78-NEXT: orrs r0, r3 480; THUMB78-NEXT: subs.w r3, r2, #32 481; THUMB78-NEXT: it pl 482; THUMB78-NEXT: lsrpl.w r0, r1, r3 483; THUMB78-NEXT: lsr.w r1, r1, r2 484; THUMB78-NEXT: it pl 485; THUMB78-NEXT: movpl r1, #0 486; THUMB78-NEXT: pkhbt r0, r1, r0 487; THUMB78-NEXT: clz r0, r0 488; THUMB78-NEXT: lsrs r0, r0, #5 489; THUMB78-NEXT: bx lr 490 %t0 = shl i64 281474976645120, %y 491 %t1 = and i64 %t0, %x 492 %res = icmp eq i64 %t1, 0 493 ret i1 %res 494} 495 496;------------------------------------------------------------------------------; 497; A few trivial vector tests 498;------------------------------------------------------------------------------; 499 500define <4 x i1> @vec_4xi32_splat_eq(<4 x i32> %x, <4 x i32> %y) nounwind { 501; ARM6-LABEL: vec_4xi32_splat_eq: 502; ARM6: @ %bb.0: 503; ARM6-NEXT: push {r11, lr} 504; ARM6-NEXT: ldr r12, [sp, #8] 505; ARM6-NEXT: mov lr, #1 506; ARM6-NEXT: bic r0, lr, r0, lsr r12 507; ARM6-NEXT: ldr r12, [sp, #12] 508; ARM6-NEXT: bic r1, lr, r1, lsr r12 509; ARM6-NEXT: ldr r12, [sp, #16] 510; ARM6-NEXT: bic r2, lr, r2, lsr r12 511; ARM6-NEXT: ldr r12, [sp, #20] 512; ARM6-NEXT: bic r3, lr, r3, lsr r12 513; ARM6-NEXT: pop {r11, pc} 514; 515; ARM78-LABEL: vec_4xi32_splat_eq: 516; ARM78: @ %bb.0: 517; ARM78-NEXT: mov r12, sp 518; ARM78-NEXT: vld1.64 {d16, d17}, [r12] 519; ARM78-NEXT: vmov d19, r2, r3 520; ARM78-NEXT: vneg.s32 q8, q8 521; ARM78-NEXT: vmov d18, r0, r1 522; ARM78-NEXT: vmov.i32 q10, #0x1 523; ARM78-NEXT: vshl.u32 q8, q9, q8 524; ARM78-NEXT: vtst.32 q8, q8, q10 525; ARM78-NEXT: vmvn q8, q8 526; ARM78-NEXT: vmovn.i32 d16, q8 527; ARM78-NEXT: vmov r0, r1, d16 528; ARM78-NEXT: bx lr 529; 530; THUMB6-LABEL: vec_4xi32_splat_eq: 531; THUMB6: @ %bb.0: 532; THUMB6-NEXT: push {r4, r5, r7, lr} 533; THUMB6-NEXT: ldr r4, [sp, #16] 534; THUMB6-NEXT: lsrs r0, r4 535; THUMB6-NEXT: movs r4, #1 536; THUMB6-NEXT: ands r0, r4 537; THUMB6-NEXT: rsbs r5, r0, #0 538; THUMB6-NEXT: adcs r0, r5 539; THUMB6-NEXT: ldr r5, [sp, #20] 540; THUMB6-NEXT: lsrs r1, r5 541; THUMB6-NEXT: ands r1, r4 542; THUMB6-NEXT: rsbs r5, r1, #0 543; THUMB6-NEXT: adcs r1, r5 544; THUMB6-NEXT: ldr r5, [sp, #24] 545; THUMB6-NEXT: lsrs r2, r5 546; THUMB6-NEXT: ands r2, r4 547; THUMB6-NEXT: rsbs r5, r2, #0 548; THUMB6-NEXT: adcs r2, r5 549; THUMB6-NEXT: ldr r5, [sp, #28] 550; THUMB6-NEXT: lsrs r3, r5 551; THUMB6-NEXT: ands r3, r4 552; THUMB6-NEXT: rsbs r4, r3, #0 553; THUMB6-NEXT: adcs r3, r4 554; THUMB6-NEXT: pop {r4, r5, r7, pc} 555; 556; THUMB78-LABEL: vec_4xi32_splat_eq: 557; THUMB78: @ %bb.0: 558; THUMB78-NEXT: mov r12, sp 559; THUMB78-NEXT: vld1.64 {d16, d17}, [r12] 560; THUMB78-NEXT: vmov d19, r2, r3 561; THUMB78-NEXT: vneg.s32 q8, q8 562; THUMB78-NEXT: vmov d18, r0, r1 563; THUMB78-NEXT: vmov.i32 q10, #0x1 564; THUMB78-NEXT: vshl.u32 q8, q9, q8 565; THUMB78-NEXT: vtst.32 q8, q8, q10 566; THUMB78-NEXT: vmvn q8, q8 567; THUMB78-NEXT: vmovn.i32 d16, q8 568; THUMB78-NEXT: vmov r0, r1, d16 569; THUMB78-NEXT: bx lr 570 %t0 = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y 571 %t1 = and <4 x i32> %t0, %x 572 %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0> 573 ret <4 x i1> %res 574} 575 576define <4 x i1> @vec_4xi32_nonsplat_eq(<4 x i32> %x, <4 x i32> %y) nounwind { 577; ARM6-LABEL: vec_4xi32_nonsplat_eq: 578; ARM6: @ %bb.0: 579; ARM6-NEXT: ldr r12, [sp, #4] 580; ARM6-NEXT: mov r0, #1 581; ARM6-NEXT: bic r1, r0, r1, lsr r12 582; ARM6-NEXT: ldr r12, [sp, #8] 583; ARM6-NEXT: mov r0, #65280 584; ARM6-NEXT: orr r0, r0, #16711680 585; ARM6-NEXT: and r0, r0, r2, lsr r12 586; ARM6-NEXT: clz r0, r0 587; ARM6-NEXT: lsr r2, r0, #5 588; ARM6-NEXT: ldr r0, [sp, #12] 589; ARM6-NEXT: mvn r0, r3, lsr r0 590; ARM6-NEXT: lsr r3, r0, #31 591; ARM6-NEXT: mov r0, #1 592; ARM6-NEXT: bx lr 593; 594; ARM78-LABEL: vec_4xi32_nonsplat_eq: 595; ARM78: @ %bb.0: 596; ARM78-NEXT: mov r12, sp 597; ARM78-NEXT: vld1.64 {d16, d17}, [r12] 598; ARM78-NEXT: adr r12, .LCPI13_0 599; ARM78-NEXT: vld1.64 {d18, d19}, [r12:128] 600; ARM78-NEXT: vshl.u32 q8, q9, q8 601; ARM78-NEXT: vmov d19, r2, r3 602; ARM78-NEXT: vmov d18, r0, r1 603; ARM78-NEXT: vtst.32 q8, q8, q9 604; ARM78-NEXT: vmvn q8, q8 605; ARM78-NEXT: vmovn.i32 d16, q8 606; ARM78-NEXT: vmov r0, r1, d16 607; ARM78-NEXT: bx lr 608; ARM78-NEXT: .p2align 4 609; ARM78-NEXT: @ %bb.1: 610; ARM78-NEXT: .LCPI13_0: 611; ARM78-NEXT: .long 0 @ 0x0 612; ARM78-NEXT: .long 1 @ 0x1 613; ARM78-NEXT: .long 16776960 @ 0xffff00 614; ARM78-NEXT: .long 2147483648 @ 0x80000000 615; 616; THUMB6-LABEL: vec_4xi32_nonsplat_eq: 617; THUMB6: @ %bb.0: 618; THUMB6-NEXT: push {r4, lr} 619; THUMB6-NEXT: ldr r0, [sp, #12] 620; THUMB6-NEXT: lsrs r1, r0 621; THUMB6-NEXT: movs r0, #1 622; THUMB6-NEXT: ands r1, r0 623; THUMB6-NEXT: rsbs r4, r1, #0 624; THUMB6-NEXT: adcs r1, r4 625; THUMB6-NEXT: ldr r4, [sp, #16] 626; THUMB6-NEXT: lsrs r2, r4 627; THUMB6-NEXT: ldr r4, .LCPI13_0 628; THUMB6-NEXT: ands r2, r4 629; THUMB6-NEXT: rsbs r4, r2, #0 630; THUMB6-NEXT: adcs r2, r4 631; THUMB6-NEXT: ldr r4, [sp, #20] 632; THUMB6-NEXT: lsrs r3, r4 633; THUMB6-NEXT: lsls r4, r0, #31 634; THUMB6-NEXT: ands r3, r4 635; THUMB6-NEXT: rsbs r4, r3, #0 636; THUMB6-NEXT: adcs r3, r4 637; THUMB6-NEXT: pop {r4, pc} 638; THUMB6-NEXT: .p2align 2 639; THUMB6-NEXT: @ %bb.1: 640; THUMB6-NEXT: .LCPI13_0: 641; THUMB6-NEXT: .long 16776960 @ 0xffff00 642; 643; THUMB78-LABEL: vec_4xi32_nonsplat_eq: 644; THUMB78: @ %bb.0: 645; THUMB78-NEXT: mov r12, sp 646; THUMB78-NEXT: vld1.64 {d16, d17}, [r12] 647; THUMB78-NEXT: adr.w r12, .LCPI13_0 648; THUMB78-NEXT: vld1.64 {d18, d19}, [r12:128] 649; THUMB78-NEXT: vshl.u32 q8, q9, q8 650; THUMB78-NEXT: vmov d19, r2, r3 651; THUMB78-NEXT: vmov d18, r0, r1 652; THUMB78-NEXT: vtst.32 q8, q8, q9 653; THUMB78-NEXT: vmvn q8, q8 654; THUMB78-NEXT: vmovn.i32 d16, q8 655; THUMB78-NEXT: vmov r0, r1, d16 656; THUMB78-NEXT: bx lr 657; THUMB78-NEXT: .p2align 4 658; THUMB78-NEXT: @ %bb.1: 659; THUMB78-NEXT: .LCPI13_0: 660; THUMB78-NEXT: .long 0 @ 0x0 661; THUMB78-NEXT: .long 1 @ 0x1 662; THUMB78-NEXT: .long 16776960 @ 0xffff00 663; THUMB78-NEXT: .long 2147483648 @ 0x80000000 664 %t0 = shl <4 x i32> <i32 0, i32 1, i32 16776960, i32 2147483648>, %y 665 %t1 = and <4 x i32> %t0, %x 666 %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0> 667 ret <4 x i1> %res 668} 669 670define <4 x i1> @vec_4xi32_nonsplat_undef0_eq(<4 x i32> %x, <4 x i32> %y) nounwind { 671; ARM6-LABEL: vec_4xi32_nonsplat_undef0_eq: 672; ARM6: @ %bb.0: 673; ARM6-NEXT: push {r11, lr} 674; ARM6-NEXT: ldr r2, [sp, #12] 675; ARM6-NEXT: mov lr, #1 676; ARM6-NEXT: ldr r12, [sp, #8] 677; ARM6-NEXT: bic r1, lr, r1, lsr r2 678; ARM6-NEXT: ldr r2, [sp, #20] 679; ARM6-NEXT: bic r0, lr, r0, lsr r12 680; ARM6-NEXT: bic r3, lr, r3, lsr r2 681; ARM6-NEXT: mov r2, #1 682; ARM6-NEXT: pop {r11, pc} 683; 684; ARM78-LABEL: vec_4xi32_nonsplat_undef0_eq: 685; ARM78: @ %bb.0: 686; ARM78-NEXT: mov r12, sp 687; ARM78-NEXT: vld1.64 {d16, d17}, [r12] 688; ARM78-NEXT: vmov d19, r2, r3 689; ARM78-NEXT: vneg.s32 q8, q8 690; ARM78-NEXT: vmov d18, r0, r1 691; ARM78-NEXT: vmov.i32 q10, #0x1 692; ARM78-NEXT: vshl.u32 q8, q9, q8 693; ARM78-NEXT: vtst.32 q8, q8, q10 694; ARM78-NEXT: vmvn q8, q8 695; ARM78-NEXT: vmovn.i32 d16, q8 696; ARM78-NEXT: vmov r0, r1, d16 697; ARM78-NEXT: bx lr 698; 699; THUMB6-LABEL: vec_4xi32_nonsplat_undef0_eq: 700; THUMB6: @ %bb.0: 701; THUMB6-NEXT: push {r4, lr} 702; THUMB6-NEXT: ldr r2, [sp, #8] 703; THUMB6-NEXT: lsrs r0, r2 704; THUMB6-NEXT: movs r2, #1 705; THUMB6-NEXT: ands r0, r2 706; THUMB6-NEXT: rsbs r4, r0, #0 707; THUMB6-NEXT: adcs r0, r4 708; THUMB6-NEXT: ldr r4, [sp, #12] 709; THUMB6-NEXT: lsrs r1, r4 710; THUMB6-NEXT: ands r1, r2 711; THUMB6-NEXT: rsbs r4, r1, #0 712; THUMB6-NEXT: adcs r1, r4 713; THUMB6-NEXT: ldr r4, [sp, #20] 714; THUMB6-NEXT: lsrs r3, r4 715; THUMB6-NEXT: ands r3, r2 716; THUMB6-NEXT: rsbs r4, r3, #0 717; THUMB6-NEXT: adcs r3, r4 718; THUMB6-NEXT: pop {r4, pc} 719; 720; THUMB78-LABEL: vec_4xi32_nonsplat_undef0_eq: 721; THUMB78: @ %bb.0: 722; THUMB78-NEXT: mov r12, sp 723; THUMB78-NEXT: vld1.64 {d16, d17}, [r12] 724; THUMB78-NEXT: vmov d19, r2, r3 725; THUMB78-NEXT: vneg.s32 q8, q8 726; THUMB78-NEXT: vmov d18, r0, r1 727; THUMB78-NEXT: vmov.i32 q10, #0x1 728; THUMB78-NEXT: vshl.u32 q8, q9, q8 729; THUMB78-NEXT: vtst.32 q8, q8, q10 730; THUMB78-NEXT: vmvn q8, q8 731; THUMB78-NEXT: vmovn.i32 d16, q8 732; THUMB78-NEXT: vmov r0, r1, d16 733; THUMB78-NEXT: bx lr 734 %t0 = shl <4 x i32> <i32 1, i32 1, i32 undef, i32 1>, %y 735 %t1 = and <4 x i32> %t0, %x 736 %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 0, i32 0> 737 ret <4 x i1> %res 738} 739define <4 x i1> @vec_4xi32_nonsplat_undef1_eq(<4 x i32> %x, <4 x i32> %y) nounwind { 740; ARM6-LABEL: vec_4xi32_nonsplat_undef1_eq: 741; ARM6: @ %bb.0: 742; ARM6-NEXT: push {r11, lr} 743; ARM6-NEXT: ldr r2, [sp, #12] 744; ARM6-NEXT: mov lr, #1 745; ARM6-NEXT: ldr r12, [sp, #8] 746; ARM6-NEXT: bic r1, lr, r1, lsr r2 747; ARM6-NEXT: ldr r2, [sp, #20] 748; ARM6-NEXT: bic r0, lr, r0, lsr r12 749; ARM6-NEXT: bic r3, lr, r3, lsr r2 750; ARM6-NEXT: pop {r11, pc} 751; 752; ARM78-LABEL: vec_4xi32_nonsplat_undef1_eq: 753; ARM78: @ %bb.0: 754; ARM78-NEXT: vmov.i32 q8, #0x1 755; ARM78-NEXT: mov r12, sp 756; ARM78-NEXT: vld1.64 {d18, d19}, [r12] 757; ARM78-NEXT: vshl.u32 q8, q8, q9 758; ARM78-NEXT: vmov d19, r2, r3 759; ARM78-NEXT: vmov d18, r0, r1 760; ARM78-NEXT: vtst.32 q8, q8, q9 761; ARM78-NEXT: vmvn q8, q8 762; ARM78-NEXT: vmovn.i32 d16, q8 763; ARM78-NEXT: vmov r0, r1, d16 764; ARM78-NEXT: bx lr 765; 766; THUMB6-LABEL: vec_4xi32_nonsplat_undef1_eq: 767; THUMB6: @ %bb.0: 768; THUMB6-NEXT: push {r4, lr} 769; THUMB6-NEXT: ldr r2, [sp, #8] 770; THUMB6-NEXT: lsrs r0, r2 771; THUMB6-NEXT: movs r2, #1 772; THUMB6-NEXT: ands r0, r2 773; THUMB6-NEXT: rsbs r4, r0, #0 774; THUMB6-NEXT: adcs r0, r4 775; THUMB6-NEXT: ldr r4, [sp, #12] 776; THUMB6-NEXT: lsrs r1, r4 777; THUMB6-NEXT: ands r1, r2 778; THUMB6-NEXT: rsbs r4, r1, #0 779; THUMB6-NEXT: adcs r1, r4 780; THUMB6-NEXT: ldr r4, [sp, #20] 781; THUMB6-NEXT: lsrs r3, r4 782; THUMB6-NEXT: ands r3, r2 783; THUMB6-NEXT: rsbs r2, r3, #0 784; THUMB6-NEXT: adcs r3, r2 785; THUMB6-NEXT: pop {r4, pc} 786; 787; THUMB78-LABEL: vec_4xi32_nonsplat_undef1_eq: 788; THUMB78: @ %bb.0: 789; THUMB78-NEXT: vmov.i32 q8, #0x1 790; THUMB78-NEXT: mov r12, sp 791; THUMB78-NEXT: vld1.64 {d18, d19}, [r12] 792; THUMB78-NEXT: vshl.u32 q8, q8, q9 793; THUMB78-NEXT: vmov d19, r2, r3 794; THUMB78-NEXT: vmov d18, r0, r1 795; THUMB78-NEXT: vtst.32 q8, q8, q9 796; THUMB78-NEXT: vmvn q8, q8 797; THUMB78-NEXT: vmovn.i32 d16, q8 798; THUMB78-NEXT: vmov r0, r1, d16 799; THUMB78-NEXT: bx lr 800 %t0 = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %y 801 %t1 = and <4 x i32> %t0, %x 802 %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 undef, i32 0> 803 ret <4 x i1> %res 804} 805define <4 x i1> @vec_4xi32_nonsplat_undef2_eq(<4 x i32> %x, <4 x i32> %y) nounwind { 806; ARM6-LABEL: vec_4xi32_nonsplat_undef2_eq: 807; ARM6: @ %bb.0: 808; ARM6-NEXT: push {r11, lr} 809; ARM6-NEXT: ldr r2, [sp, #12] 810; ARM6-NEXT: mov lr, #1 811; ARM6-NEXT: ldr r12, [sp, #8] 812; ARM6-NEXT: bic r1, lr, r1, lsr r2 813; ARM6-NEXT: ldr r2, [sp, #20] 814; ARM6-NEXT: bic r0, lr, r0, lsr r12 815; ARM6-NEXT: bic r3, lr, r3, lsr r2 816; ARM6-NEXT: pop {r11, pc} 817; 818; ARM78-LABEL: vec_4xi32_nonsplat_undef2_eq: 819; ARM78: @ %bb.0: 820; ARM78-NEXT: vmov.i32 q8, #0x1 821; ARM78-NEXT: mov r12, sp 822; ARM78-NEXT: vld1.64 {d18, d19}, [r12] 823; ARM78-NEXT: vshl.u32 q8, q8, q9 824; ARM78-NEXT: vmov d19, r2, r3 825; ARM78-NEXT: vmov d18, r0, r1 826; ARM78-NEXT: vtst.32 q8, q8, q9 827; ARM78-NEXT: vmvn q8, q8 828; ARM78-NEXT: vmovn.i32 d16, q8 829; ARM78-NEXT: vmov r0, r1, d16 830; ARM78-NEXT: bx lr 831; 832; THUMB6-LABEL: vec_4xi32_nonsplat_undef2_eq: 833; THUMB6: @ %bb.0: 834; THUMB6-NEXT: push {r4, lr} 835; THUMB6-NEXT: ldr r2, [sp, #8] 836; THUMB6-NEXT: lsrs r0, r2 837; THUMB6-NEXT: movs r2, #1 838; THUMB6-NEXT: ands r0, r2 839; THUMB6-NEXT: rsbs r4, r0, #0 840; THUMB6-NEXT: adcs r0, r4 841; THUMB6-NEXT: ldr r4, [sp, #12] 842; THUMB6-NEXT: lsrs r1, r4 843; THUMB6-NEXT: ands r1, r2 844; THUMB6-NEXT: rsbs r4, r1, #0 845; THUMB6-NEXT: adcs r1, r4 846; THUMB6-NEXT: ldr r4, [sp, #20] 847; THUMB6-NEXT: lsrs r3, r4 848; THUMB6-NEXT: ands r3, r2 849; THUMB6-NEXT: rsbs r2, r3, #0 850; THUMB6-NEXT: adcs r3, r2 851; THUMB6-NEXT: pop {r4, pc} 852; 853; THUMB78-LABEL: vec_4xi32_nonsplat_undef2_eq: 854; THUMB78: @ %bb.0: 855; THUMB78-NEXT: vmov.i32 q8, #0x1 856; THUMB78-NEXT: mov r12, sp 857; THUMB78-NEXT: vld1.64 {d18, d19}, [r12] 858; THUMB78-NEXT: vshl.u32 q8, q8, q9 859; THUMB78-NEXT: vmov d19, r2, r3 860; THUMB78-NEXT: vmov d18, r0, r1 861; THUMB78-NEXT: vtst.32 q8, q8, q9 862; THUMB78-NEXT: vmvn q8, q8 863; THUMB78-NEXT: vmovn.i32 d16, q8 864; THUMB78-NEXT: vmov r0, r1, d16 865; THUMB78-NEXT: bx lr 866 %t0 = shl <4 x i32> <i32 1, i32 1, i32 undef, i32 1>, %y 867 %t1 = and <4 x i32> %t0, %x 868 %res = icmp eq <4 x i32> %t1, <i32 0, i32 0, i32 undef, i32 0> 869 ret <4 x i1> %res 870} 871 872;------------------------------------------------------------------------------; 873; A special tests 874;------------------------------------------------------------------------------; 875 876define i1 @scalar_i8_signbit_ne(i8 %x, i8 %y) nounwind { 877; ARM-LABEL: scalar_i8_signbit_ne: 878; ARM: @ %bb.0: 879; ARM-NEXT: uxtb r1, r1 880; ARM-NEXT: uxtb r0, r0 881; ARM-NEXT: lsr r0, r0, r1 882; ARM-NEXT: lsr r0, r0, #7 883; ARM-NEXT: bx lr 884; 885; THUMB-LABEL: scalar_i8_signbit_ne: 886; THUMB: @ %bb.0: 887; THUMB-NEXT: uxtb r1, r1 888; THUMB-NEXT: uxtb r0, r0 889; THUMB-NEXT: lsrs r0, r1 890; THUMB-NEXT: lsrs r0, r0, #7 891; THUMB-NEXT: bx lr 892 %t0 = shl i8 128, %y 893 %t1 = and i8 %t0, %x 894 %res = icmp ne i8 %t1, 0 ; we are perfectly happy with 'ne' predicate 895 ret i1 %res 896} 897 898;------------------------------------------------------------------------------; 899; What if X is a constant too? 900;------------------------------------------------------------------------------; 901 902define i1 @scalar_i32_x_is_const_eq(i32 %y) nounwind { 903; ARM6-LABEL: scalar_i32_x_is_const_eq: 904; ARM6: @ %bb.0: 905; ARM6-NEXT: ldr r1, .LCPI18_0 906; ARM6-NEXT: mov r2, #1 907; ARM6-NEXT: bic r0, r2, r1, lsl r0 908; ARM6-NEXT: bx lr 909; ARM6-NEXT: .p2align 2 910; ARM6-NEXT: @ %bb.1: 911; ARM6-NEXT: .LCPI18_0: 912; ARM6-NEXT: .long 2857740885 @ 0xaa55aa55 913; 914; ARM78-LABEL: scalar_i32_x_is_const_eq: 915; ARM78: @ %bb.0: 916; ARM78-NEXT: movw r1, #43605 917; ARM78-NEXT: mov r2, #1 918; ARM78-NEXT: movt r1, #43605 919; ARM78-NEXT: bic r0, r2, r1, lsl r0 920; ARM78-NEXT: bx lr 921; 922; THUMB6-LABEL: scalar_i32_x_is_const_eq: 923; THUMB6: @ %bb.0: 924; THUMB6-NEXT: ldr r1, .LCPI18_0 925; THUMB6-NEXT: lsls r1, r0 926; THUMB6-NEXT: movs r2, #1 927; THUMB6-NEXT: ands r2, r1 928; THUMB6-NEXT: rsbs r0, r2, #0 929; THUMB6-NEXT: adcs r0, r2 930; THUMB6-NEXT: bx lr 931; THUMB6-NEXT: .p2align 2 932; THUMB6-NEXT: @ %bb.1: 933; THUMB6-NEXT: .LCPI18_0: 934; THUMB6-NEXT: .long 2857740885 @ 0xaa55aa55 935; 936; THUMB78-LABEL: scalar_i32_x_is_const_eq: 937; THUMB78: @ %bb.0: 938; THUMB78-NEXT: movw r1, #43605 939; THUMB78-NEXT: movt r1, #43605 940; THUMB78-NEXT: lsl.w r0, r1, r0 941; THUMB78-NEXT: movs r1, #1 942; THUMB78-NEXT: bic.w r0, r1, r0 943; THUMB78-NEXT: bx lr 944 %t0 = shl i32 2857740885, %y 945 %t1 = and i32 %t0, 1 946 %res = icmp eq i32 %t1, 0 947 ret i1 %res 948} 949define i1 @scalar_i32_x_is_const2_eq(i32 %y) nounwind { 950; ARM6-LABEL: scalar_i32_x_is_const2_eq: 951; ARM6: @ %bb.0: 952; ARM6-NEXT: ldr r2, .LCPI19_0 953; ARM6-NEXT: mov r1, #1 954; ARM6-NEXT: and r0, r2, r1, lsl r0 955; ARM6-NEXT: clz r0, r0 956; ARM6-NEXT: lsr r0, r0, #5 957; ARM6-NEXT: bx lr 958; ARM6-NEXT: .p2align 2 959; ARM6-NEXT: @ %bb.1: 960; ARM6-NEXT: .LCPI19_0: 961; ARM6-NEXT: .long 2857740885 @ 0xaa55aa55 962; 963; ARM78-LABEL: scalar_i32_x_is_const2_eq: 964; ARM78: @ %bb.0: 965; ARM78-NEXT: movw r1, #43605 966; ARM78-NEXT: mov r2, #1 967; ARM78-NEXT: movt r1, #43605 968; ARM78-NEXT: and r0, r1, r2, lsl r0 969; ARM78-NEXT: clz r0, r0 970; ARM78-NEXT: lsr r0, r0, #5 971; ARM78-NEXT: bx lr 972; 973; THUMB6-LABEL: scalar_i32_x_is_const2_eq: 974; THUMB6: @ %bb.0: 975; THUMB6-NEXT: movs r1, #1 976; THUMB6-NEXT: lsls r1, r0 977; THUMB6-NEXT: ldr r2, .LCPI19_0 978; THUMB6-NEXT: ands r2, r1 979; THUMB6-NEXT: rsbs r0, r2, #0 980; THUMB6-NEXT: adcs r0, r2 981; THUMB6-NEXT: bx lr 982; THUMB6-NEXT: .p2align 2 983; THUMB6-NEXT: @ %bb.1: 984; THUMB6-NEXT: .LCPI19_0: 985; THUMB6-NEXT: .long 2857740885 @ 0xaa55aa55 986; 987; THUMB78-LABEL: scalar_i32_x_is_const2_eq: 988; THUMB78: @ %bb.0: 989; THUMB78-NEXT: movs r1, #1 990; THUMB78-NEXT: lsl.w r0, r1, r0 991; THUMB78-NEXT: movw r1, #43605 992; THUMB78-NEXT: movt r1, #43605 993; THUMB78-NEXT: ands r0, r1 994; THUMB78-NEXT: clz r0, r0 995; THUMB78-NEXT: lsrs r0, r0, #5 996; THUMB78-NEXT: bx lr 997 %t0 = shl i32 1, %y 998 %t1 = and i32 %t0, 2857740885 999 %res = icmp eq i32 %t1, 0 1000 ret i1 %res 1001} 1002 1003;------------------------------------------------------------------------------; 1004; A few negative tests 1005;------------------------------------------------------------------------------; 1006 1007define i1 @negative_scalar_i8_bitsinmiddle_slt(i8 %x, i8 %y) nounwind { 1008; ARM6-LABEL: negative_scalar_i8_bitsinmiddle_slt: 1009; ARM6: @ %bb.0: 1010; ARM6-NEXT: uxtb r1, r1 1011; ARM6-NEXT: mov r2, #24 1012; ARM6-NEXT: and r0, r0, r2, lsl r1 1013; ARM6-NEXT: sxtb r1, r0 1014; ARM6-NEXT: mov r0, #0 1015; ARM6-NEXT: cmp r1, #0 1016; ARM6-NEXT: movmi r0, #1 1017; ARM6-NEXT: bx lr 1018; 1019; ARM78-LABEL: negative_scalar_i8_bitsinmiddle_slt: 1020; ARM78: @ %bb.0: 1021; ARM78-NEXT: uxtb r1, r1 1022; ARM78-NEXT: mov r2, #24 1023; ARM78-NEXT: and r0, r0, r2, lsl r1 1024; ARM78-NEXT: sxtb r1, r0 1025; ARM78-NEXT: mov r0, #0 1026; ARM78-NEXT: cmp r1, #0 1027; ARM78-NEXT: movwmi r0, #1 1028; ARM78-NEXT: bx lr 1029; 1030; THUMB6-LABEL: negative_scalar_i8_bitsinmiddle_slt: 1031; THUMB6: @ %bb.0: 1032; THUMB6-NEXT: uxtb r1, r1 1033; THUMB6-NEXT: movs r2, #24 1034; THUMB6-NEXT: lsls r2, r1 1035; THUMB6-NEXT: ands r2, r0 1036; THUMB6-NEXT: sxtb r0, r2 1037; THUMB6-NEXT: cmp r0, #0 1038; THUMB6-NEXT: bmi .LBB20_2 1039; THUMB6-NEXT: @ %bb.1: 1040; THUMB6-NEXT: movs r0, #0 1041; THUMB6-NEXT: bx lr 1042; THUMB6-NEXT: .LBB20_2: 1043; THUMB6-NEXT: movs r0, #1 1044; THUMB6-NEXT: bx lr 1045; 1046; THUMB78-LABEL: negative_scalar_i8_bitsinmiddle_slt: 1047; THUMB78: @ %bb.0: 1048; THUMB78-NEXT: uxtb r1, r1 1049; THUMB78-NEXT: movs r2, #24 1050; THUMB78-NEXT: lsl.w r1, r2, r1 1051; THUMB78-NEXT: ands r0, r1 1052; THUMB78-NEXT: sxtb r1, r0 1053; THUMB78-NEXT: movs r0, #0 1054; THUMB78-NEXT: cmp r1, #0 1055; THUMB78-NEXT: it mi 1056; THUMB78-NEXT: movmi r0, #1 1057; THUMB78-NEXT: bx lr 1058 %t0 = shl i8 24, %y 1059 %t1 = and i8 %t0, %x 1060 %res = icmp slt i8 %t1, 0 1061 ret i1 %res 1062} 1063 1064define i1 @scalar_i8_signbit_eq_with_nonzero(i8 %x, i8 %y) nounwind { 1065; ARM-LABEL: scalar_i8_signbit_eq_with_nonzero: 1066; ARM: @ %bb.0: 1067; ARM-NEXT: mov r0, #0 1068; ARM-NEXT: bx lr 1069; 1070; THUMB6-LABEL: scalar_i8_signbit_eq_with_nonzero: 1071; THUMB6: @ %bb.0: 1072; THUMB6-NEXT: uxtb r1, r1 1073; THUMB6-NEXT: movs r2, #127 1074; THUMB6-NEXT: mvns r2, r2 1075; THUMB6-NEXT: lsls r2, r1 1076; THUMB6-NEXT: ands r2, r0 1077; THUMB6-NEXT: uxtb r0, r2 1078; THUMB6-NEXT: subs r1, r0, #1 1079; THUMB6-NEXT: rsbs r0, r1, #0 1080; THUMB6-NEXT: adcs r0, r1 1081; THUMB6-NEXT: bx lr 1082; 1083; THUMB78-LABEL: scalar_i8_signbit_eq_with_nonzero: 1084; THUMB78: @ %bb.0: 1085; THUMB78-NEXT: movs r0, #0 1086; THUMB78-NEXT: bx lr 1087 %t0 = shl i8 128, %y 1088 %t1 = and i8 %t0, %x 1089 %res = icmp eq i8 %t1, 1 ; should be comparing with 0 1090 ret i1 %res 1091} 1092