1; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu \ 2; RUN: -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unknown-linux-gnu \ 4; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE 5define double @test1(<2 x i64> %a) { 6entry: 7; CHECK-LABEL: test1 8; CHECK: xxswapd [[SW:[0-9]+]], 34 9; CHECK: xscvsxddp 1, [[SW]] 10; CHECK-BE-LABEL: test1 11; CHECK-BE: xscvsxddp 1, 34 12 %0 = extractelement <2 x i64> %a, i32 0 13 %1 = sitofp i64 %0 to double 14 ret double %1 15} 16 17define double @test2(<2 x i64> %a) { 18entry: 19; CHECK-LABEL: test2 20; CHECK: xscvsxddp 1, 34 21; CHECK-BE-LABEL: test2 22; CHECK-BE: xxswapd [[SW:[0-9]+]], 34 23; CHECK-BE: xscvsxddp 1, [[SW]] 24 %0 = extractelement <2 x i64> %a, i32 1 25 %1 = sitofp i64 %0 to double 26 ret double %1 27} 28 29define float @test1f(<2 x i64> %a) { 30entry: 31; CHECK-LABEL: test1f 32; CHECK: xxswapd [[SW:[0-9]+]], 34 33; CHECK: xscvsxdsp 1, [[SW]] 34; CHECK-BE-LABEL: test1f 35; CHECK-BE: xscvsxdsp 1, 34 36 %0 = extractelement <2 x i64> %a, i32 0 37 %1 = sitofp i64 %0 to float 38 ret float %1 39} 40 41define float @test2f(<2 x i64> %a) { 42entry: 43; CHECK-LABEL: test2f 44; CHECK: xscvsxdsp 1, 34 45; CHECK-BE-LABEL: test2f 46; CHECK-BE: xxswapd [[SW:[0-9]+]], 34 47; CHECK-BE: xscvsxdsp 1, [[SW]] 48 %0 = extractelement <2 x i64> %a, i32 1 49 %1 = sitofp i64 %0 to float 50 ret float %1 51} 52 53define double @test1u(<2 x i64> %a) { 54entry: 55; CHECK-LABEL: test1u 56; CHECK: xxswapd [[SW:[0-9]+]], 34 57; CHECK: xscvuxddp 1, [[SW]] 58; CHECK-BE-LABEL: test1u 59; CHECK-BE: xscvuxddp 1, 34 60 %0 = extractelement <2 x i64> %a, i32 0 61 %1 = uitofp i64 %0 to double 62 ret double %1 63} 64 65define double @test2u(<2 x i64> %a) { 66entry: 67; CHECK-LABEL: test2u 68; CHECK: xscvuxddp 1, 34 69; CHECK-BE-LABEL: test2u 70; CHECK-BE: xxswapd [[SW:[0-9]+]], 34 71; CHECK-BE: xscvuxddp 1, [[SW]] 72 %0 = extractelement <2 x i64> %a, i32 1 73 %1 = uitofp i64 %0 to double 74 ret double %1 75} 76 77define float @test1fu(<2 x i64> %a) { 78entry: 79; CHECK-LABEL: test1fu 80; CHECK: xxswapd [[SW:[0-9]+]], 34 81; CHECK: xscvuxdsp 1, [[SW]] 82; CHECK-BE-LABEL: test1fu 83; CHECK-BE: xscvuxdsp 1, 34 84 %0 = extractelement <2 x i64> %a, i32 0 85 %1 = uitofp i64 %0 to float 86 ret float %1 87} 88 89define float @test2fu(<2 x i64> %a) { 90entry: 91; CHECK-LABEL: test2fu 92; CHECK: xscvuxdsp 1, 34 93; CHECK-BE-LABEL: test2fu 94; CHECK-BE: xxswapd [[SW:[0-9]+]], 34 95; CHECK-BE: xscvuxdsp 1, [[SW]] 96 %0 = extractelement <2 x i64> %a, i32 1 97 %1 = uitofp i64 %0 to float 98 ret float %1 99} 100 101define float @conv2fltTesti0(<4 x i32> %a) { 102entry: 103; CHECK-LABEL: conv2fltTesti0 104; CHECK: xxspltw [[SW:[0-9]+]], 34, 3 105; CHECK: xvcvsxwsp [[SW]], [[SW]] 106; CHECK: xscvspdpn 1, [[SW]] 107; CHECK-BE-LABEL: conv2fltTesti0 108; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0 109; CHECK-BE: xvcvsxwsp [[CP]], [[CP]] 110; CHECK-BE: xscvspdpn 1, [[CP]] 111 %vecext = extractelement <4 x i32> %a, i32 0 112 %conv = sitofp i32 %vecext to float 113 ret float %conv 114} 115 116define float @conv2fltTesti1(<4 x i32> %a) { 117entry: 118; CHECK-LABEL: conv2fltTesti1 119; CHECK: xxspltw [[SW:[0-9]+]], 34, 2 120; CHECK: xvcvsxwsp [[SW]], [[SW]] 121; CHECK: xscvspdpn 1, [[SW]] 122; CHECK-BE-LABEL: conv2fltTesti1 123; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1 124; CHECK-BE: xvcvsxwsp [[CP]], [[CP]] 125; CHECK-BE: xscvspdpn 1, [[CP]] 126 %vecext = extractelement <4 x i32> %a, i32 1 127 %conv = sitofp i32 %vecext to float 128 ret float %conv 129} 130 131define float @conv2fltTesti2(<4 x i32> %a) { 132entry: 133; CHECK-LABEL: conv2fltTesti2 134; CHECK: xxspltw [[SW:[0-9]+]], 34, 1 135; CHECK: xvcvsxwsp [[SW]], [[SW]] 136; CHECK: xscvspdpn 1, [[SW]] 137; CHECK-BE-LABEL: conv2fltTesti2 138; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2 139; CHECK-BE: xvcvsxwsp [[CP]], [[CP]] 140; CHECK-BE: xscvspdpn 1, [[CP]] 141 %vecext = extractelement <4 x i32> %a, i32 2 142 %conv = sitofp i32 %vecext to float 143 ret float %conv 144} 145 146define float @conv2fltTesti3(<4 x i32> %a) { 147entry: 148; CHECK-LABEL: conv2fltTesti3 149; CHECK: xxspltw [[SW:[0-9]+]], 34, 0 150; CHECK: xvcvsxwsp [[SW]], [[SW]] 151; CHECK: xscvspdpn 1, [[SW]] 152; CHECK-BE-LABEL: conv2fltTesti3 153; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3 154; CHECK-BE: xvcvsxwsp [[CP]], [[CP]] 155; CHECK-BE: xscvspdpn 1, [[CP]] 156 %vecext = extractelement <4 x i32> %a, i32 3 157 %conv = sitofp i32 %vecext to float 158 ret float %conv 159} 160 161; verify we don't crash for variable elem extract 162define float @conv2fltTestiVar(<4 x i32> %a, i32 zeroext %elem) { 163entry: 164 %vecext = extractelement <4 x i32> %a, i32 %elem 165 %conv = sitofp i32 %vecext to float 166 ret float %conv 167} 168 169define double @conv2dblTesti0(<4 x i32> %a) { 170entry: 171; CHECK-LABEL: conv2dblTesti0 172; CHECK: xxspltw [[SW:[0-9]+]], 34, 3 173; CHECK: xvcvsxwdp 1, [[SW]] 174; CHECK-BE-LABEL: conv2dblTesti0 175; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0 176; CHECK-BE: xvcvsxwdp 1, [[CP]] 177 %vecext = extractelement <4 x i32> %a, i32 0 178 %conv = sitofp i32 %vecext to double 179 ret double %conv 180} 181 182define double @conv2dblTesti1(<4 x i32> %a) { 183entry: 184; CHECK-LABEL: conv2dblTesti1 185; CHECK: xxspltw [[SW:[0-9]+]], 34, 2 186; CHECK: xvcvsxwdp 1, [[SW]] 187; CHECK-BE-LABEL: conv2dblTesti1 188; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1 189; CHECK-BE: xvcvsxwdp 1, [[CP]] 190 %vecext = extractelement <4 x i32> %a, i32 1 191 %conv = sitofp i32 %vecext to double 192 ret double %conv 193} 194 195define double @conv2dblTesti2(<4 x i32> %a) { 196entry: 197; CHECK-LABEL: conv2dblTesti2 198; CHECK: xxspltw [[SW:[0-9]+]], 34, 1 199; CHECK: xvcvsxwdp 1, [[SW]] 200; CHECK-BE-LABEL: conv2dblTesti2 201; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2 202; CHECK-BE: xvcvsxwdp 1, [[CP]] 203 %vecext = extractelement <4 x i32> %a, i32 2 204 %conv = sitofp i32 %vecext to double 205 ret double %conv 206} 207 208define double @conv2dblTesti3(<4 x i32> %a) { 209entry: 210; CHECK-LABEL: conv2dblTesti3 211; CHECK: xxspltw [[SW:[0-9]+]], 34, 0 212; CHECK: xvcvsxwdp 1, [[SW]] 213; CHECK-BE-LABEL: conv2dblTesti3 214; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3 215; CHECK-BE: xvcvsxwdp 1, [[CP]] 216 %vecext = extractelement <4 x i32> %a, i32 3 217 %conv = sitofp i32 %vecext to double 218 ret double %conv 219} 220 221; verify we don't crash for variable elem extract 222define double @conv2dblTestiVar(<4 x i32> %a, i32 zeroext %elem) { 223entry: 224 %vecext = extractelement <4 x i32> %a, i32 %elem 225 %conv = sitofp i32 %vecext to double 226 ret double %conv 227} 228