1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \ 3; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s 4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -verify-machineinstrs \ 5; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | FileCheck %s \ 6; RUN: -check-prefix=CHECK-P8 7 8@a_qp = common global fp128 0xL00000000000000000000000000000000, align 16 9@b_qp = common global fp128 0xL00000000000000000000000000000000, align 16 10 11; Function Attrs: noinline nounwind optnone 12define signext i32 @greater_qp() { 13; CHECK-LABEL: greater_qp: 14; CHECK: # %bb.0: # %entry 15; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 16; CHECK-NEXT: li r4, 1 17; CHECK-NEXT: addi r3, r3, a_qp@toc@l 18; CHECK-NEXT: lxvx v2, 0, r3 19; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 20; CHECK-NEXT: addi r3, r3, b_qp@toc@l 21; CHECK-NEXT: lxvx v3, 0, r3 22; CHECK-NEXT: li r3, 0 23; CHECK-NEXT: xscmpuqp cr0, v2, v3 24; CHECK-NEXT: iselgt r3, r4, r3 25; CHECK-NEXT: blr 26; 27; CHECK-P8-LABEL: greater_qp: 28; CHECK-P8: # %bb.0: # %entry 29; CHECK-P8-NEXT: mflr r0 30; CHECK-P8-NEXT: std r0, 16(r1) 31; CHECK-P8-NEXT: stdu r1, -32(r1) 32; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 33; CHECK-P8-NEXT: .cfi_offset lr, 16 34; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 35; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 36; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 37; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 38; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 39; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 40; CHECK-P8-NEXT: ld r4, 8(r6) 41; CHECK-P8-NEXT: ld r6, 8(r7) 42; CHECK-P8-NEXT: bl __gtkf2 43; CHECK-P8-NEXT: nop 44; CHECK-P8-NEXT: extsw r3, r3 45; CHECK-P8-NEXT: neg r3, r3 46; CHECK-P8-NEXT: rldicl r3, r3, 1, 63 47; CHECK-P8-NEXT: addi r1, r1, 32 48; CHECK-P8-NEXT: ld r0, 16(r1) 49; CHECK-P8-NEXT: mtlr r0 50; CHECK-P8-NEXT: blr 51entry: 52 %0 = load fp128, fp128* @a_qp, align 16 53 %1 = load fp128, fp128* @b_qp, align 16 54 %cmp = fcmp ogt fp128 %0, %1 55 %conv = zext i1 %cmp to i32 56 ret i32 %conv 57} 58 59; Function Attrs: noinline nounwind optnone 60define signext i32 @less_qp() { 61; CHECK-LABEL: less_qp: 62; CHECK: # %bb.0: # %entry 63; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 64; CHECK-NEXT: li r4, 1 65; CHECK-NEXT: addi r3, r3, a_qp@toc@l 66; CHECK-NEXT: lxvx v2, 0, r3 67; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 68; CHECK-NEXT: addi r3, r3, b_qp@toc@l 69; CHECK-NEXT: lxvx v3, 0, r3 70; CHECK-NEXT: li r3, 0 71; CHECK-NEXT: xscmpuqp cr0, v2, v3 72; CHECK-NEXT: isellt r3, r4, r3 73; CHECK-NEXT: blr 74; 75; CHECK-P8-LABEL: less_qp: 76; CHECK-P8: # %bb.0: # %entry 77; CHECK-P8-NEXT: mflr r0 78; CHECK-P8-NEXT: std r0, 16(r1) 79; CHECK-P8-NEXT: stdu r1, -32(r1) 80; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 81; CHECK-P8-NEXT: .cfi_offset lr, 16 82; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 83; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 84; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 85; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 86; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 87; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 88; CHECK-P8-NEXT: ld r4, 8(r6) 89; CHECK-P8-NEXT: ld r6, 8(r7) 90; CHECK-P8-NEXT: bl __ltkf2 91; CHECK-P8-NEXT: nop 92; CHECK-P8-NEXT: rlwinm r3, r3, 1, 31, 31 93; CHECK-P8-NEXT: addi r1, r1, 32 94; CHECK-P8-NEXT: ld r0, 16(r1) 95; CHECK-P8-NEXT: mtlr r0 96; CHECK-P8-NEXT: blr 97entry: 98 %0 = load fp128, fp128* @a_qp, align 16 99 %1 = load fp128, fp128* @b_qp, align 16 100 %cmp = fcmp olt fp128 %0, %1 101 %conv = zext i1 %cmp to i32 102 ret i32 %conv 103} 104 105; Function Attrs: noinline nounwind optnone 106define signext i32 @greater_eq_qp() { 107; CHECK-LABEL: greater_eq_qp: 108; CHECK: # %bb.0: # %entry 109; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 110; CHECK-NEXT: addi r3, r3, a_qp@toc@l 111; CHECK-NEXT: lxvx v2, 0, r3 112; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 113; CHECK-NEXT: addi r3, r3, b_qp@toc@l 114; CHECK-NEXT: lxvx v3, 0, r3 115; CHECK-NEXT: li r3, 1 116; CHECK-NEXT: xscmpuqp cr0, v2, v3 117; CHECK-NEXT: cror 4*cr5+lt, un, lt 118; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt 119; CHECK-NEXT: blr 120; 121; CHECK-P8-LABEL: greater_eq_qp: 122; CHECK-P8: # %bb.0: # %entry 123; CHECK-P8-NEXT: mflr r0 124; CHECK-P8-NEXT: std r0, 16(r1) 125; CHECK-P8-NEXT: stdu r1, -32(r1) 126; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 127; CHECK-P8-NEXT: .cfi_offset lr, 16 128; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 129; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 130; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 131; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 132; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 133; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 134; CHECK-P8-NEXT: ld r4, 8(r6) 135; CHECK-P8-NEXT: ld r6, 8(r7) 136; CHECK-P8-NEXT: bl __gekf2 137; CHECK-P8-NEXT: nop 138; CHECK-P8-NEXT: rlwinm r3, r3, 1, 31, 31 139; CHECK-P8-NEXT: xori r3, r3, 1 140; CHECK-P8-NEXT: addi r1, r1, 32 141; CHECK-P8-NEXT: ld r0, 16(r1) 142; CHECK-P8-NEXT: mtlr r0 143; CHECK-P8-NEXT: blr 144entry: 145 %0 = load fp128, fp128* @a_qp, align 16 146 %1 = load fp128, fp128* @b_qp, align 16 147 %cmp = fcmp oge fp128 %0, %1 148 %conv = zext i1 %cmp to i32 149 ret i32 %conv 150} 151 152; Function Attrs: noinline nounwind optnone 153define signext i32 @less_eq_qp() { 154; CHECK-LABEL: less_eq_qp: 155; CHECK: # %bb.0: # %entry 156; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 157; CHECK-NEXT: addi r3, r3, a_qp@toc@l 158; CHECK-NEXT: lxvx v2, 0, r3 159; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 160; CHECK-NEXT: addi r3, r3, b_qp@toc@l 161; CHECK-NEXT: lxvx v3, 0, r3 162; CHECK-NEXT: li r3, 1 163; CHECK-NEXT: xscmpuqp cr0, v2, v3 164; CHECK-NEXT: cror 4*cr5+lt, un, gt 165; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt 166; CHECK-NEXT: blr 167; 168; CHECK-P8-LABEL: less_eq_qp: 169; CHECK-P8: # %bb.0: # %entry 170; CHECK-P8-NEXT: mflr r0 171; CHECK-P8-NEXT: std r0, 16(r1) 172; CHECK-P8-NEXT: stdu r1, -32(r1) 173; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 174; CHECK-P8-NEXT: .cfi_offset lr, 16 175; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 176; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 177; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 178; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 179; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 180; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 181; CHECK-P8-NEXT: ld r4, 8(r6) 182; CHECK-P8-NEXT: ld r6, 8(r7) 183; CHECK-P8-NEXT: bl __lekf2 184; CHECK-P8-NEXT: nop 185; CHECK-P8-NEXT: extsw r3, r3 186; CHECK-P8-NEXT: neg r3, r3 187; CHECK-P8-NEXT: rldicl r3, r3, 1, 63 188; CHECK-P8-NEXT: xori r3, r3, 1 189; CHECK-P8-NEXT: addi r1, r1, 32 190; CHECK-P8-NEXT: ld r0, 16(r1) 191; CHECK-P8-NEXT: mtlr r0 192; CHECK-P8-NEXT: blr 193entry: 194 %0 = load fp128, fp128* @a_qp, align 16 195 %1 = load fp128, fp128* @b_qp, align 16 196 %cmp = fcmp ole fp128 %0, %1 197 %conv = zext i1 %cmp to i32 198 ret i32 %conv 199} 200 201; Function Attrs: noinline nounwind optnone 202define signext i32 @equal_qp() { 203; CHECK-LABEL: equal_qp: 204; CHECK: # %bb.0: # %entry 205; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 206; CHECK-NEXT: li r4, 1 207; CHECK-NEXT: addi r3, r3, a_qp@toc@l 208; CHECK-NEXT: lxvx v2, 0, r3 209; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 210; CHECK-NEXT: addi r3, r3, b_qp@toc@l 211; CHECK-NEXT: lxvx v3, 0, r3 212; CHECK-NEXT: li r3, 0 213; CHECK-NEXT: xscmpuqp cr0, v2, v3 214; CHECK-NEXT: iseleq r3, r4, r3 215; CHECK-NEXT: blr 216; 217; CHECK-P8-LABEL: equal_qp: 218; CHECK-P8: # %bb.0: # %entry 219; CHECK-P8-NEXT: mflr r0 220; CHECK-P8-NEXT: std r0, 16(r1) 221; CHECK-P8-NEXT: stdu r1, -32(r1) 222; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 223; CHECK-P8-NEXT: .cfi_offset lr, 16 224; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 225; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 226; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 227; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 228; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 229; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 230; CHECK-P8-NEXT: ld r4, 8(r6) 231; CHECK-P8-NEXT: ld r6, 8(r7) 232; CHECK-P8-NEXT: bl __eqkf2 233; CHECK-P8-NEXT: nop 234; CHECK-P8-NEXT: cntlzw r3, r3 235; CHECK-P8-NEXT: srwi r3, r3, 5 236; CHECK-P8-NEXT: addi r1, r1, 32 237; CHECK-P8-NEXT: ld r0, 16(r1) 238; CHECK-P8-NEXT: mtlr r0 239; CHECK-P8-NEXT: blr 240entry: 241 %0 = load fp128, fp128* @a_qp, align 16 242 %1 = load fp128, fp128* @b_qp, align 16 243 %cmp = fcmp oeq fp128 %0, %1 244 %conv = zext i1 %cmp to i32 245 ret i32 %conv 246} 247 248; Function Attrs: noinline nounwind optnone 249define signext i32 @not_greater_qp() { 250; CHECK-LABEL: not_greater_qp: 251; CHECK: # %bb.0: # %entry 252; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 253; CHECK-NEXT: addi r3, r3, a_qp@toc@l 254; CHECK-NEXT: lxvx v2, 0, r3 255; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 256; CHECK-NEXT: addi r3, r3, b_qp@toc@l 257; CHECK-NEXT: lxvx v3, 0, r3 258; CHECK-NEXT: li r3, 1 259; CHECK-NEXT: xscmpuqp cr0, v2, v3 260; CHECK-NEXT: iselgt r3, 0, r3 261; CHECK-NEXT: blr 262; 263; CHECK-P8-LABEL: not_greater_qp: 264; CHECK-P8: # %bb.0: # %entry 265; CHECK-P8-NEXT: mflr r0 266; CHECK-P8-NEXT: std r0, 16(r1) 267; CHECK-P8-NEXT: stdu r1, -32(r1) 268; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 269; CHECK-P8-NEXT: .cfi_offset lr, 16 270; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 271; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 272; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 273; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 274; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 275; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 276; CHECK-P8-NEXT: ld r4, 8(r6) 277; CHECK-P8-NEXT: ld r6, 8(r7) 278; CHECK-P8-NEXT: bl __gtkf2 279; CHECK-P8-NEXT: nop 280; CHECK-P8-NEXT: extsw r3, r3 281; CHECK-P8-NEXT: neg r3, r3 282; CHECK-P8-NEXT: rldicl r3, r3, 1, 63 283; CHECK-P8-NEXT: xori r3, r3, 1 284; CHECK-P8-NEXT: addi r1, r1, 32 285; CHECK-P8-NEXT: ld r0, 16(r1) 286; CHECK-P8-NEXT: mtlr r0 287; CHECK-P8-NEXT: blr 288entry: 289 %0 = load fp128, fp128* @a_qp, align 16 290 %1 = load fp128, fp128* @b_qp, align 16 291 %cmp = fcmp ogt fp128 %0, %1 292 %lnot = xor i1 %cmp, true 293 %lnot.ext = zext i1 %lnot to i32 294 ret i32 %lnot.ext 295} 296 297; Function Attrs: noinline nounwind optnone 298define signext i32 @not_less_qp() { 299; CHECK-LABEL: not_less_qp: 300; CHECK: # %bb.0: # %entry 301; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 302; CHECK-NEXT: addi r3, r3, a_qp@toc@l 303; CHECK-NEXT: lxvx v2, 0, r3 304; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 305; CHECK-NEXT: addi r3, r3, b_qp@toc@l 306; CHECK-NEXT: lxvx v3, 0, r3 307; CHECK-NEXT: li r3, 1 308; CHECK-NEXT: xscmpuqp cr0, v2, v3 309; CHECK-NEXT: isellt r3, 0, r3 310; CHECK-NEXT: blr 311; 312; CHECK-P8-LABEL: not_less_qp: 313; CHECK-P8: # %bb.0: # %entry 314; CHECK-P8-NEXT: mflr r0 315; CHECK-P8-NEXT: std r0, 16(r1) 316; CHECK-P8-NEXT: stdu r1, -32(r1) 317; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 318; CHECK-P8-NEXT: .cfi_offset lr, 16 319; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 320; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 321; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 322; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 323; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 324; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 325; CHECK-P8-NEXT: ld r4, 8(r6) 326; CHECK-P8-NEXT: ld r6, 8(r7) 327; CHECK-P8-NEXT: bl __ltkf2 328; CHECK-P8-NEXT: nop 329; CHECK-P8-NEXT: rlwinm r3, r3, 1, 31, 31 330; CHECK-P8-NEXT: xori r3, r3, 1 331; CHECK-P8-NEXT: addi r1, r1, 32 332; CHECK-P8-NEXT: ld r0, 16(r1) 333; CHECK-P8-NEXT: mtlr r0 334; CHECK-P8-NEXT: blr 335entry: 336 %0 = load fp128, fp128* @a_qp, align 16 337 %1 = load fp128, fp128* @b_qp, align 16 338 %cmp = fcmp olt fp128 %0, %1 339 %lnot = xor i1 %cmp, true 340 %lnot.ext = zext i1 %lnot to i32 341 ret i32 %lnot.ext 342} 343 344; Function Attrs: noinline nounwind optnone 345define signext i32 @not_greater_eq_qp() { 346; CHECK-LABEL: not_greater_eq_qp: 347; CHECK: # %bb.0: # %entry 348; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 349; CHECK-NEXT: addi r3, r3, a_qp@toc@l 350; CHECK-NEXT: lxvx v2, 0, r3 351; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 352; CHECK-NEXT: addi r3, r3, b_qp@toc@l 353; CHECK-NEXT: lxvx v3, 0, r3 354; CHECK-NEXT: li r3, 1 355; CHECK-NEXT: xscmpuqp cr0, v2, v3 356; CHECK-NEXT: crnor 4*cr5+lt, lt, un 357; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt 358; CHECK-NEXT: blr 359; 360; CHECK-P8-LABEL: not_greater_eq_qp: 361; CHECK-P8: # %bb.0: # %entry 362; CHECK-P8-NEXT: mflr r0 363; CHECK-P8-NEXT: std r0, 16(r1) 364; CHECK-P8-NEXT: stdu r1, -32(r1) 365; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 366; CHECK-P8-NEXT: .cfi_offset lr, 16 367; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 368; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 369; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 370; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 371; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 372; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 373; CHECK-P8-NEXT: ld r4, 8(r6) 374; CHECK-P8-NEXT: ld r6, 8(r7) 375; CHECK-P8-NEXT: bl __gekf2 376; CHECK-P8-NEXT: nop 377; CHECK-P8-NEXT: rlwinm r3, r3, 1, 31, 31 378; CHECK-P8-NEXT: addi r1, r1, 32 379; CHECK-P8-NEXT: ld r0, 16(r1) 380; CHECK-P8-NEXT: mtlr r0 381; CHECK-P8-NEXT: blr 382entry: 383 %0 = load fp128, fp128* @a_qp, align 16 384 %1 = load fp128, fp128* @b_qp, align 16 385 %cmp = fcmp oge fp128 %0, %1 386 %lnot = xor i1 %cmp, true 387 %lnot.ext = zext i1 %lnot to i32 388 ret i32 %lnot.ext 389} 390 391; Function Attrs: noinline nounwind optnone 392define signext i32 @not_less_eq_qp() { 393; CHECK-LABEL: not_less_eq_qp: 394; CHECK: # %bb.0: # %entry 395; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 396; CHECK-NEXT: addi r3, r3, a_qp@toc@l 397; CHECK-NEXT: lxvx v2, 0, r3 398; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 399; CHECK-NEXT: addi r3, r3, b_qp@toc@l 400; CHECK-NEXT: lxvx v3, 0, r3 401; CHECK-NEXT: li r3, 1 402; CHECK-NEXT: xscmpuqp cr0, v2, v3 403; CHECK-NEXT: crnor 4*cr5+lt, gt, un 404; CHECK-NEXT: isel r3, 0, r3, 4*cr5+lt 405; CHECK-NEXT: blr 406; 407; CHECK-P8-LABEL: not_less_eq_qp: 408; CHECK-P8: # %bb.0: # %entry 409; CHECK-P8-NEXT: mflr r0 410; CHECK-P8-NEXT: std r0, 16(r1) 411; CHECK-P8-NEXT: stdu r1, -32(r1) 412; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 413; CHECK-P8-NEXT: .cfi_offset lr, 16 414; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 415; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 416; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 417; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 418; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 419; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 420; CHECK-P8-NEXT: ld r4, 8(r6) 421; CHECK-P8-NEXT: ld r6, 8(r7) 422; CHECK-P8-NEXT: bl __lekf2 423; CHECK-P8-NEXT: nop 424; CHECK-P8-NEXT: extsw r3, r3 425; CHECK-P8-NEXT: neg r3, r3 426; CHECK-P8-NEXT: rldicl r3, r3, 1, 63 427; CHECK-P8-NEXT: addi r1, r1, 32 428; CHECK-P8-NEXT: ld r0, 16(r1) 429; CHECK-P8-NEXT: mtlr r0 430; CHECK-P8-NEXT: blr 431entry: 432 %0 = load fp128, fp128* @a_qp, align 16 433 %1 = load fp128, fp128* @b_qp, align 16 434 %cmp = fcmp ole fp128 %0, %1 435 %lnot = xor i1 %cmp, true 436 %lnot.ext = zext i1 %lnot to i32 437 ret i32 %lnot.ext 438} 439 440; Function Attrs: noinline nounwind optnone 441define signext i32 @not_equal_qp() { 442; CHECK-LABEL: not_equal_qp: 443; CHECK: # %bb.0: # %entry 444; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 445; CHECK-NEXT: addi r3, r3, a_qp@toc@l 446; CHECK-NEXT: lxvx v2, 0, r3 447; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 448; CHECK-NEXT: addi r3, r3, b_qp@toc@l 449; CHECK-NEXT: lxvx v3, 0, r3 450; CHECK-NEXT: li r3, 1 451; CHECK-NEXT: xscmpuqp cr0, v2, v3 452; CHECK-NEXT: iseleq r3, 0, r3 453; CHECK-NEXT: blr 454; 455; CHECK-P8-LABEL: not_equal_qp: 456; CHECK-P8: # %bb.0: # %entry 457; CHECK-P8-NEXT: mflr r0 458; CHECK-P8-NEXT: std r0, 16(r1) 459; CHECK-P8-NEXT: stdu r1, -32(r1) 460; CHECK-P8-NEXT: .cfi_def_cfa_offset 32 461; CHECK-P8-NEXT: .cfi_offset lr, 16 462; CHECK-P8-NEXT: addis r4, r2, b_qp@toc@ha 463; CHECK-P8-NEXT: addis r5, r2, a_qp@toc@ha 464; CHECK-P8-NEXT: addi r6, r5, a_qp@toc@l 465; CHECK-P8-NEXT: addi r7, r4, b_qp@toc@l 466; CHECK-P8-NEXT: ld r3, a_qp@toc@l(r5) 467; CHECK-P8-NEXT: ld r5, b_qp@toc@l(r4) 468; CHECK-P8-NEXT: ld r4, 8(r6) 469; CHECK-P8-NEXT: ld r6, 8(r7) 470; CHECK-P8-NEXT: bl __nekf2 471; CHECK-P8-NEXT: nop 472; CHECK-P8-NEXT: cntlzw r3, r3 473; CHECK-P8-NEXT: srwi r3, r3, 5 474; CHECK-P8-NEXT: xori r3, r3, 1 475; CHECK-P8-NEXT: addi r1, r1, 32 476; CHECK-P8-NEXT: ld r0, 16(r1) 477; CHECK-P8-NEXT: mtlr r0 478; CHECK-P8-NEXT: blr 479entry: 480 %0 = load fp128, fp128* @a_qp, align 16 481 %1 = load fp128, fp128* @b_qp, align 16 482 %cmp = fcmp une fp128 %0, %1 483 %conv = zext i1 %cmp to i32 484 ret i32 %conv 485} 486 487; Function Attrs: norecurse nounwind readonly 488define fp128 @greater_sel_qp() { 489; CHECK-LABEL: greater_sel_qp: 490; CHECK: # %bb.0: # %entry 491; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 492; CHECK-NEXT: addi r3, r3, a_qp@toc@l 493; CHECK-NEXT: lxvx v2, 0, r3 494; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 495; CHECK-NEXT: addi r3, r3, b_qp@toc@l 496; CHECK-NEXT: lxvx v3, 0, r3 497; CHECK-NEXT: xscmpuqp cr0, v2, v3 498; CHECK-NEXT: bgtlr cr0 499; CHECK-NEXT: # %bb.1: # %entry 500; CHECK-NEXT: vmr v2, v3 501; CHECK-NEXT: blr 502; 503; CHECK-P8-LABEL: greater_sel_qp: 504; CHECK-P8: # %bb.0: # %entry 505; CHECK-P8-NEXT: mflr r0 506; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 507; CHECK-P8-NEXT: .cfi_offset lr, 16 508; CHECK-P8-NEXT: .cfi_offset r27, -40 509; CHECK-P8-NEXT: .cfi_offset r28, -32 510; CHECK-P8-NEXT: .cfi_offset r29, -24 511; CHECK-P8-NEXT: .cfi_offset r30, -16 512; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill 513; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill 514; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill 515; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 516; CHECK-P8-NEXT: std r0, 16(r1) 517; CHECK-P8-NEXT: stdu r1, -80(r1) 518; CHECK-P8-NEXT: addis r3, r2, b_qp@toc@ha 519; CHECK-P8-NEXT: addis r4, r2, a_qp@toc@ha 520; CHECK-P8-NEXT: ld r30, a_qp@toc@l(r4) 521; CHECK-P8-NEXT: addi r4, r4, a_qp@toc@l 522; CHECK-P8-NEXT: ld r29, b_qp@toc@l(r3) 523; CHECK-P8-NEXT: addi r3, r3, b_qp@toc@l 524; CHECK-P8-NEXT: ld r28, 8(r4) 525; CHECK-P8-NEXT: ld r27, 8(r3) 526; CHECK-P8-NEXT: mr r3, r30 527; CHECK-P8-NEXT: mr r5, r29 528; CHECK-P8-NEXT: mr r4, r28 529; CHECK-P8-NEXT: mr r6, r27 530; CHECK-P8-NEXT: bl __gtkf2 531; CHECK-P8-NEXT: nop 532; CHECK-P8-NEXT: cmpwi r3, 0 533; CHECK-P8-NEXT: iselgt r3, r30, r29 534; CHECK-P8-NEXT: iselgt r4, r28, r27 535; CHECK-P8-NEXT: addi r1, r1, 80 536; CHECK-P8-NEXT: ld r0, 16(r1) 537; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 538; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 539; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 540; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 541; CHECK-P8-NEXT: mtlr r0 542; CHECK-P8-NEXT: blr 543entry: 544 %0 = load fp128, fp128* @a_qp, align 16 545 %1 = load fp128, fp128* @b_qp, align 16 546 %cmp = fcmp ogt fp128 %0, %1 547 %cond = select i1 %cmp, fp128 %0, fp128 %1 548 ret fp128 %cond 549} 550 551; Function Attrs: noinline nounwind optnone 552define fp128 @less_sel_qp() { 553; CHECK-LABEL: less_sel_qp: 554; CHECK: # %bb.0: # %entry 555; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 556; CHECK-NEXT: addi r3, r3, a_qp@toc@l 557; CHECK-NEXT: lxvx v2, 0, r3 558; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 559; CHECK-NEXT: addi r3, r3, b_qp@toc@l 560; CHECK-NEXT: lxvx v3, 0, r3 561; CHECK-NEXT: xscmpuqp cr0, v2, v3 562; CHECK-NEXT: bltlr cr0 563; CHECK-NEXT: # %bb.1: # %entry 564; CHECK-NEXT: vmr v2, v3 565; CHECK-NEXT: blr 566; 567; CHECK-P8-LABEL: less_sel_qp: 568; CHECK-P8: # %bb.0: # %entry 569; CHECK-P8-NEXT: mflr r0 570; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 571; CHECK-P8-NEXT: .cfi_offset lr, 16 572; CHECK-P8-NEXT: .cfi_offset r27, -40 573; CHECK-P8-NEXT: .cfi_offset r28, -32 574; CHECK-P8-NEXT: .cfi_offset r29, -24 575; CHECK-P8-NEXT: .cfi_offset r30, -16 576; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill 577; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill 578; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill 579; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 580; CHECK-P8-NEXT: std r0, 16(r1) 581; CHECK-P8-NEXT: stdu r1, -80(r1) 582; CHECK-P8-NEXT: addis r3, r2, b_qp@toc@ha 583; CHECK-P8-NEXT: addis r4, r2, a_qp@toc@ha 584; CHECK-P8-NEXT: ld r30, a_qp@toc@l(r4) 585; CHECK-P8-NEXT: addi r4, r4, a_qp@toc@l 586; CHECK-P8-NEXT: ld r29, b_qp@toc@l(r3) 587; CHECK-P8-NEXT: addi r3, r3, b_qp@toc@l 588; CHECK-P8-NEXT: ld r28, 8(r4) 589; CHECK-P8-NEXT: ld r27, 8(r3) 590; CHECK-P8-NEXT: mr r3, r30 591; CHECK-P8-NEXT: mr r5, r29 592; CHECK-P8-NEXT: mr r4, r28 593; CHECK-P8-NEXT: mr r6, r27 594; CHECK-P8-NEXT: bl __ltkf2 595; CHECK-P8-NEXT: nop 596; CHECK-P8-NEXT: cmpwi r3, 0 597; CHECK-P8-NEXT: isellt r3, r30, r29 598; CHECK-P8-NEXT: isellt r4, r28, r27 599; CHECK-P8-NEXT: addi r1, r1, 80 600; CHECK-P8-NEXT: ld r0, 16(r1) 601; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 602; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 603; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 604; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 605; CHECK-P8-NEXT: mtlr r0 606; CHECK-P8-NEXT: blr 607entry: 608 %0 = load fp128, fp128* @a_qp, align 16 609 %1 = load fp128, fp128* @b_qp, align 16 610 %cmp = fcmp olt fp128 %0, %1 611 %cond = select i1 %cmp, fp128 %0, fp128 %1 612 ret fp128 %cond 613} 614 615; Function Attrs: noinline nounwind optnone 616define fp128 @greater_eq_sel_qp() { 617; CHECK-LABEL: greater_eq_sel_qp: 618; CHECK: # %bb.0: # %entry 619; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 620; CHECK-NEXT: addi r3, r3, a_qp@toc@l 621; CHECK-NEXT: lxvx v2, 0, r3 622; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 623; CHECK-NEXT: addi r3, r3, b_qp@toc@l 624; CHECK-NEXT: lxvx v3, 0, r3 625; CHECK-NEXT: xscmpuqp cr0, v2, v3 626; CHECK-NEXT: crnor 4*cr5+lt, un, lt 627; CHECK-NEXT: bclr 12, 4*cr5+lt, 0 628; CHECK-NEXT: # %bb.1: # %entry 629; CHECK-NEXT: vmr v2, v3 630; CHECK-NEXT: blr 631; 632; CHECK-P8-LABEL: greater_eq_sel_qp: 633; CHECK-P8: # %bb.0: # %entry 634; CHECK-P8-NEXT: mflr r0 635; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 636; CHECK-P8-NEXT: .cfi_offset lr, 16 637; CHECK-P8-NEXT: .cfi_offset r27, -40 638; CHECK-P8-NEXT: .cfi_offset r28, -32 639; CHECK-P8-NEXT: .cfi_offset r29, -24 640; CHECK-P8-NEXT: .cfi_offset r30, -16 641; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill 642; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill 643; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill 644; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 645; CHECK-P8-NEXT: std r0, 16(r1) 646; CHECK-P8-NEXT: stdu r1, -80(r1) 647; CHECK-P8-NEXT: addis r3, r2, b_qp@toc@ha 648; CHECK-P8-NEXT: addis r4, r2, a_qp@toc@ha 649; CHECK-P8-NEXT: ld r30, a_qp@toc@l(r4) 650; CHECK-P8-NEXT: addi r4, r4, a_qp@toc@l 651; CHECK-P8-NEXT: ld r29, b_qp@toc@l(r3) 652; CHECK-P8-NEXT: addi r3, r3, b_qp@toc@l 653; CHECK-P8-NEXT: ld r28, 8(r4) 654; CHECK-P8-NEXT: ld r27, 8(r3) 655; CHECK-P8-NEXT: mr r3, r30 656; CHECK-P8-NEXT: mr r5, r29 657; CHECK-P8-NEXT: mr r4, r28 658; CHECK-P8-NEXT: mr r6, r27 659; CHECK-P8-NEXT: bl __gekf2 660; CHECK-P8-NEXT: nop 661; CHECK-P8-NEXT: cmpwi r3, -1 662; CHECK-P8-NEXT: iselgt r3, r30, r29 663; CHECK-P8-NEXT: iselgt r4, r28, r27 664; CHECK-P8-NEXT: addi r1, r1, 80 665; CHECK-P8-NEXT: ld r0, 16(r1) 666; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 667; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 668; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 669; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 670; CHECK-P8-NEXT: mtlr r0 671; CHECK-P8-NEXT: blr 672entry: 673 %0 = load fp128, fp128* @a_qp, align 16 674 %1 = load fp128, fp128* @b_qp, align 16 675 %cmp = fcmp oge fp128 %0, %1 676 %cond = select i1 %cmp, fp128 %0, fp128 %1 677 ret fp128 %cond 678} 679 680; Function Attrs: noinline nounwind optnone 681define fp128 @less_eq_sel_qp() { 682; CHECK-LABEL: less_eq_sel_qp: 683; CHECK: # %bb.0: # %entry 684; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 685; CHECK-NEXT: addi r3, r3, a_qp@toc@l 686; CHECK-NEXT: lxvx v2, 0, r3 687; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 688; CHECK-NEXT: addi r3, r3, b_qp@toc@l 689; CHECK-NEXT: lxvx v3, 0, r3 690; CHECK-NEXT: xscmpuqp cr0, v2, v3 691; CHECK-NEXT: crnor 4*cr5+lt, un, gt 692; CHECK-NEXT: bclr 12, 4*cr5+lt, 0 693; CHECK-NEXT: # %bb.1: # %entry 694; CHECK-NEXT: vmr v2, v3 695; CHECK-NEXT: blr 696; 697; CHECK-P8-LABEL: less_eq_sel_qp: 698; CHECK-P8: # %bb.0: # %entry 699; CHECK-P8-NEXT: mflr r0 700; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 701; CHECK-P8-NEXT: .cfi_offset lr, 16 702; CHECK-P8-NEXT: .cfi_offset r27, -40 703; CHECK-P8-NEXT: .cfi_offset r28, -32 704; CHECK-P8-NEXT: .cfi_offset r29, -24 705; CHECK-P8-NEXT: .cfi_offset r30, -16 706; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill 707; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill 708; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill 709; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 710; CHECK-P8-NEXT: std r0, 16(r1) 711; CHECK-P8-NEXT: stdu r1, -80(r1) 712; CHECK-P8-NEXT: addis r3, r2, b_qp@toc@ha 713; CHECK-P8-NEXT: addis r4, r2, a_qp@toc@ha 714; CHECK-P8-NEXT: ld r30, a_qp@toc@l(r4) 715; CHECK-P8-NEXT: addi r4, r4, a_qp@toc@l 716; CHECK-P8-NEXT: ld r29, b_qp@toc@l(r3) 717; CHECK-P8-NEXT: addi r3, r3, b_qp@toc@l 718; CHECK-P8-NEXT: ld r28, 8(r4) 719; CHECK-P8-NEXT: ld r27, 8(r3) 720; CHECK-P8-NEXT: mr r3, r30 721; CHECK-P8-NEXT: mr r5, r29 722; CHECK-P8-NEXT: mr r4, r28 723; CHECK-P8-NEXT: mr r6, r27 724; CHECK-P8-NEXT: bl __lekf2 725; CHECK-P8-NEXT: nop 726; CHECK-P8-NEXT: cmpwi r3, 1 727; CHECK-P8-NEXT: isellt r3, r30, r29 728; CHECK-P8-NEXT: isellt r4, r28, r27 729; CHECK-P8-NEXT: addi r1, r1, 80 730; CHECK-P8-NEXT: ld r0, 16(r1) 731; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 732; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 733; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 734; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 735; CHECK-P8-NEXT: mtlr r0 736; CHECK-P8-NEXT: blr 737entry: 738 %0 = load fp128, fp128* @a_qp, align 16 739 %1 = load fp128, fp128* @b_qp, align 16 740 %cmp = fcmp ole fp128 %0, %1 741 %cond = select i1 %cmp, fp128 %0, fp128 %1 742 ret fp128 %cond 743} 744 745; Function Attrs: noinline nounwind optnone 746define fp128 @equal_sel_qp() { 747; CHECK-LABEL: equal_sel_qp: 748; CHECK: # %bb.0: # %entry 749; CHECK-NEXT: addis r3, r2, a_qp@toc@ha 750; CHECK-NEXT: addi r3, r3, a_qp@toc@l 751; CHECK-NEXT: lxvx v2, 0, r3 752; CHECK-NEXT: addis r3, r2, b_qp@toc@ha 753; CHECK-NEXT: addi r3, r3, b_qp@toc@l 754; CHECK-NEXT: lxvx v3, 0, r3 755; CHECK-NEXT: xscmpuqp cr0, v2, v3 756; CHECK-NEXT: beqlr cr0 757; CHECK-NEXT: # %bb.1: # %entry 758; CHECK-NEXT: vmr v2, v3 759; CHECK-NEXT: blr 760; 761; CHECK-P8-LABEL: equal_sel_qp: 762; CHECK-P8: # %bb.0: # %entry 763; CHECK-P8-NEXT: mflr r0 764; CHECK-P8-NEXT: .cfi_def_cfa_offset 80 765; CHECK-P8-NEXT: .cfi_offset lr, 16 766; CHECK-P8-NEXT: .cfi_offset r27, -40 767; CHECK-P8-NEXT: .cfi_offset r28, -32 768; CHECK-P8-NEXT: .cfi_offset r29, -24 769; CHECK-P8-NEXT: .cfi_offset r30, -16 770; CHECK-P8-NEXT: std r27, -40(r1) # 8-byte Folded Spill 771; CHECK-P8-NEXT: std r28, -32(r1) # 8-byte Folded Spill 772; CHECK-P8-NEXT: std r29, -24(r1) # 8-byte Folded Spill 773; CHECK-P8-NEXT: std r30, -16(r1) # 8-byte Folded Spill 774; CHECK-P8-NEXT: std r0, 16(r1) 775; CHECK-P8-NEXT: stdu r1, -80(r1) 776; CHECK-P8-NEXT: addis r3, r2, b_qp@toc@ha 777; CHECK-P8-NEXT: addis r4, r2, a_qp@toc@ha 778; CHECK-P8-NEXT: ld r30, a_qp@toc@l(r4) 779; CHECK-P8-NEXT: addi r4, r4, a_qp@toc@l 780; CHECK-P8-NEXT: ld r29, b_qp@toc@l(r3) 781; CHECK-P8-NEXT: addi r3, r3, b_qp@toc@l 782; CHECK-P8-NEXT: ld r28, 8(r4) 783; CHECK-P8-NEXT: ld r27, 8(r3) 784; CHECK-P8-NEXT: mr r3, r30 785; CHECK-P8-NEXT: mr r5, r29 786; CHECK-P8-NEXT: mr r4, r28 787; CHECK-P8-NEXT: mr r6, r27 788; CHECK-P8-NEXT: bl __eqkf2 789; CHECK-P8-NEXT: nop 790; CHECK-P8-NEXT: cmplwi r3, 0 791; CHECK-P8-NEXT: iseleq r3, r30, r29 792; CHECK-P8-NEXT: iseleq r4, r28, r27 793; CHECK-P8-NEXT: addi r1, r1, 80 794; CHECK-P8-NEXT: ld r0, 16(r1) 795; CHECK-P8-NEXT: ld r30, -16(r1) # 8-byte Folded Reload 796; CHECK-P8-NEXT: ld r29, -24(r1) # 8-byte Folded Reload 797; CHECK-P8-NEXT: ld r28, -32(r1) # 8-byte Folded Reload 798; CHECK-P8-NEXT: ld r27, -40(r1) # 8-byte Folded Reload 799; CHECK-P8-NEXT: mtlr r0 800; CHECK-P8-NEXT: blr 801entry: 802 %0 = load fp128, fp128* @a_qp, align 16 803 %1 = load fp128, fp128* @b_qp, align 16 804 %cmp = fcmp oeq fp128 %0, %1 805 %cond = select i1 %cmp, fp128 %0, fp128 %1 806 ret fp128 %cond 807} 808