1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-LE 3; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-LE 4; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 < %s | FileCheck %s -check-prefixes=PPC64-P8,PPC64-P8-BE 5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s -check-prefixes=PPC64,PPC64-BE 6; RUN: llc -verify-machineinstrs -mtriple=powerpc-unknown-linux-gnu < %s | FileCheck %s -check-prefix=PPC32 7 8define i128 @test_abs(ppc_fp128 %x) nounwind { 9; PPC64-P8-LABEL: test_abs: 10; PPC64-P8: # %bb.0: # %entry 11; PPC64-P8-NEXT: mffprd 3, 1 12; PPC64-P8-NEXT: mffprd 4, 2 13; PPC64-P8-NEXT: rldicr 5, 3, 0, 0 14; PPC64-P8-NEXT: xor 3, 3, 5 15; PPC64-P8-NEXT: xor 4, 4, 5 16; PPC64-P8-NEXT: blr 17; 18; PPC64-LABEL: test_abs: 19; PPC64: # %bb.0: # %entry 20; PPC64-NEXT: stfd 1, -16(1) 21; PPC64-NEXT: stfd 2, -8(1) 22; PPC64-NEXT: ld 3, -16(1) 23; PPC64-NEXT: ld 4, -8(1) 24; PPC64-NEXT: rldicr 5, 3, 0, 0 25; PPC64-NEXT: xor 3, 3, 5 26; PPC64-NEXT: xor 4, 4, 5 27; PPC64-NEXT: blr 28; 29; PPC32-LABEL: test_abs: 30; PPC32: # %bb.0: # %entry 31; PPC32-NEXT: stwu 1, -32(1) 32; PPC32-NEXT: stfd 1, 24(1) 33; PPC32-NEXT: stfd 2, 16(1) 34; PPC32-NEXT: lwz 3, 24(1) 35; PPC32-NEXT: lwz 5, 16(1) 36; PPC32-NEXT: rlwinm 7, 3, 0, 0, 0 37; PPC32-NEXT: lwz 4, 28(1) 38; PPC32-NEXT: xor 3, 3, 7 39; PPC32-NEXT: lwz 6, 20(1) 40; PPC32-NEXT: xor 5, 5, 7 41; PPC32-NEXT: addi 1, 1, 32 42; PPC32-NEXT: blr 43entry: 44 %0 = tail call ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128 %x) 45 %1 = bitcast ppc_fp128 %0 to i128 46 ret i128 %1 47} 48 49define i128 @test_neg(ppc_fp128 %x) nounwind { 50; PPC64-P8-LABEL: test_neg: 51; PPC64-P8: # %bb.0: # %entry 52; PPC64-P8-NEXT: mffprd 4, 2 53; PPC64-P8-NEXT: mffprd 3, 1 54; PPC64-P8-NEXT: li 5, 1 55; PPC64-P8-NEXT: rldic 5, 5, 63, 0 56; PPC64-P8-NEXT: xor 3, 3, 5 57; PPC64-P8-NEXT: xor 4, 4, 5 58; PPC64-P8-NEXT: blr 59; 60; PPC64-LABEL: test_neg: 61; PPC64: # %bb.0: # %entry 62; PPC64-NEXT: stfd 2, -8(1) 63; PPC64-NEXT: stfd 1, -16(1) 64; PPC64-NEXT: li 5, 1 65; PPC64-NEXT: ld 4, -8(1) 66; PPC64-NEXT: ld 3, -16(1) 67; PPC64-NEXT: rldic 5, 5, 63, 0 68; PPC64-NEXT: xor 3, 3, 5 69; PPC64-NEXT: xor 4, 4, 5 70; PPC64-NEXT: blr 71; 72; PPC32-LABEL: test_neg: 73; PPC32: # %bb.0: # %entry 74; PPC32-NEXT: stwu 1, -32(1) 75; PPC32-NEXT: stfd 1, 24(1) 76; PPC32-NEXT: stfd 2, 16(1) 77; PPC32-NEXT: lwz 5, 16(1) 78; PPC32-NEXT: lwz 3, 24(1) 79; PPC32-NEXT: lwz 4, 28(1) 80; PPC32-NEXT: xoris 5, 5, 32768 81; PPC32-NEXT: lwz 6, 20(1) 82; PPC32-NEXT: xoris 3, 3, 32768 83; PPC32-NEXT: addi 1, 1, 32 84; PPC32-NEXT: blr 85entry: 86 %0 = fsub ppc_fp128 0xM80000000000000000000000000000000, %x 87 %1 = bitcast ppc_fp128 %0 to i128 88 ret i128 %1 89} 90 91define i128 @test_copysign(ppc_fp128 %x, ppc_fp128 %y) nounwind { 92; PPC64-P8-LE-LABEL: test_copysign: 93; PPC64-P8-LE: # %bb.0: # %entry 94; PPC64-P8-LE-NEXT: mflr 0 95; PPC64-P8-LE-NEXT: stdu 1, -32(1) 96; PPC64-P8-LE-NEXT: std 0, 48(1) 97; PPC64-P8-LE-NEXT: bl copysignl 98; PPC64-P8-LE-NEXT: nop 99; PPC64-P8-LE-NEXT: mffprd 3, 1 100; PPC64-P8-LE-NEXT: mffprd 4, 2 101; PPC64-P8-LE-NEXT: addi 1, 1, 32 102; PPC64-P8-LE-NEXT: ld 0, 16(1) 103; PPC64-P8-LE-NEXT: mtlr 0 104; PPC64-P8-LE-NEXT: blr 105; 106; PPC64-LE-LABEL: test_copysign: 107; PPC64-LE: # %bb.0: # %entry 108; PPC64-LE-NEXT: mflr 0 109; PPC64-LE-NEXT: stdu 1, -48(1) 110; PPC64-LE-NEXT: std 0, 64(1) 111; PPC64-LE-NEXT: bl copysignl 112; PPC64-LE-NEXT: nop 113; PPC64-LE-NEXT: stfd 1, 32(1) 114; PPC64-LE-NEXT: stfd 2, 40(1) 115; PPC64-LE-NEXT: ld 3, 32(1) 116; PPC64-LE-NEXT: ld 4, 40(1) 117; PPC64-LE-NEXT: addi 1, 1, 48 118; PPC64-LE-NEXT: ld 0, 16(1) 119; PPC64-LE-NEXT: mtlr 0 120; PPC64-LE-NEXT: blr 121; 122; PPC64-P8-BE-LABEL: test_copysign: 123; PPC64-P8-BE: # %bb.0: # %entry 124; PPC64-P8-BE-NEXT: mflr 0 125; PPC64-P8-BE-NEXT: stdu 1, -112(1) 126; PPC64-P8-BE-NEXT: std 0, 128(1) 127; PPC64-P8-BE-NEXT: bl copysignl 128; PPC64-P8-BE-NEXT: nop 129; PPC64-P8-BE-NEXT: mffprd 3, 1 130; PPC64-P8-BE-NEXT: mffprd 4, 2 131; PPC64-P8-BE-NEXT: addi 1, 1, 112 132; PPC64-P8-BE-NEXT: ld 0, 16(1) 133; PPC64-P8-BE-NEXT: mtlr 0 134; PPC64-P8-BE-NEXT: blr 135; 136; PPC64-BE-LABEL: test_copysign: 137; PPC64-BE: # %bb.0: # %entry 138; PPC64-BE-NEXT: mflr 0 139; PPC64-BE-NEXT: stdu 1, -128(1) 140; PPC64-BE-NEXT: std 0, 144(1) 141; PPC64-BE-NEXT: bl copysignl 142; PPC64-BE-NEXT: nop 143; PPC64-BE-NEXT: stfd 1, 112(1) 144; PPC64-BE-NEXT: stfd 2, 120(1) 145; PPC64-BE-NEXT: ld 3, 112(1) 146; PPC64-BE-NEXT: ld 4, 120(1) 147; PPC64-BE-NEXT: addi 1, 1, 128 148; PPC64-BE-NEXT: ld 0, 16(1) 149; PPC64-BE-NEXT: mtlr 0 150; PPC64-BE-NEXT: blr 151; 152; PPC32-LABEL: test_copysign: 153; PPC32: # %bb.0: # %entry 154; PPC32-NEXT: mflr 0 155; PPC32-NEXT: stwu 1, -80(1) 156; PPC32-NEXT: stw 0, 84(1) 157; PPC32-NEXT: stfd 1, 32(1) 158; PPC32-NEXT: lwz 3, 36(1) 159; PPC32-NEXT: stfd 2, 24(1) 160; PPC32-NEXT: stw 3, 52(1) 161; PPC32-NEXT: lwz 3, 32(1) 162; PPC32-NEXT: stfd 3, 56(1) 163; PPC32-NEXT: stw 3, 48(1) 164; PPC32-NEXT: lwz 3, 28(1) 165; PPC32-NEXT: lfd 4, 64(1) 166; PPC32-NEXT: stw 3, 44(1) 167; PPC32-NEXT: lwz 3, 24(1) 168; PPC32-NEXT: lfd 1, 48(1) 169; PPC32-NEXT: stw 3, 40(1) 170; PPC32-NEXT: lwz 3, 60(1) 171; PPC32-NEXT: lfd 2, 40(1) 172; PPC32-NEXT: stw 3, 76(1) 173; PPC32-NEXT: lwz 3, 56(1) 174; PPC32-NEXT: stw 3, 72(1) 175; PPC32-NEXT: lfd 3, 72(1) 176; PPC32-NEXT: bl copysignl 177; PPC32-NEXT: stfd 1, 8(1) 178; PPC32-NEXT: stfd 2, 16(1) 179; PPC32-NEXT: lwz 3, 8(1) 180; PPC32-NEXT: lwz 4, 12(1) 181; PPC32-NEXT: lwz 5, 16(1) 182; PPC32-NEXT: lwz 6, 20(1) 183; PPC32-NEXT: lwz 0, 84(1) 184; PPC32-NEXT: addi 1, 1, 80 185; PPC32-NEXT: mtlr 0 186; PPC32-NEXT: blr 187entry: 188 %0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 %x, ppc_fp128 %y) 189 %1 = bitcast ppc_fp128 %0 to i128 190 ret i128 %1 191} 192 193define i128 @test_copysign_const(ppc_fp128 %x) nounwind { 194; PPC64-P8-LABEL: test_copysign_const: 195; PPC64-P8: # %bb.0: # %entry 196; PPC64-P8-NEXT: mffprd 3, 1 197; PPC64-P8-NEXT: li 5, 3019 198; PPC64-P8-NEXT: rldic 5, 5, 52, 0 199; PPC64-P8-NEXT: rldicr 4, 3, 0, 0 200; PPC64-P8-NEXT: li 3, 16399 201; PPC64-P8-NEXT: rldic 3, 3, 48, 1 202; PPC64-P8-NEXT: or 3, 4, 3 203; PPC64-P8-NEXT: xor 4, 4, 5 204; PPC64-P8-NEXT: blr 205; 206; PPC64-LABEL: test_copysign_const: 207; PPC64: # %bb.0: # %entry 208; PPC64-NEXT: stfd 1, -8(1) 209; PPC64-NEXT: li 5, 3019 210; PPC64-NEXT: ld 3, -8(1) 211; PPC64-NEXT: rldic 5, 5, 52, 0 212; PPC64-NEXT: rldicr 4, 3, 0, 0 213; PPC64-NEXT: li 3, 16399 214; PPC64-NEXT: rldic 3, 3, 48, 1 215; PPC64-NEXT: or 3, 4, 3 216; PPC64-NEXT: xor 4, 4, 5 217; PPC64-NEXT: blr 218; 219; PPC32-LABEL: test_copysign_const: 220; PPC32: # %bb.0: # %entry 221; PPC32-NEXT: stwu 1, -32(1) 222; PPC32-NEXT: stfd 1, 24(1) 223; PPC32-NEXT: li 6, 0 224; PPC32-NEXT: lwz 3, 24(1) 225; PPC32-NEXT: rlwinm 4, 3, 0, 0, 0 226; PPC32-NEXT: oris 3, 4, 16399 227; PPC32-NEXT: xoris 5, 4, 48304 228; PPC32-NEXT: li 4, 0 229; PPC32-NEXT: addi 1, 1, 32 230; PPC32-NEXT: blr 231entry: 232 %0 = tail call ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128 0xM400F000000000000BCB0000000000000, ppc_fp128 %x) 233 %1 = bitcast ppc_fp128 %0 to i128 234 ret i128 %1 235} 236 237declare ppc_fp128 @llvm.fabs.ppcf128(ppc_fp128) 238declare ppc_fp128 @llvm.copysign.ppcf128(ppc_fp128, ppc_fp128) 239