| OLD | NEW |
| 1 ; This file checks that Subzero generates code in accordance with the | 1 ; This file checks that Subzero generates code in accordance with the |
| 2 ; calling convention for vectors. | 2 ; calling convention for vectors. |
| 3 | 3 |
| 4 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ | 4 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ |
| 5 ; RUN: | FileCheck %s | 5 ; RUN: -allow-externally-defined-symbols | FileCheck %s |
| 6 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 \ | 6 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 \ |
| 7 ; RUN: | FileCheck --check-prefix=OPTM1 %s | 7 ; RUN: -allow-externally-defined-symbols | FileCheck --check-prefix=OPTM1 %s |
| 8 | 8 |
| 9 ; The first five functions test that vectors are moved from their | 9 ; The first five functions test that vectors are moved from their |
| 10 ; correct argument location to xmm0. | 10 ; correct argument location to xmm0. |
| 11 | 11 |
| 12 define <4 x float> @test_returning_arg0(<4 x float> %arg0, <4 x float> %arg1, <4
x float> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5) { | 12 define internal <4 x float> @test_returning_arg0( |
| 13 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 14 <4 x float> %arg4, <4 x float> %arg5) { |
| 13 entry: | 15 entry: |
| 14 ret <4 x float> %arg0 | 16 ret <4 x float> %arg0 |
| 15 ; CHECK-LABEL: test_returning_arg0 | 17 ; CHECK-LABEL: test_returning_arg0 |
| 16 ; CHECK-NOT: mov | 18 ; CHECK-NOT: mov |
| 17 ; CHECK: ret | 19 ; CHECK: ret |
| 18 | 20 |
| 19 ; OPTM1-LABEL: test_returning_arg0 | 21 ; OPTM1-LABEL: test_returning_arg0 |
| 20 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 | 22 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 |
| 21 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 23 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 22 ; OPTM1: ret | 24 ; OPTM1: ret |
| 23 } | 25 } |
| 24 | 26 |
| 25 define <4 x float> @test_returning_arg1(<4 x float> %arg0, <4 x float> %arg1, <4
x float> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5) { | 27 define internal <4 x float> @test_returning_arg1( |
| 28 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 29 <4 x float> %arg4, <4 x float> %arg5) { |
| 26 entry: | 30 entry: |
| 27 ret <4 x float> %arg1 | 31 ret <4 x float> %arg1 |
| 28 ; CHECK-LABEL: test_returning_arg1 | 32 ; CHECK-LABEL: test_returning_arg1 |
| 29 ; CHECK: movups xmm0,xmm1 | 33 ; CHECK: movups xmm0,xmm1 |
| 30 ; CHECK: ret | 34 ; CHECK: ret |
| 31 | 35 |
| 32 ; OPTM1-LABEL: test_returning_arg1 | 36 ; OPTM1-LABEL: test_returning_arg1 |
| 33 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 | 37 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 |
| 34 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 38 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 35 ; OPTM1: ret | 39 ; OPTM1: ret |
| 36 } | 40 } |
| 37 | 41 |
| 38 define <4 x float> @test_returning_arg2(<4 x float> %arg0, <4 x float> %arg1, <4
x float> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5) { | 42 define internal <4 x float> @test_returning_arg2( |
| 43 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 44 <4 x float> %arg4, <4 x float> %arg5) { |
| 39 entry: | 45 entry: |
| 40 ret <4 x float> %arg2 | 46 ret <4 x float> %arg2 |
| 41 ; CHECK-LABEL: test_returning_arg2 | 47 ; CHECK-LABEL: test_returning_arg2 |
| 42 ; CHECK: movups xmm0,xmm2 | 48 ; CHECK: movups xmm0,xmm2 |
| 43 ; CHECK: ret | 49 ; CHECK: ret |
| 44 | 50 |
| 45 ; OPTM1-LABEL: test_returning_arg2 | 51 ; OPTM1-LABEL: test_returning_arg2 |
| 46 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 | 52 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 |
| 47 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 53 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 48 ; OPTM1: ret | 54 ; OPTM1: ret |
| 49 } | 55 } |
| 50 | 56 |
| 51 define <4 x float> @test_returning_arg3(<4 x float> %arg0, <4 x float> %arg1, <4
x float> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5) { | 57 define internal <4 x float> @test_returning_arg3( |
| 58 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 59 <4 x float> %arg4, <4 x float> %arg5) { |
| 52 entry: | 60 entry: |
| 53 ret <4 x float> %arg3 | 61 ret <4 x float> %arg3 |
| 54 ; CHECK-LABEL: test_returning_arg3 | 62 ; CHECK-LABEL: test_returning_arg3 |
| 55 ; CHECK: movups xmm0,xmm3 | 63 ; CHECK: movups xmm0,xmm3 |
| 56 ; CHECK: ret | 64 ; CHECK: ret |
| 57 | 65 |
| 58 ; OPTM1-LABEL: test_returning_arg3 | 66 ; OPTM1-LABEL: test_returning_arg3 |
| 59 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 | 67 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 |
| 60 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 68 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 61 ; OPTM1: ret | 69 ; OPTM1: ret |
| 62 } | 70 } |
| 63 | 71 |
| 64 define <4 x float> @test_returning_arg4(<4 x float> %arg0, <4 x float> %arg1, <4
x float> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5) { | 72 define internal <4 x float> @test_returning_arg4( |
| 73 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 74 <4 x float> %arg4, <4 x float> %arg5) { |
| 65 entry: | 75 entry: |
| 66 ret <4 x float> %arg4 | 76 ret <4 x float> %arg4 |
| 67 ; CHECK-LABEL: test_returning_arg4 | 77 ; CHECK-LABEL: test_returning_arg4 |
| 68 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x4] | 78 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x4] |
| 69 ; CHECK: ret | 79 ; CHECK: ret |
| 70 | 80 |
| 71 ; OPTM1-LABEL: test_returning_arg4 | 81 ; OPTM1-LABEL: test_returning_arg4 |
| 72 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 82 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
| 73 ; OPTM1: ret | 83 ; OPTM1: ret |
| 74 } | 84 } |
| 75 | 85 |
| 76 ; The next five functions check that xmm arguments are handled | 86 ; The next five functions check that xmm arguments are handled |
| 77 ; correctly when interspersed with stack arguments in the argument | 87 ; correctly when interspersed with stack arguments in the argument |
| 78 ; list. | 88 ; list. |
| 79 | 89 |
| 80 define <4 x float> @test_returning_interspersed_arg0(i32 %i32arg0, double %doubl
earg0, <4 x float> %arg0, <4 x float> %arg1, i32 %i32arg1, <4 x float> %arg2, do
uble %doublearg1, <4 x float> %arg3, i32 %i32arg2, double %doublearg2, float %fl
oatarg0, <4 x float> %arg4, <4 x float> %arg5, float %floatarg1) { | 90 define internal <4 x float> @test_returning_interspersed_arg0( |
| 91 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
| 92 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
| 93 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
| 94 <4 x float> %arg5, float %floatarg1) { |
| 81 entry: | 95 entry: |
| 82 ret <4 x float> %arg0 | 96 ret <4 x float> %arg0 |
| 83 ; CHECK-LABEL: test_returning_interspersed_arg0 | 97 ; CHECK-LABEL: test_returning_interspersed_arg0 |
| 84 ; CHECK-NOT: mov | 98 ; CHECK-NOT: mov |
| 85 ; CHECK: ret | 99 ; CHECK: ret |
| 86 | 100 |
| 87 ; OPTM1-LABEL: test_returning_interspersed_arg0 | 101 ; OPTM1-LABEL: test_returning_interspersed_arg0 |
| 88 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 | 102 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 |
| 89 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 103 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 90 ; OPTM1: ret | 104 ; OPTM1: ret |
| 91 } | 105 } |
| 92 | 106 |
| 93 define <4 x float> @test_returning_interspersed_arg1(i32 %i32arg0, double %doubl
earg0, <4 x float> %arg0, <4 x float> %arg1, i32 %i32arg1, <4 x float> %arg2, do
uble %doublearg1, <4 x float> %arg3, i32 %i32arg2, double %doublearg2, float %fl
oatarg0, <4 x float> %arg4, <4 x float> %arg5, float %floatarg1) { | 107 define internal <4 x float> @test_returning_interspersed_arg1( |
| 108 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
| 109 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
| 110 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
| 111 <4 x float> %arg5, float %floatarg1) { |
| 94 entry: | 112 entry: |
| 95 ret <4 x float> %arg1 | 113 ret <4 x float> %arg1 |
| 96 ; CHECK-LABEL: test_returning_interspersed_arg1 | 114 ; CHECK-LABEL: test_returning_interspersed_arg1 |
| 97 ; CHECK: movups xmm0,xmm1 | 115 ; CHECK: movups xmm0,xmm1 |
| 98 ; CHECK: ret | 116 ; CHECK: ret |
| 99 | 117 |
| 100 ; OPTM1-LABEL: test_returning_interspersed_arg1 | 118 ; OPTM1-LABEL: test_returning_interspersed_arg1 |
| 101 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 | 119 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 |
| 102 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 120 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 103 ; OPTM1: ret | 121 ; OPTM1: ret |
| 104 } | 122 } |
| 105 | 123 |
| 106 define <4 x float> @test_returning_interspersed_arg2(i32 %i32arg0, double %doubl
earg0, <4 x float> %arg0, <4 x float> %arg1, i32 %i32arg1, <4 x float> %arg2, do
uble %doublearg1, <4 x float> %arg3, i32 %i32arg2, double %doublearg2, float %fl
oatarg0, <4 x float> %arg4, <4 x float> %arg5, float %floatarg1) { | 124 define internal <4 x float> @test_returning_interspersed_arg2( |
| 125 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
| 126 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
| 127 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
| 128 <4 x float> %arg5, float %floatarg1) { |
| 107 entry: | 129 entry: |
| 108 ret <4 x float> %arg2 | 130 ret <4 x float> %arg2 |
| 109 ; CHECK-LABEL: test_returning_interspersed_arg2 | 131 ; CHECK-LABEL: test_returning_interspersed_arg2 |
| 110 ; CHECK: movups xmm0,xmm2 | 132 ; CHECK: movups xmm0,xmm2 |
| 111 ; CHECK: ret | 133 ; CHECK: ret |
| 112 | 134 |
| 113 ; OPTM1-LABEL: test_returning_interspersed_arg2 | 135 ; OPTM1-LABEL: test_returning_interspersed_arg2 |
| 114 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 | 136 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 |
| 115 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 137 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 116 ; OPTM1: ret | 138 ; OPTM1: ret |
| 117 } | 139 } |
| 118 | 140 |
| 119 define <4 x float> @test_returning_interspersed_arg3(i32 %i32arg0, double %doubl
earg0, <4 x float> %arg0, <4 x float> %arg1, i32 %i32arg1, <4 x float> %arg2, do
uble %doublearg1, <4 x float> %arg3, i32 %i32arg2, double %doublearg2, float %fl
oatarg0, <4 x float> %arg4, <4 x float> %arg5, float %floatarg1) { | 141 define internal <4 x float> @test_returning_interspersed_arg3( |
| 142 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
| 143 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
| 144 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
| 145 <4 x float> %arg5, float %floatarg1) { |
| 120 entry: | 146 entry: |
| 121 ret <4 x float> %arg3 | 147 ret <4 x float> %arg3 |
| 122 ; CHECK-LABEL: test_returning_interspersed_arg3 | 148 ; CHECK-LABEL: test_returning_interspersed_arg3 |
| 123 ; CHECK: movups xmm0,xmm3 | 149 ; CHECK: movups xmm0,xmm3 |
| 124 ; CHECK: ret | 150 ; CHECK: ret |
| 125 | 151 |
| 126 ; OPTM1-LABEL: test_returning_interspersed_arg3 | 152 ; OPTM1-LABEL: test_returning_interspersed_arg3 |
| 127 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 | 153 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 |
| 128 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 154 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
| 129 ; OPTM1: ret | 155 ; OPTM1: ret |
| 130 } | 156 } |
| 131 | 157 |
| 132 define <4 x float> @test_returning_interspersed_arg4(i32 %i32arg0, double %doubl
earg0, <4 x float> %arg0, <4 x float> %arg1, i32 %i32arg1, <4 x float> %arg2, do
uble %doublearg1, <4 x float> %arg3, i32 %i32arg2, double %doublearg2, float %fl
oatarg0, <4 x float> %arg4, <4 x float> %arg5, float %floatarg1) { | 158 define internal <4 x float> @test_returning_interspersed_arg4( |
| 159 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
| 160 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
| 161 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
| 162 <4 x float> %arg5, float %floatarg1) { |
| 133 entry: | 163 entry: |
| 134 ret <4 x float> %arg4 | 164 ret <4 x float> %arg4 |
| 135 ; CHECK-LABEL: test_returning_interspersed_arg4 | 165 ; CHECK-LABEL: test_returning_interspersed_arg4 |
| 136 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x34] | 166 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x34] |
| 137 ; CHECK: ret | 167 ; CHECK: ret |
| 138 | 168 |
| 139 ; OPTM1-LABEL: test_returning_interspersed_arg4 | 169 ; OPTM1-LABEL: test_returning_interspersed_arg4 |
| 140 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 170 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
| 141 ; OPTM1: ret | 171 ; OPTM1: ret |
| 142 } | 172 } |
| 143 | 173 |
| 144 ; Test that vectors are passed correctly as arguments to a function. | 174 ; Test that vectors are passed correctly as arguments to a function. |
| 145 | 175 |
| 146 declare void @VectorArgs(<4 x float>, <4 x float>, <4 x float>, <4 x float>, <4
x float>, <4 x float>) | 176 declare void @VectorArgs(<4 x float>, <4 x float>, <4 x float>, <4 x float>, |
| 177 <4 x float>, <4 x float>) |
| 147 | 178 |
| 148 declare void @killXmmRegisters() | 179 declare void @killXmmRegisters() |
| 149 | 180 |
| 150 define void @test_passing_vectors(<4 x float> %arg0, <4 x float> %arg1, <4 x flo
at> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5, <4 x float>
%arg6, <4 x float> %arg7, <4 x float> %arg8, <4 x float> %arg9) { | 181 define internal void @test_passing_vectors( |
| 182 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 183 <4 x float> %arg4, <4 x float> %arg5, <4 x float> %arg6, <4 x float> %arg7, |
| 184 <4 x float> %arg8, <4 x float> %arg9) { |
| 151 entry: | 185 entry: |
| 152 ; Kills XMM registers so that no in-arg lowering code interferes | 186 ; Kills XMM registers so that no in-arg lowering code interferes |
| 153 ; with the test. | 187 ; with the test. |
| 154 call void @killXmmRegisters() | 188 call void @killXmmRegisters() |
| 155 call void @VectorArgs(<4 x float> %arg9, <4 x float> %arg8, <4 x float> %arg7,
<4 x float> %arg6, <4 x float> %arg5, <4 x float> %arg4) | 189 call void @VectorArgs(<4 x float> %arg9, <4 x float> %arg8, <4 x float> %arg7, |
| 190 <4 x float> %arg6, <4 x float> %arg5, <4 x float> %arg4) |
| 156 ret void | 191 ret void |
| 157 ; CHECK-LABEL: test_passing_vectors | 192 ; CHECK-LABEL: test_passing_vectors |
| 158 ; CHECK: sub esp,0x20 | 193 ; CHECK: sub esp,0x20 |
| 159 ; CHECK: movups [[ARG5:.*]],XMMWORD PTR [esp+0x40] | 194 ; CHECK: movups [[ARG5:.*]],XMMWORD PTR [esp+0x40] |
| 160 ; CHECK: movups XMMWORD PTR [esp],[[ARG5]] | 195 ; CHECK: movups XMMWORD PTR [esp],[[ARG5]] |
| 161 ; CHECK: movups [[ARG6:.*]],XMMWORD PTR [esp+0x30] | 196 ; CHECK: movups [[ARG6:.*]],XMMWORD PTR [esp+0x30] |
| 162 ; CHECK: movups XMMWORD PTR [esp+0x10],[[ARG6]] | 197 ; CHECK: movups XMMWORD PTR [esp+0x10],[[ARG6]] |
| 163 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x80] | 198 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x80] |
| 164 ; CHECK: movups xmm1,XMMWORD PTR [esp+0x70] | 199 ; CHECK: movups xmm1,XMMWORD PTR [esp+0x70] |
| 165 ; CHECK: movups xmm2,XMMWORD PTR [esp+0x60] | 200 ; CHECK: movups xmm2,XMMWORD PTR [esp+0x60] |
| 166 ; CHECK: movups xmm3,XMMWORD PTR [esp+0x50] | 201 ; CHECK: movups xmm3,XMMWORD PTR [esp+0x50] |
| 167 ; CHECK: call {{.*}} R_{{.*}} VectorArgs | 202 ; CHECK: call {{.*}} R_{{.*}} VectorArgs |
| 168 ; CHECK-NEXT: add esp,0x20 | 203 ; CHECK-NEXT: add esp,0x20 |
| 169 | 204 |
| 170 ; OPTM1-LABEL: test_passing_vectors | 205 ; OPTM1-LABEL: test_passing_vectors |
| 171 ; OPTM1: sub esp,0x20 | 206 ; OPTM1: sub esp,0x20 |
| 172 ; OPTM1: movups [[ARG5:.*]],XMMWORD PTR {{.*}} | 207 ; OPTM1: movups [[ARG5:.*]],XMMWORD PTR {{.*}} |
| 173 ; OPTM1: movups XMMWORD PTR [esp],[[ARG5]] | 208 ; OPTM1: movups XMMWORD PTR [esp],[[ARG5]] |
| 174 ; OPTM1: movups [[ARG6:.*]],XMMWORD PTR {{.*}} | 209 ; OPTM1: movups [[ARG6:.*]],XMMWORD PTR {{.*}} |
| 175 ; OPTM1: movups XMMWORD PTR [esp+0x10],[[ARG6]] | 210 ; OPTM1: movups XMMWORD PTR [esp+0x10],[[ARG6]] |
| 176 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 211 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
| 177 ; OPTM1: movups xmm1,XMMWORD PTR {{.*}} | 212 ; OPTM1: movups xmm1,XMMWORD PTR {{.*}} |
| 178 ; OPTM1: movups xmm2,XMMWORD PTR {{.*}} | 213 ; OPTM1: movups xmm2,XMMWORD PTR {{.*}} |
| 179 ; OPTM1: movups xmm3,XMMWORD PTR {{.*}} | 214 ; OPTM1: movups xmm3,XMMWORD PTR {{.*}} |
| 180 ; OPTM1: call {{.*}} R_{{.*}} VectorArgs | 215 ; OPTM1: call {{.*}} R_{{.*}} VectorArgs |
| 181 ; OPTM1-NEXT: add esp,0x20 | 216 ; OPTM1-NEXT: add esp,0x20 |
| 182 } | 217 } |
| 183 | 218 |
| 184 declare void @InterspersedVectorArgs(<4 x float>, i64, <4 x float>, i64, <4 x fl
oat>, float, <4 x float>, double, <4 x float>, i32, <4 x float>) | 219 declare void @InterspersedVectorArgs( |
| 220 <4 x float>, i64, <4 x float>, i64, <4 x float>, float, <4 x float>, |
| 221 double, <4 x float>, i32, <4 x float>) |
| 185 | 222 |
| 186 define void @test_passing_vectors_interspersed(<4 x float> %arg0, <4 x float> %a
rg1, <4 x float> %arg2, <4 x float> %arg3, <4 x float> %arg4, <4 x float> %arg5,
<4 x float> %arg6, <4 x float> %arg7, <4 x float> %arg8, <4 x float> %arg9) { | 223 define internal void @test_passing_vectors_interspersed( |
| 224 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
| 225 <4 x float> %arg4, <4 x float> %arg5, <4 x float> %arg6, <4 x float> %arg7, |
| 226 <4 x float> %arg8, <4 x float> %arg9) { |
| 187 entry: | 227 entry: |
| 188 ; Kills XMM registers so that no in-arg lowering code interferes | 228 ; Kills XMM registers so that no in-arg lowering code interferes |
| 189 ; with the test. | 229 ; with the test. |
| 190 call void @killXmmRegisters() | 230 call void @killXmmRegisters() |
| 191 call void @InterspersedVectorArgs(<4 x float> %arg9, i64 0, <4 x float> %arg8,
i64 1, <4 x float> %arg7, float 2.000000e+00, <4 x float> %arg6, double 3.00000
0e+00, <4 x float> %arg5, i32 4, <4 x float> %arg4) | 231 call void @InterspersedVectorArgs(<4 x float> %arg9, i64 0, <4 x float> %arg8, |
| 232 i64 1, <4 x float> %arg7, float 2.000000e+00
, |
| 233 <4 x float> %arg6, double 3.000000e+00, |
| 234 <4 x float> %arg5, i32 4, <4 x float> %arg4) |
| 192 ret void | 235 ret void |
| 193 ; CHECK-LABEL: test_passing_vectors_interspersed | 236 ; CHECK-LABEL: test_passing_vectors_interspersed |
| 194 ; CHECK: sub esp,0x50 | 237 ; CHECK: sub esp,0x50 |
| 195 ; CHECK: movups [[ARG9:.*]],XMMWORD PTR [esp+0x70] | 238 ; CHECK: movups [[ARG9:.*]],XMMWORD PTR [esp+0x70] |
| 196 ; CHECK: movups XMMWORD PTR [esp+0x20],[[ARG9]] | 239 ; CHECK: movups XMMWORD PTR [esp+0x20],[[ARG9]] |
| 197 ; CHECK: movups [[ARG11:.*]],XMMWORD PTR [esp+0x60] | 240 ; CHECK: movups [[ARG11:.*]],XMMWORD PTR [esp+0x60] |
| 198 ; CHECK: movups XMMWORD PTR [esp+0x40],[[ARG11]] | 241 ; CHECK: movups XMMWORD PTR [esp+0x40],[[ARG11]] |
| 199 ; CHECK: movups xmm0,XMMWORD PTR [esp+0xb0] | 242 ; CHECK: movups xmm0,XMMWORD PTR [esp+0xb0] |
| 200 ; CHECK: movups xmm1,XMMWORD PTR [esp+0xa0] | 243 ; CHECK: movups xmm1,XMMWORD PTR [esp+0xa0] |
| 201 ; CHECK: movups xmm2,XMMWORD PTR [esp+0x90] | 244 ; CHECK: movups xmm2,XMMWORD PTR [esp+0x90] |
| (...skipping 15 matching lines...) Expand all Loading... |
| 217 ; OPTM1: call {{.*}} R_{{.*}} InterspersedVectorArgs | 260 ; OPTM1: call {{.*}} R_{{.*}} InterspersedVectorArgs |
| 218 ; OPTM1-NEXT: add esp,0x50 | 261 ; OPTM1-NEXT: add esp,0x50 |
| 219 ; OPTM1: ret | 262 ; OPTM1: ret |
| 220 } | 263 } |
| 221 | 264 |
| 222 ; Test that a vector returned from a function is recognized to be in | 265 ; Test that a vector returned from a function is recognized to be in |
| 223 ; xmm0. | 266 ; xmm0. |
| 224 | 267 |
| 225 declare <4 x float> @VectorReturn(<4 x float> %arg0) | 268 declare <4 x float> @VectorReturn(<4 x float> %arg0) |
| 226 | 269 |
| 227 define void @test_receiving_vectors(<4 x float> %arg0) { | 270 define internal void @test_receiving_vectors(<4 x float> %arg0) { |
| 228 entry: | 271 entry: |
| 229 %result = call <4 x float> @VectorReturn(<4 x float> %arg0) | 272 %result = call <4 x float> @VectorReturn(<4 x float> %arg0) |
| 230 %result2 = call <4 x float> @VectorReturn(<4 x float> %result) | 273 %result2 = call <4 x float> @VectorReturn(<4 x float> %result) |
| 231 ret void | 274 ret void |
| 232 ; CHECK-LABEL: test_receiving_vectors | 275 ; CHECK-LABEL: test_receiving_vectors |
| 233 ; CHECK: call {{.*}} R_{{.*}} VectorReturn | 276 ; CHECK: call {{.*}} R_{{.*}} VectorReturn |
| 234 ; CHECK-NOT: movups xmm0 | 277 ; CHECK-NOT: movups xmm0 |
| 235 ; CHECK: call {{.*}} R_{{.*}} VectorReturn | 278 ; CHECK: call {{.*}} R_{{.*}} VectorReturn |
| 236 ; CHECK: ret | 279 ; CHECK: ret |
| 237 | 280 |
| 238 ; OPTM1-LABEL: test_receiving_vectors | 281 ; OPTM1-LABEL: test_receiving_vectors |
| 239 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn | 282 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn |
| 240 ; OPTM1: movups {{.*}},xmm0 | 283 ; OPTM1: movups {{.*}},xmm0 |
| 241 ; OPTM1: movups xmm0,{{.*}} | 284 ; OPTM1: movups xmm0,{{.*}} |
| 242 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn | 285 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn |
| 243 ; OPTM1: ret | 286 ; OPTM1: ret |
| 244 } | 287 } |
| OLD | NEW |