228 lines · plain
1; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-linux-gnu \2; RUN: -verify-machineinstrs < %s | FileCheck %s3; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unknown-linux-gnu \4; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK-BE5define double @test1(<2 x i64> %a) {6entry:7; CHECK-LABEL: test18; CHECK: xxswapd [[SW:[0-9]+]], 349; CHECK: xscvsxddp 1, [[SW]]10; CHECK-BE-LABEL: test111; CHECK-BE: xscvsxddp 1, 3412 %0 = extractelement <2 x i64> %a, i32 013 %1 = sitofp i64 %0 to double14 ret double %115}16 17define double @test2(<2 x i64> %a) {18entry:19; CHECK-LABEL: test220; CHECK: xscvsxddp 1, 3421; CHECK-BE-LABEL: test222; CHECK-BE: xxswapd [[SW:[0-9]+]], 3423; CHECK-BE: xscvsxddp 1, [[SW]]24 %0 = extractelement <2 x i64> %a, i32 125 %1 = sitofp i64 %0 to double26 ret double %127}28 29define float @test1f(<2 x i64> %a) {30entry:31; CHECK-LABEL: test1f32; CHECK: xxswapd [[SW:[0-9]+]], 3433; CHECK: xscvsxdsp 1, [[SW]]34; CHECK-BE-LABEL: test1f35; CHECK-BE: xscvsxdsp 1, 3436 %0 = extractelement <2 x i64> %a, i32 037 %1 = sitofp i64 %0 to float38 ret float %139}40 41define float @test2f(<2 x i64> %a) {42entry:43; CHECK-LABEL: test2f44; CHECK: xscvsxdsp 1, 3445; CHECK-BE-LABEL: test2f46; CHECK-BE: xxswapd [[SW:[0-9]+]], 3447; CHECK-BE: xscvsxdsp 1, [[SW]]48 %0 = extractelement <2 x i64> %a, i32 149 %1 = sitofp i64 %0 to float50 ret float %151}52 53define double @test1u(<2 x i64> %a) {54entry:55; CHECK-LABEL: test1u56; CHECK: xxswapd [[SW:[0-9]+]], 3457; CHECK: xscvuxddp 1, [[SW]]58; CHECK-BE-LABEL: test1u59; CHECK-BE: xscvuxddp 1, 3460 %0 = extractelement <2 x i64> %a, i32 061 %1 = uitofp i64 %0 to double62 ret double %163}64 65define double @test2u(<2 x i64> %a) {66entry:67; CHECK-LABEL: test2u68; CHECK: xscvuxddp 1, 3469; CHECK-BE-LABEL: test2u70; CHECK-BE: xxswapd [[SW:[0-9]+]], 3471; CHECK-BE: xscvuxddp 1, [[SW]]72 %0 = extractelement <2 x i64> %a, i32 173 %1 = uitofp i64 %0 to double74 ret double %175}76 77define float @test1fu(<2 x i64> %a) {78entry:79; CHECK-LABEL: test1fu80; CHECK: xxswapd [[SW:[0-9]+]], 3481; CHECK: xscvuxdsp 1, [[SW]]82; CHECK-BE-LABEL: test1fu83; CHECK-BE: xscvuxdsp 1, 3484 %0 = extractelement <2 x i64> %a, i32 085 %1 = uitofp i64 %0 to float86 ret float %187}88 89define float @test2fu(<2 x i64> %a) {90entry:91; CHECK-LABEL: test2fu92; CHECK: xscvuxdsp 1, 3493; CHECK-BE-LABEL: test2fu94; CHECK-BE: xxswapd [[SW:[0-9]+]], 3495; CHECK-BE: xscvuxdsp 1, [[SW]]96 %0 = extractelement <2 x i64> %a, i32 197 %1 = uitofp i64 %0 to float98 ret float %199}100 101define float @conv2fltTesti0(<4 x i32> %a) {102entry:103; CHECK-LABEL: conv2fltTesti0104; CHECK: xxspltw [[SW:[0-9]+]], 34, 3105; CHECK: xvcvsxwsp [[SW]], [[SW]]106; CHECK: xscvspdpn 1, [[SW]]107; CHECK-BE-LABEL: conv2fltTesti0108; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0109; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]110; CHECK-BE: xscvspdpn 1, [[CP]]111 %vecext = extractelement <4 x i32> %a, i32 0112 %conv = sitofp i32 %vecext to float113 ret float %conv114}115 116define float @conv2fltTesti1(<4 x i32> %a) {117entry:118; CHECK-LABEL: conv2fltTesti1119; CHECK: xxspltw [[SW:[0-9]+]], 34, 2120; CHECK: xvcvsxwsp [[SW]], [[SW]]121; CHECK: xscvspdpn 1, [[SW]]122; CHECK-BE-LABEL: conv2fltTesti1123; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1124; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]125; CHECK-BE: xscvspdpn 1, [[CP]]126 %vecext = extractelement <4 x i32> %a, i32 1127 %conv = sitofp i32 %vecext to float128 ret float %conv129}130 131define float @conv2fltTesti2(<4 x i32> %a) {132entry:133; CHECK-LABEL: conv2fltTesti2134; CHECK: xxspltw [[SW:[0-9]+]], 34, 1135; CHECK: xvcvsxwsp [[SW]], [[SW]]136; CHECK: xscvspdpn 1, [[SW]]137; CHECK-BE-LABEL: conv2fltTesti2138; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2139; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]140; CHECK-BE: xscvspdpn 1, [[CP]]141 %vecext = extractelement <4 x i32> %a, i32 2142 %conv = sitofp i32 %vecext to float143 ret float %conv144}145 146define float @conv2fltTesti3(<4 x i32> %a) {147entry:148; CHECK-LABEL: conv2fltTesti3149; CHECK: xxspltw [[SW:[0-9]+]], 34, 0150; CHECK: xvcvsxwsp [[SW]], [[SW]]151; CHECK: xscvspdpn 1, [[SW]]152; CHECK-BE-LABEL: conv2fltTesti3153; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3154; CHECK-BE: xvcvsxwsp [[CP]], [[CP]]155; CHECK-BE: xscvspdpn 1, [[CP]]156 %vecext = extractelement <4 x i32> %a, i32 3157 %conv = sitofp i32 %vecext to float158 ret float %conv159}160 161; verify we don't crash for variable elem extract162define float @conv2fltTestiVar(<4 x i32> %a, i32 zeroext %elem) {163entry:164 %vecext = extractelement <4 x i32> %a, i32 %elem165 %conv = sitofp i32 %vecext to float166 ret float %conv167}168 169define double @conv2dblTesti0(<4 x i32> %a) {170entry:171; CHECK-LABEL: conv2dblTesti0172; CHECK: xxspltw [[SW:[0-9]+]], 34, 3173; CHECK: xvcvsxwdp 1, [[SW]]174; CHECK-BE-LABEL: conv2dblTesti0175; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 0176; CHECK-BE: xvcvsxwdp 1, [[CP]]177 %vecext = extractelement <4 x i32> %a, i32 0178 %conv = sitofp i32 %vecext to double179 ret double %conv180}181 182define double @conv2dblTesti1(<4 x i32> %a) {183entry:184; CHECK-LABEL: conv2dblTesti1185; CHECK: xxspltw [[SW:[0-9]+]], 34, 2186; CHECK: xvcvsxwdp 1, [[SW]]187; CHECK-BE-LABEL: conv2dblTesti1188; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 1189; CHECK-BE: xvcvsxwdp 1, [[CP]]190 %vecext = extractelement <4 x i32> %a, i32 1191 %conv = sitofp i32 %vecext to double192 ret double %conv193}194 195define double @conv2dblTesti2(<4 x i32> %a) {196entry:197; CHECK-LABEL: conv2dblTesti2198; CHECK: xxspltw [[SW:[0-9]+]], 34, 1199; CHECK: xvcvsxwdp 1, [[SW]]200; CHECK-BE-LABEL: conv2dblTesti2201; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 2202; CHECK-BE: xvcvsxwdp 1, [[CP]]203 %vecext = extractelement <4 x i32> %a, i32 2204 %conv = sitofp i32 %vecext to double205 ret double %conv206}207 208define double @conv2dblTesti3(<4 x i32> %a) {209entry:210; CHECK-LABEL: conv2dblTesti3211; CHECK: xxspltw [[SW:[0-9]+]], 34, 0212; CHECK: xvcvsxwdp 1, [[SW]]213; CHECK-BE-LABEL: conv2dblTesti3214; CHECK-BE: xxspltw [[CP:[0-9]+]], 34, 3215; CHECK-BE: xvcvsxwdp 1, [[CP]]216 %vecext = extractelement <4 x i32> %a, i32 3217 %conv = sitofp i32 %vecext to double218 ret double %conv219}220 221; verify we don't crash for variable elem extract222define double @conv2dblTestiVar(<4 x i32> %a, i32 zeroext %elem) {223entry:224 %vecext = extractelement <4 x i32> %a, i32 %elem225 %conv = sitofp i32 %vecext to double226 ret double %conv227}228