1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s \ 3; RUN: -verify-machineinstrs | FileCheck %s --check-prefix=P8 4; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s \ 5; RUN: -verify-machineinstrs | FileCheck %s --check-prefix=P9 6 7define zeroext i1 @abs_isinff(float %x) { 8; P8-LABEL: abs_isinff: 9; P8: # %bb.0: # %entry 10; P8-NEXT: xscvdpspn 0, 1 11; P8-NEXT: lis 4, 32640 12; P8-NEXT: mffprwz 3, 0 13; P8-NEXT: clrlwi 3, 3, 1 14; P8-NEXT: xor 3, 3, 4 15; P8-NEXT: cntlzw 3, 3 16; P8-NEXT: srwi 3, 3, 5 17; P8-NEXT: blr 18; 19; P9-LABEL: abs_isinff: 20; P9: # %bb.0: # %entry 21; P9-NEXT: xststdcsp 0, 1, 48 22; P9-NEXT: li 3, 0 23; P9-NEXT: li 4, 1 24; P9-NEXT: iseleq 3, 4, 3 25; P9-NEXT: blr 26entry: 27 %0 = tail call float @llvm.fabs.f32(float %x) 28 %cmpinf = fcmp oeq float %0, 0x7FF0000000000000 29 ret i1 %cmpinf 30} 31 32define zeroext i1 @abs_isinf(double %x) { 33; P8-LABEL: abs_isinf: 34; P8: # %bb.0: # %entry 35; P8-NEXT: mffprd 3, 1 36; P8-NEXT: li 4, 2047 37; P8-NEXT: rldic 4, 4, 52, 1 38; P8-NEXT: clrldi 3, 3, 1 39; P8-NEXT: xor 3, 3, 4 40; P8-NEXT: cntlzd 3, 3 41; P8-NEXT: rldicl 3, 3, 58, 63 42; P8-NEXT: blr 43; 44; P9-LABEL: abs_isinf: 45; P9: # %bb.0: # %entry 46; P9-NEXT: xststdcdp 0, 1, 48 47; P9-NEXT: li 3, 0 48; P9-NEXT: li 4, 1 49; P9-NEXT: iseleq 3, 4, 3 50; P9-NEXT: blr 51entry: 52 %0 = tail call double @llvm.fabs.f64(double %x) 53 %cmpinf = fcmp oeq double %0, 0x7FF0000000000000 54 ret i1 %cmpinf 55} 56 57define zeroext i1 @abs_isinfq(fp128 %x) { 58; P8-LABEL: abs_isinfq: 59; P8: # %bb.0: # %entry 60; P8-NEXT: xxswapd 0, 34 61; P8-NEXT: addi 3, 1, -16 62; P8-NEXT: li 5, 32767 63; P8-NEXT: stxvd2x 0, 0, 3 64; P8-NEXT: rldic 5, 5, 48, 1 65; P8-NEXT: ld 4, -8(1) 66; P8-NEXT: ld 3, -16(1) 67; P8-NEXT: clrldi 4, 4, 1 68; P8-NEXT: xor 4, 4, 5 69; P8-NEXT: or 3, 3, 4 70; P8-NEXT: cntlzd 3, 3 71; P8-NEXT: rldicl 3, 3, 58, 63 72; P8-NEXT: blr 73; 74; P9-LABEL: abs_isinfq: 75; P9: # %bb.0: # %entry 76; P9-NEXT: xststdcqp 0, 2, 48 77; P9-NEXT: li 3, 0 78; P9-NEXT: li 4, 1 79; P9-NEXT: iseleq 3, 4, 3 80; P9-NEXT: blr 81entry: 82 %0 = tail call fp128 @llvm.fabs.f128(fp128 %x) 83 %cmpinf = fcmp oeq fp128 %0, 0xL00000000000000007FFF000000000000 84 ret i1 %cmpinf 85} 86 87define zeroext i1 @abs_isinfornanf(float %x) { 88; P8-LABEL: abs_isinfornanf: 89; P8: # %bb.0: # %entry 90; P8-NEXT: xscvdpspn 0, 1 91; P8-NEXT: lis 4, 32639 92; P8-NEXT: ori 4, 4, 65535 93; P8-NEXT: mffprwz 3, 0 94; P8-NEXT: clrlwi 3, 3, 1 95; P8-NEXT: sub 3, 4, 3 96; P8-NEXT: rldicl 3, 3, 1, 63 97; P8-NEXT: blr 98; 99; P9-LABEL: abs_isinfornanf: 100; P9: # %bb.0: # %entry 101; P9-NEXT: xststdcsp 0, 1, 112 102; P9-NEXT: li 3, 0 103; P9-NEXT: li 4, 1 104; P9-NEXT: iseleq 3, 4, 3 105; P9-NEXT: blr 106entry: 107 %0 = tail call float @llvm.fabs.f32(float %x) 108 %cmpinf = fcmp ueq float %0, 0x7FF0000000000000 109 ret i1 %cmpinf 110} 111 112define zeroext i1 @abs_isinfornan(double %x) { 113; P8-LABEL: abs_isinfornan: 114; P8: # %bb.0: # %entry 115; P8-NEXT: mffprd 3, 1 116; P8-NEXT: li 4, -33 117; P8-NEXT: rldicl 4, 4, 47, 1 118; P8-NEXT: sradi 5, 4, 63 119; P8-NEXT: clrldi 3, 3, 1 120; P8-NEXT: rldicl 6, 3, 1, 63 121; P8-NEXT: subc 3, 4, 3 122; P8-NEXT: adde 3, 6, 5 123; P8-NEXT: xori 3, 3, 1 124; P8-NEXT: blr 125; 126; P9-LABEL: abs_isinfornan: 127; P9: # %bb.0: # %entry 128; P9-NEXT: xststdcdp 0, 1, 112 129; P9-NEXT: li 3, 0 130; P9-NEXT: li 4, 1 131; P9-NEXT: iseleq 3, 4, 3 132; P9-NEXT: blr 133entry: 134 %0 = tail call double @llvm.fabs.f64(double %x) 135 %cmpinf = fcmp ueq double %0, 0x7FF0000000000000 136 ret i1 %cmpinf 137} 138 139define zeroext i1 @abs_isinfornanq(fp128 %x) { 140; P8-LABEL: abs_isinfornanq: 141; P8: # %bb.0: # %entry 142; P8-NEXT: xxswapd 0, 34 143; P8-NEXT: addi 3, 1, -16 144; P8-NEXT: li 4, -3 145; P8-NEXT: stxvd2x 0, 0, 3 146; P8-NEXT: rldicl 4, 4, 47, 1 147; P8-NEXT: ld 3, -8(1) 148; P8-NEXT: sradi 5, 4, 63 149; P8-NEXT: clrldi 3, 3, 1 150; P8-NEXT: rldicl 6, 3, 1, 63 151; P8-NEXT: subc 3, 4, 3 152; P8-NEXT: adde 3, 6, 5 153; P8-NEXT: xori 3, 3, 1 154; P8-NEXT: blr 155; 156; P9-LABEL: abs_isinfornanq: 157; P9: # %bb.0: # %entry 158; P9-NEXT: xststdcqp 0, 2, 112 159; P9-NEXT: li 3, 0 160; P9-NEXT: li 4, 1 161; P9-NEXT: iseleq 3, 4, 3 162; P9-NEXT: blr 163entry: 164 %0 = tail call fp128 @llvm.fabs.f128(fp128 %x) 165 %cmpinf = fcmp ueq fp128 %0, 0xL00000000000000007FFF000000000000 166 ret i1 %cmpinf 167} 168 169define <4 x i1> @abs_isinfv4f32(<4 x float> %x) { 170; P8-LABEL: abs_isinfv4f32: 171; P8: # %bb.0: # %entry 172; P8-NEXT: addis 3, 2, .LCPI6_0@toc@ha 173; P8-NEXT: xvabssp 0, 34 174; P8-NEXT: addi 3, 3, .LCPI6_0@toc@l 175; P8-NEXT: lxvd2x 1, 0, 3 176; P8-NEXT: xvcmpeqsp 34, 0, 1 177; P8-NEXT: blr 178; 179; P9-LABEL: abs_isinfv4f32: 180; P9: # %bb.0: # %entry 181; P9-NEXT: addis 3, 2, .LCPI6_0@toc@ha 182; P9-NEXT: xvabssp 0, 34 183; P9-NEXT: addi 3, 3, .LCPI6_0@toc@l 184; P9-NEXT: lxv 1, 0(3) 185; P9-NEXT: xvcmpeqsp 34, 0, 1 186; P9-NEXT: blr 187entry: 188 %0 = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %x) 189 %cmpinf = fcmp oeq <4 x float> %0, <float 0x7FF0000000000000, float 0x7FF0000000000000, float 0x7FF0000000000000, float 0x7FF0000000000000> 190 ret <4 x i1> %cmpinf 191} 192 193define <2 x i1> @abs_isinfv2f64(<2 x double> %x) { 194; P8-LABEL: abs_isinfv2f64: 195; P8: # %bb.0: # %entry 196; P8-NEXT: addis 3, 2, .LCPI7_0@toc@ha 197; P8-NEXT: xvabsdp 0, 34 198; P8-NEXT: addi 3, 3, .LCPI7_0@toc@l 199; P8-NEXT: lxvd2x 1, 0, 3 200; P8-NEXT: xvcmpeqdp 34, 0, 1 201; P8-NEXT: blr 202; 203; P9-LABEL: abs_isinfv2f64: 204; P9: # %bb.0: # %entry 205; P9-NEXT: addis 3, 2, .LCPI7_0@toc@ha 206; P9-NEXT: xvabsdp 0, 34 207; P9-NEXT: addi 3, 3, .LCPI7_0@toc@l 208; P9-NEXT: lxv 1, 0(3) 209; P9-NEXT: xvcmpeqdp 34, 0, 1 210; P9-NEXT: blr 211entry: 212 %0 = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %x) 213 %cmpinf = fcmp oeq <2 x double> %0, <double 0x7FF0000000000000, double 0x7FF0000000000000> 214 ret <2 x i1> %cmpinf 215} 216 217define zeroext i1 @iszerof(float %x) { 218; P8-LABEL: iszerof: 219; P8: # %bb.0: # %entry 220; P8-NEXT: xxlxor 0, 0, 0 221; P8-NEXT: li 3, 0 222; P8-NEXT: li 4, 1 223; P8-NEXT: fcmpu 0, 1, 0 224; P8-NEXT: iseleq 3, 4, 3 225; P8-NEXT: blr 226; 227; P9-LABEL: iszerof: 228; P9: # %bb.0: # %entry 229; P9-NEXT: xxlxor 0, 0, 0 230; P9-NEXT: li 3, 0 231; P9-NEXT: li 4, 1 232; P9-NEXT: fcmpu 0, 1, 0 233; P9-NEXT: iseleq 3, 4, 3 234; P9-NEXT: blr 235entry: 236 %cmp = fcmp oeq float %x, 0.000000e+00 237 ret i1 %cmp 238} 239 240define zeroext i1 @iszero(double %x) { 241; P8-LABEL: iszero: 242; P8: # %bb.0: # %entry 243; P8-NEXT: xxlxor 0, 0, 0 244; P8-NEXT: li 3, 0 245; P8-NEXT: li 4, 1 246; P8-NEXT: fcmpu 0, 1, 0 247; P8-NEXT: iseleq 3, 4, 3 248; P8-NEXT: blr 249; 250; P9-LABEL: iszero: 251; P9: # %bb.0: # %entry 252; P9-NEXT: xxlxor 0, 0, 0 253; P9-NEXT: li 3, 0 254; P9-NEXT: li 4, 1 255; P9-NEXT: fcmpu 0, 1, 0 256; P9-NEXT: iseleq 3, 4, 3 257; P9-NEXT: blr 258entry: 259 %cmp = fcmp oeq double %x, 0.000000e+00 260 ret i1 %cmp 261} 262 263define zeroext i1 @iszeroq(fp128 %x) { 264; P8-LABEL: iszeroq: 265; P8: # %bb.0: # %entry 266; P8-NEXT: mflr 0 267; P8-NEXT: stdu 1, -32(1) 268; P8-NEXT: std 0, 48(1) 269; P8-NEXT: .cfi_def_cfa_offset 32 270; P8-NEXT: .cfi_offset lr, 16 271; P8-NEXT: addis 3, 2, .LCPI10_0@toc@ha 272; P8-NEXT: addi 3, 3, .LCPI10_0@toc@l 273; P8-NEXT: lxvd2x 0, 0, 3 274; P8-NEXT: xxswapd 35, 0 275; P8-NEXT: bl __eqkf2 276; P8-NEXT: nop 277; P8-NEXT: cntlzw 3, 3 278; P8-NEXT: srwi 3, 3, 5 279; P8-NEXT: addi 1, 1, 32 280; P8-NEXT: ld 0, 16(1) 281; P8-NEXT: mtlr 0 282; P8-NEXT: blr 283; 284; P9-LABEL: iszeroq: 285; P9: # %bb.0: # %entry 286; P9-NEXT: addis 3, 2, .LCPI10_0@toc@ha 287; P9-NEXT: li 4, 1 288; P9-NEXT: addi 3, 3, .LCPI10_0@toc@l 289; P9-NEXT: lxv 35, 0(3) 290; P9-NEXT: li 3, 0 291; P9-NEXT: xscmpuqp 0, 2, 3 292; P9-NEXT: iseleq 3, 4, 3 293; P9-NEXT: blr 294entry: 295 %cmp = fcmp oeq fp128 %x, 0xL00000000000000000000000000000000 296 ret i1 %cmp 297} 298 299define <4 x i1> @iszerov4f32(<4 x float> %x) { 300; P8-LABEL: iszerov4f32: 301; P8: # %bb.0: # %entry 302; P8-NEXT: xxlxor 0, 0, 0 303; P8-NEXT: xvcmpeqsp 34, 34, 0 304; P8-NEXT: blr 305; 306; P9-LABEL: iszerov4f32: 307; P9: # %bb.0: # %entry 308; P9-NEXT: xxlxor 0, 0, 0 309; P9-NEXT: xvcmpeqsp 34, 34, 0 310; P9-NEXT: blr 311entry: 312 %cmp = fcmp oeq <4 x float> %x, <float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00> 313 ret <4 x i1> %cmp 314} 315 316define <2 x i1> @iszerov2f64(<2 x double> %x) { 317; P8-LABEL: iszerov2f64: 318; P8: # %bb.0: # %entry 319; P8-NEXT: xxlxor 0, 0, 0 320; P8-NEXT: xvcmpeqdp 34, 34, 0 321; P8-NEXT: blr 322; 323; P9-LABEL: iszerov2f64: 324; P9: # %bb.0: # %entry 325; P9-NEXT: xxlxor 0, 0, 0 326; P9-NEXT: xvcmpeqdp 34, 34, 0 327; P9-NEXT: blr 328entry: 329 %cmp = fcmp oeq <2 x double> %x, <double 0.000000e+00, double 0.000000e+00> 330 ret <2 x i1> %cmp 331} 332 333declare float @llvm.fabs.f32(float) 334declare double @llvm.fabs.f64(double) 335declare fp128 @llvm.fabs.f128(fp128) 336declare <4 x float> @llvm.fabs.v4f32(<4 x float>) 337declare <2 x double> @llvm.fabs.v2f64(<2 x double>) 338