Commit 666ee849 authored by Kai Luo's avatar Kai Luo
Browse files

[PowerPC] Fix shift amount of xxsldwi when performing vector int_to_double

POC
```
// main.c
#include <stdio.h>
#include <altivec.h>
extern vector double foo(vector int s);
int main() {
  vector int s = {0, 1, 0, 4};
  vector double vd;
  vd = foo(s);
  printf("%lf %lf\n", vd[0], vd[1]);
  return 0;
}
// poc.c
vector double foo(vector int s) {
  int x1 = s[1];
  int x3 = s[3];
  double d1 = x1;
  double d3 = x3;
  vector double x = { d1, d3 };
  return x;
}
```
Compiled with `poc.c main.c -mcpu=pwr8 -O3` on BE machine.
Current clang gives
```
4.000000 1.000000
```
while xlc gives
```
1.000000 4.000000
```
Xlc's output should be correct.

Reviewed By: shchenz, #powerpc

Differential Revision: https://reviews.llvm.org/D107428
parent ab737d53
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2962,11 +2962,11 @@ def : Pat<(v2i64 (fp_to_uint
def : Pat<WToDPExtractConv.BV02S,
          (v2f64 (XVCVSXWDP $A))>;
def : Pat<WToDPExtractConv.BV13S,
          (v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 3)))>;
          (v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 1)))>;
def : Pat<WToDPExtractConv.BV02U,
          (v2f64 (XVCVUXWDP $A))>;
def : Pat<WToDPExtractConv.BV13U,
          (v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 3)))>;
          (v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 1)))>;
def : Pat<(v2f64 (insertelt v2f64:$A, f64:$B, 0)),
          (v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $B, sub_64), $A, 1))>;
def : Pat<(v2f64 (insertelt v2f64:$A, f64:$B, 1)),
+4 −4
Original line number Diff line number Diff line
@@ -6160,7 +6160,7 @@ entry:
define dso_local <2 x double> @sint_to_fp_widen13(<4 x i32> %a) {
; P9BE-LABEL: sint_to_fp_widen13:
; P9BE:       # %bb.0: # %entry
; P9BE-NEXT:    xxsldwi vs0, v2, v2, 3
; P9BE-NEXT:    xxsldwi vs0, v2, v2, 1
; P9BE-NEXT:    xvcvsxwdp v2, vs0
; P9BE-NEXT:    blr
;
@@ -6171,7 +6171,7 @@ define dso_local <2 x double> @sint_to_fp_widen13(<4 x i32> %a) {
;
; P8BE-LABEL: sint_to_fp_widen13:
; P8BE:       # %bb.0: # %entry
; P8BE-NEXT:    xxsldwi vs0, v2, v2, 3
; P8BE-NEXT:    xxsldwi vs0, v2, v2, 1
; P8BE-NEXT:    xvcvsxwdp v2, vs0
; P8BE-NEXT:    blr
;
@@ -6224,7 +6224,7 @@ entry:
define dso_local <2 x double> @uint_to_fp_widen13(<4 x i32> %a) {
; P9BE-LABEL: uint_to_fp_widen13:
; P9BE:       # %bb.0: # %entry
; P9BE-NEXT:    xxsldwi vs0, v2, v2, 3
; P9BE-NEXT:    xxsldwi vs0, v2, v2, 1
; P9BE-NEXT:    xvcvuxwdp v2, vs0
; P9BE-NEXT:    blr
;
@@ -6235,7 +6235,7 @@ define dso_local <2 x double> @uint_to_fp_widen13(<4 x i32> %a) {
;
; P8BE-LABEL: uint_to_fp_widen13:
; P8BE:       # %bb.0: # %entry
; P8BE-NEXT:    xxsldwi vs0, v2, v2, 3
; P8BE-NEXT:    xxsldwi vs0, v2, v2, 1
; P8BE-NEXT:    xvcvuxwdp v2, vs0
; P8BE-NEXT:    blr
;
+2 −2
Original line number Diff line number Diff line
@@ -12,7 +12,7 @@ define <2 x double> @foo(<4 x i32> %s) {
;
; CHECK-BE-LABEL: foo:
; CHECK-BE:       # %bb.0: # %entry
; CHECK-BE-NEXT:    xxsldwi 0, 34, 34, 3
; CHECK-BE-NEXT:    xxsldwi 0, 34, 34, 1
; CHECK-BE-NEXT:    xvcvsxwdp 34, 0
; CHECK-BE-NEXT:    blr
entry:
@@ -29,7 +29,7 @@ define <2 x double> @bar(<4 x i32> %s) {
;
; CHECK-BE-LABEL: bar:
; CHECK-BE:       # %bb.0: # %entry
; CHECK-BE-NEXT:    xxsldwi 0, 34, 34, 3
; CHECK-BE-NEXT:    xxsldwi 0, 34, 34, 1
; CHECK-BE-NEXT:    xvcvuxwdp 34, 0
; CHECK-BE-NEXT:    blr
entry: