|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
1 | 2 | ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck %s
|
2 | 3 | target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32"
|
3 | 4 | ; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=+vsx | FileCheck -check-prefix=CHECK-VSX %s
|
4 | 5 | target datalayout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f128:64:128-n32"
|
5 | 6 |
|
6 | 7 | define void @foo1(i16* %p, i16* %r) nounwind {
|
| 8 | +; CHECK-LABEL: foo1: |
| 9 | +; CHECK: # %bb.0: # %entry |
| 10 | +; CHECK-NEXT: lhz 3, 0(3) |
| 11 | +; CHECK-NEXT: sth 3, 0(4) |
| 12 | +; CHECK-NEXT: blr |
| 13 | +; |
| 14 | +; CHECK-VSX-LABEL: foo1: |
| 15 | +; CHECK-VSX: # %bb.0: # %entry |
| 16 | +; CHECK-VSX-NEXT: lhz 3, 0(3) |
| 17 | +; CHECK-VSX-NEXT: sth 3, 0(4) |
| 18 | +; CHECK-VSX-NEXT: blr |
7 | 19 | entry:
|
8 | 20 | %v = load i16, i16* %p, align 1
|
9 | 21 | store i16 %v, i16* %r, align 1
|
10 | 22 | ret void
|
11 | 23 |
|
12 |
| -; CHECK: @foo1 |
13 |
| -; CHECK: lhz |
14 |
| -; CHECK: sth |
15 | 24 |
|
16 |
| -; CHECK-VSX: @foo1 |
17 |
| -; CHECK-VSX: lhz |
18 |
| -; CHECK-VSX: sth |
19 | 25 | }
|
20 | 26 |
|
21 | 27 | define void @foo2(i32* %p, i32* %r) nounwind {
|
| 28 | +; CHECK-LABEL: foo2: |
| 29 | +; CHECK: # %bb.0: # %entry |
| 30 | +; CHECK-NEXT: lwz 3, 0(3) |
| 31 | +; CHECK-NEXT: stw 3, 0(4) |
| 32 | +; CHECK-NEXT: blr |
| 33 | +; |
| 34 | +; CHECK-VSX-LABEL: foo2: |
| 35 | +; CHECK-VSX: # %bb.0: # %entry |
| 36 | +; CHECK-VSX-NEXT: lwz 3, 0(3) |
| 37 | +; CHECK-VSX-NEXT: stw 3, 0(4) |
| 38 | +; CHECK-VSX-NEXT: blr |
22 | 39 | entry:
|
23 | 40 | %v = load i32, i32* %p, align 1
|
24 | 41 | store i32 %v, i32* %r, align 1
|
25 | 42 | ret void
|
26 | 43 |
|
27 |
| -; CHECK: @foo2 |
28 |
| -; CHECK: lwz |
29 |
| -; CHECK: stw |
30 | 44 |
|
31 |
| -; CHECK-VSX: @foo2 |
32 |
| -; CHECK-VSX: lwz |
33 |
| -; CHECK-VSX: stw |
34 | 45 | }
|
35 | 46 |
|
36 | 47 | define void @foo3(i64* %p, i64* %r) nounwind {
|
| 48 | +; CHECK-LABEL: foo3: |
| 49 | +; CHECK: # %bb.0: # %entry |
| 50 | +; CHECK-NEXT: ldx 3, 0, 3 |
| 51 | +; CHECK-NEXT: stdx 3, 0, 4 |
| 52 | +; CHECK-NEXT: blr |
| 53 | +; |
| 54 | +; CHECK-VSX-LABEL: foo3: |
| 55 | +; CHECK-VSX: # %bb.0: # %entry |
| 56 | +; CHECK-VSX-NEXT: ldx 3, 0, 3 |
| 57 | +; CHECK-VSX-NEXT: stdx 3, 0, 4 |
| 58 | +; CHECK-VSX-NEXT: blr |
37 | 59 | entry:
|
38 | 60 | %v = load i64, i64* %p, align 1
|
39 | 61 | store i64 %v, i64* %r, align 1
|
40 | 62 | ret void
|
41 | 63 |
|
42 |
| -; CHECK: @foo3 |
43 |
| -; CHECK: ld |
44 |
| -; CHECK: std |
45 | 64 |
|
46 |
| -; CHECK-VSX: @foo3 |
47 |
| -; CHECK-VSX: ld |
48 |
| -; CHECK-VSX: std |
49 | 65 | }
|
50 | 66 |
|
51 | 67 | define void @foo4(float* %p, float* %r) nounwind {
|
| 68 | +; CHECK-LABEL: foo4: |
| 69 | +; CHECK: # %bb.0: # %entry |
| 70 | +; CHECK-NEXT: lfs 0, 0(3) |
| 71 | +; CHECK-NEXT: stfs 0, 0(4) |
| 72 | +; CHECK-NEXT: blr |
| 73 | +; |
| 74 | +; CHECK-VSX-LABEL: foo4: |
| 75 | +; CHECK-VSX: # %bb.0: # %entry |
| 76 | +; CHECK-VSX-NEXT: lfs 0, 0(3) |
| 77 | +; CHECK-VSX-NEXT: stfs 0, 0(4) |
| 78 | +; CHECK-VSX-NEXT: blr |
52 | 79 | entry:
|
53 | 80 | %v = load float, float* %p, align 1
|
54 | 81 | store float %v, float* %r, align 1
|
55 | 82 | ret void
|
56 | 83 |
|
57 |
| -; CHECK: @foo4 |
58 |
| -; CHECK: lfs |
59 |
| -; CHECK: stfs |
60 | 84 |
|
61 |
| -; CHECK-VSX: @foo4 |
62 |
| -; CHECK-VSX: lfs |
63 |
| -; CHECK-VSX: stfs |
64 | 85 | }
|
65 | 86 |
|
66 | 87 | define void @foo5(double* %p, double* %r) nounwind {
|
| 88 | +; CHECK-LABEL: foo5: |
| 89 | +; CHECK: # %bb.0: # %entry |
| 90 | +; CHECK-NEXT: lfd 0, 0(3) |
| 91 | +; CHECK-NEXT: stfd 0, 0(4) |
| 92 | +; CHECK-NEXT: blr |
| 93 | +; |
| 94 | +; CHECK-VSX-LABEL: foo5: |
| 95 | +; CHECK-VSX: # %bb.0: # %entry |
| 96 | +; CHECK-VSX-NEXT: lfdx 0, 0, 3 |
| 97 | +; CHECK-VSX-NEXT: stfdx 0, 0, 4 |
| 98 | +; CHECK-VSX-NEXT: blr |
67 | 99 | entry:
|
68 | 100 | %v = load double, double* %p, align 1
|
69 | 101 | store double %v, double* %r, align 1
|
70 | 102 | ret void
|
71 | 103 |
|
72 |
| -; CHECK: @foo5 |
73 |
| -; CHECK: lfd |
74 |
| -; CHECK: stfd |
75 | 104 |
|
76 |
| -; CHECK-VSX: @foo5 |
77 |
| -; CHECK-VSX: lfdx |
78 |
| -; CHECK-VSX: stfdx |
79 | 105 | }
|
80 | 106 |
|
81 | 107 | define void @foo6(<4 x float>* %p, <4 x float>* %r) nounwind {
|
82 |
| -entry: |
83 |
| - %v = load <4 x float>, <4 x float>* %p, align 1 |
84 |
| - store <4 x float> %v, <4 x float>* %r, align 1 |
85 |
| - ret void |
86 |
| - |
87 | 108 | ; These loads and stores are legalized into aligned loads and stores
|
88 | 109 | ; using aligned stack slots.
|
89 |
| -; CHECK: @foo6 |
90 |
| -; CHECK-DAG: ld |
91 |
| -; CHECK-DAG: ld |
92 |
| -; CHECK-DAG: std |
93 |
| -; CHECK: stdx |
94 |
| - |
| 110 | +; CHECK-LABEL: foo6: |
| 111 | +; CHECK: # %bb.0: # %entry |
| 112 | +; CHECK-NEXT: li 5, 15 |
| 113 | +; CHECK-NEXT: lvsl 3, 0, 3 |
| 114 | +; CHECK-NEXT: lvx 2, 3, 5 |
| 115 | +; CHECK-NEXT: lvx 4, 0, 3 |
| 116 | +; CHECK-NEXT: addi 3, 1, -16 |
| 117 | +; CHECK-NEXT: vperm 2, 4, 2, 3 |
| 118 | +; CHECK-NEXT: stvx 2, 0, 3 |
| 119 | +; CHECK-NEXT: ld 3, -8(1) |
| 120 | +; CHECK-NEXT: std 3, 8(4) |
| 121 | +; CHECK-NEXT: ld 3, -16(1) |
| 122 | +; CHECK-NEXT: stdx 3, 0, 4 |
| 123 | +; CHECK-NEXT: blr |
| 124 | +; |
| 125 | +; CHECK-VSX-LABEL: foo6: |
| 126 | +; CHECK-VSX: # %bb.0: # %entry |
| 127 | +; CHECK-VSX-NEXT: li 5, 15 |
| 128 | +; CHECK-VSX-NEXT: lvsl 3, 0, 3 |
| 129 | +; CHECK-VSX-NEXT: lvx 2, 3, 5 |
| 130 | +; CHECK-VSX-NEXT: lvx 4, 0, 3 |
| 131 | +; CHECK-VSX-NEXT: vperm 2, 4, 2, 3 |
| 132 | +; CHECK-VSX-NEXT: stxvw4x 34, 0, 4 |
| 133 | +; CHECK-VSX-NEXT: blr |
95 | 134 | ; For VSX on P7, unaligned loads and stores are preferable to aligned
|
96 | 135 | ; stack slots, but lvsl/vperm is better still. (On P8 lxvw4x is preferable.)
|
97 | 136 | ; Using unaligned stxvw4x is preferable on both machines.
|
98 |
| -; CHECK-VSX: @foo6 |
99 |
| -; CHECK-VSX-DAG: lvsl |
100 |
| -; CHECK-VSX-DAG: lvx |
101 |
| -; CHECK-VSX-DAG: lvx |
102 |
| -; CHECK-VSX: vperm |
103 |
| -; CHECK-VSX: stxvw4x |
| 137 | +entry: |
| 138 | + %v = load <4 x float>, <4 x float>* %p, align 1 |
| 139 | + store <4 x float> %v, <4 x float>* %r, align 1 |
| 140 | + ret void |
104 | 141 | }
|
105 | 142 |
|
0 commit comments