1; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2q -enable-unsafe-fp-math | FileCheck %s 2; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=a2q | FileCheck -check-prefix=CHECK-SAFE %s 3target 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" 4target triple = "powerpc64-unknown-linux-gnu" 5 6declare <4 x double> @llvm.sqrt.v4f64(<4 x double>) 7declare <4 x float> @llvm.sqrt.v4f32(<4 x float>) 8 9define <4 x double> @foo(<4 x double> %a, <4 x double> %b) nounwind { 10entry: 11 %x = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %b) 12 %r = fdiv <4 x double> %a, %x 13 ret <4 x double> %r 14 15; CHECK-LABEL: @foo 16; CHECK: qvfrsqrte 17; CHECK: qvfmul 18; FIXME: We're currently loading two constants here (1.5 and -1.5), and using 19; an qvfmadd instead of a qvfnmsub 20; CHECK: qvfmadd 21; CHECK: qvfmadd 22; CHECK: qvfmul 23; CHECK: qvfmul 24; CHECK: qvfmadd 25; CHECK: qvfmul 26; CHECK: qvfmul 27; CHECK: blr 28 29; CHECK-SAFE-LABEL: @foo 30; CHECK-SAFE: fsqrt 31; CHECK-SAFE: fdiv 32; CHECK-SAFE: blr 33} 34 35define <4 x double> @foof(<4 x double> %a, <4 x float> %b) nounwind { 36entry: 37 %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) 38 %y = fpext <4 x float> %x to <4 x double> 39 %r = fdiv <4 x double> %a, %y 40 ret <4 x double> %r 41 42; CHECK-LABEL: @foof 43; CHECK: qvfrsqrtes 44; CHECK: qvfmuls 45; FIXME: We're currently loading two constants here (1.5 and -1.5), and using 46; an qvfmadd instead of a qvfnmsubs 47; CHECK: qvfmadds 48; CHECK: qvfmadds 49; CHECK: qvfmuls 50; CHECK: qvfmul 51; CHECK: blr 52 53; CHECK-SAFE-LABEL: @foof 54; CHECK-SAFE: fsqrts 55; CHECK-SAFE: fdiv 56; CHECK-SAFE: blr 57} 58 59define <4 x float> @food(<4 x float> %a, <4 x double> %b) nounwind { 60entry: 61 %x = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %b) 62 %y = fptrunc <4 x double> %x to <4 x float> 63 %r = fdiv <4 x float> %a, %y 64 ret <4 x float> %r 65 66; CHECK-LABEL: @food 67; CHECK: qvfrsqrte 68; CHECK: qvfmul 69; FIXME: We're currently loading two constants here (1.5 and -1.5), and using 70; an qvfmadd instead of a qvfnmsub 71; CHECK: qvfmadd 72; CHECK: qvfmadd 73; CHECK: qvfmul 74; CHECK: qvfmul 75; CHECK: qvfmadd 76; CHECK: qvfmul 77; CHECK: qvfrsp 78; CHECK: qvfmuls 79; CHECK: blr 80 81; CHECK-SAFE-LABEL: @food 82; CHECK-SAFE: fsqrt 83; CHECK-SAFE: fdivs 84; CHECK-SAFE: blr 85} 86 87define <4 x float> @goo(<4 x float> %a, <4 x float> %b) nounwind { 88entry: 89 %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b) 90 %r = fdiv <4 x float> %a, %x 91 ret <4 x float> %r 92 93; CHECK-LABEL: @goo 94; CHECK: qvfrsqrtes 95; CHECK: qvfmuls 96; FIXME: We're currently loading two constants here (1.5 and -1.5), and using 97; an qvfmadd instead of a qvfnmsubs 98; CHECK: qvfmadds 99; CHECK: qvfmadds 100; CHECK: qvfmuls 101; CHECK: qvfmuls 102; CHECK: blr 103 104; CHECK-SAFE-LABEL: @goo 105; CHECK-SAFE: fsqrts 106; CHECK-SAFE: fdivs 107; CHECK-SAFE: blr 108} 109 110define <4 x double> @foo2(<4 x double> %a, <4 x double> %b) nounwind { 111entry: 112 %r = fdiv <4 x double> %a, %b 113 ret <4 x double> %r 114 115; CHECK-LABEL: @foo2 116; CHECK: qvfre 117; CHECK: qvfnmsub 118; CHECK: qvfmadd 119; CHECK: qvfnmsub 120; CHECK: qvfmadd 121; CHECK: qvfmul 122; CHECK: blr 123 124; CHECK-SAFE-LABEL: @foo2 125; CHECK-SAFE: fdiv 126; CHECK-SAFE: blr 127} 128 129define <4 x float> @goo2(<4 x float> %a, <4 x float> %b) nounwind { 130entry: 131 %r = fdiv <4 x float> %a, %b 132 ret <4 x float> %r 133 134; CHECK-LABEL: @goo2 135; CHECK: qvfres 136; CHECK: qvfnmsubs 137; CHECK: qvfmadds 138; CHECK: qvfmuls 139; CHECK: blr 140 141; CHECK-SAFE-LABEL: @goo2 142; CHECK-SAFE: fdivs 143; CHECK-SAFE: blr 144} 145 146define <4 x double> @foo3(<4 x double> %a) nounwind { 147entry: 148 %r = call <4 x double> @llvm.sqrt.v4f64(<4 x double> %a) 149 ret <4 x double> %r 150 151; CHECK-LABEL: @foo3 152; CHECK: qvfrsqrte 153; CHECK: qvfmul 154; FIXME: We're currently loading two constants here (1.5 and -1.5), and using 155; an qvfmadd instead of a qvfnmsub 156; CHECK-DAG: qvfmadd 157; CHECK-DAG: qvfcmpeq 158; CHECK-DAG: qvfmadd 159; CHECK-DAG: qvfmul 160; CHECK-DAG: qvfmul 161; CHECK-DAG: qvfmadd 162; CHECK-DAG: qvfmul 163; CHECK-DAG: qvfmul 164; CHECK: qvfsel 165; CHECK: blr 166 167; CHECK-SAFE-LABEL: @foo3 168; CHECK-SAFE: fsqrt 169; CHECK-SAFE: blr 170} 171 172define <4 x float> @goo3(<4 x float> %a) nounwind { 173entry: 174 %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a) 175 ret <4 x float> %r 176 177; CHECK-LABEL: @goo3 178; CHECK: qvfrsqrtes 179; CHECK: qvfmuls 180; FIXME: We're currently loading two constants here (1.5 and -1.5), and using 181; an qvfmadds instead of a qvfnmsubs 182; CHECK-DAG: qvfmadds 183; CHECK-DAG: qvfcmpeq 184; CHECK-DAG: qvfmadds 185; CHECK-DAG: qvfmuls 186; CHECK-DAG: qvfmuls 187; CHECK: qvfsel 188; CHECK: blr 189 190; CHECK-SAFE-LABEL: @goo3 191; CHECK-SAFE: fsqrts 192; CHECK-SAFE: blr 193} 194 195