1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=-vsx < %s | FileCheck %s 3; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-unknown-linux-gnu -mattr=+vsx < %s | FileCheck %s -check-prefix=CHECK-VSX 4target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" 5target triple = "powerpc64-unknown-linux-gnu" 6 7define double @foo_d_ll(ppc_fp128 %a, ppc_fp128 %b) #0 { 8; CHECK-LABEL: foo_d_ll: 9; CHECK: # %bb.0: # %entry 10; CHECK-NEXT: fcpsgn 1, 3, 1 11; CHECK-NEXT: blr 12; 13; CHECK-VSX-LABEL: foo_d_ll: 14; CHECK-VSX: # %bb.0: # %entry 15; CHECK-VSX-NEXT: xscpsgndp 1, 3, 1 16; CHECK-VSX-NEXT: blr 17entry: 18 %call = tail call ppc_fp128 @copysignl(ppc_fp128 %a, ppc_fp128 %b) #0 19 %conv = fptrunc ppc_fp128 %call to double 20 ret double %conv 21} 22 23declare ppc_fp128 @copysignl(ppc_fp128, ppc_fp128) #0 24 25define double @foo_dl(double %a, ppc_fp128 %b) #0 { 26; CHECK-LABEL: foo_dl: 27; CHECK: # %bb.0: # %entry 28; CHECK-NEXT: fcpsgn 1, 2, 1 29; CHECK-NEXT: blr 30; 31; CHECK-VSX-LABEL: foo_dl: 32; CHECK-VSX: # %bb.0: # %entry 33; CHECK-VSX-NEXT: xscpsgndp 1, 2, 1 34; CHECK-VSX-NEXT: blr 35entry: 36 %conv = fptrunc ppc_fp128 %b to double 37 %call = tail call double @copysign(double %a, double %conv) #0 38 ret double %call 39} 40 41declare double @copysign(double, double) #0 42 43define ppc_fp128 @foo_ll(double %a, ppc_fp128 %b) #0 { 44; CHECK-LABEL: foo_ll: 45; CHECK: # %bb.0: # %entry 46; CHECK-NEXT: mflr 0 47; CHECK-NEXT: stdu 1, -112(1) 48; CHECK-NEXT: fmr 3, 2 49; CHECK-NEXT: addis 3, 2, .LCPI2_0@toc@ha 50; CHECK-NEXT: std 0, 128(1) 51; CHECK-NEXT: lfs 2, .LCPI2_0@toc@l(3) 52; CHECK-NEXT: bl copysignl 53; CHECK-NEXT: nop 54; CHECK-NEXT: addi 1, 1, 112 55; CHECK-NEXT: ld 0, 16(1) 56; CHECK-NEXT: mtlr 0 57; CHECK-NEXT: blr 58; 59; CHECK-VSX-LABEL: foo_ll: 60; CHECK-VSX: # %bb.0: # %entry 61; CHECK-VSX-NEXT: mflr 0 62; CHECK-VSX-NEXT: stdu 1, -112(1) 63; CHECK-VSX-NEXT: fmr 3, 2 64; CHECK-VSX-NEXT: xxlxor 2, 2, 2 65; CHECK-VSX-NEXT: std 0, 128(1) 66; CHECK-VSX-NEXT: bl copysignl 67; CHECK-VSX-NEXT: nop 68; CHECK-VSX-NEXT: addi 1, 1, 112 69; CHECK-VSX-NEXT: ld 0, 16(1) 70; CHECK-VSX-NEXT: mtlr 0 71; CHECK-VSX-NEXT: blr 72entry: 73 %conv = fpext double %a to ppc_fp128 74 %call = tail call ppc_fp128 @copysignl(ppc_fp128 %conv, ppc_fp128 %b) #0 75 ret ppc_fp128 %call 76} 77 78define ppc_fp128 @foo_ld(double %a, double %b) #0 { 79; CHECK-LABEL: foo_ld: 80; CHECK: # %bb.0: # %entry 81; CHECK-NEXT: mflr 0 82; CHECK-NEXT: stdu 1, -112(1) 83; CHECK-NEXT: fmr 3, 2 84; CHECK-NEXT: addis 3, 2, .LCPI3_0@toc@ha 85; CHECK-NEXT: std 0, 128(1) 86; CHECK-NEXT: lfs 2, .LCPI3_0@toc@l(3) 87; CHECK-NEXT: bl copysignl 88; CHECK-NEXT: nop 89; CHECK-NEXT: addi 1, 1, 112 90; CHECK-NEXT: ld 0, 16(1) 91; CHECK-NEXT: mtlr 0 92; CHECK-NEXT: blr 93; 94; CHECK-VSX-LABEL: foo_ld: 95; CHECK-VSX: # %bb.0: # %entry 96; CHECK-VSX-NEXT: mflr 0 97; CHECK-VSX-NEXT: stdu 1, -112(1) 98; CHECK-VSX-NEXT: fmr 3, 2 99; CHECK-VSX-NEXT: xxlxor 2, 2, 2 100; CHECK-VSX-NEXT: std 0, 128(1) 101; CHECK-VSX-NEXT: bl copysignl 102; CHECK-VSX-NEXT: nop 103; CHECK-VSX-NEXT: addi 1, 1, 112 104; CHECK-VSX-NEXT: ld 0, 16(1) 105; CHECK-VSX-NEXT: mtlr 0 106; CHECK-VSX-NEXT: blr 107entry: 108 %conv = fpext double %a to ppc_fp128 109 %conv1 = fpext double %b to ppc_fp128 110 %call = tail call ppc_fp128 @copysignl(ppc_fp128 %conv, ppc_fp128 %conv1) #0 111 ret ppc_fp128 %call 112} 113 114define ppc_fp128 @foo_lf(double %a, float %b) #0 { 115; CHECK-LABEL: foo_lf: 116; CHECK: # %bb.0: # %entry 117; CHECK-NEXT: mflr 0 118; CHECK-NEXT: stdu 1, -112(1) 119; CHECK-NEXT: fmr 3, 2 120; CHECK-NEXT: addis 3, 2, .LCPI4_0@toc@ha 121; CHECK-NEXT: std 0, 128(1) 122; CHECK-NEXT: lfs 2, .LCPI4_0@toc@l(3) 123; CHECK-NEXT: bl copysignl 124; CHECK-NEXT: nop 125; CHECK-NEXT: addi 1, 1, 112 126; CHECK-NEXT: ld 0, 16(1) 127; CHECK-NEXT: mtlr 0 128; CHECK-NEXT: blr 129; 130; CHECK-VSX-LABEL: foo_lf: 131; CHECK-VSX: # %bb.0: # %entry 132; CHECK-VSX-NEXT: mflr 0 133; CHECK-VSX-NEXT: stdu 1, -112(1) 134; CHECK-VSX-NEXT: fmr 3, 2 135; CHECK-VSX-NEXT: xxlxor 2, 2, 2 136; CHECK-VSX-NEXT: std 0, 128(1) 137; CHECK-VSX-NEXT: bl copysignl 138; CHECK-VSX-NEXT: nop 139; CHECK-VSX-NEXT: addi 1, 1, 112 140; CHECK-VSX-NEXT: ld 0, 16(1) 141; CHECK-VSX-NEXT: mtlr 0 142; CHECK-VSX-NEXT: blr 143entry: 144 %conv = fpext double %a to ppc_fp128 145 %conv1 = fpext float %b to ppc_fp128 146 %call = tail call ppc_fp128 @copysignl(ppc_fp128 %conv, ppc_fp128 %conv1) #0 147 ret ppc_fp128 %call 148} 149 150attributes #0 = { nounwind readnone } 151 152