@@ -26,7 +26,6 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
26
*****************************************************************************/
27
27
28
28
29
-
30
29
#define HAVE_KERNEL_4x8 1
31
30
static void sgemv_kernel_4x8 ( BLASLONG n , FLOAT * * ap , FLOAT * x , FLOAT * y , BLASLONG lda4 , FLOAT * alpha ) __attribute__ ((noinline ));
32
31
@@ -38,41 +37,41 @@ static void sgemv_kernel_4x8( BLASLONG n, FLOAT **ap, FLOAT *x, FLOAT *y, BLASLO
38
37
__asm__ __volatile__
39
38
(
40
39
"vzeroupper \n\t"
41
- "vbroadcastss (%2 ), %%ymm12 \n\t" // x0
42
- "vbroadcastss 4(%2 ), %%ymm13 \n\t" // x1
43
- "vbroadcastss 8(%2 ), %%ymm14 \n\t" // x2
44
- "vbroadcastss 12(%2 ), %%ymm15 \n\t" // x3
45
- "vbroadcastss 16(%2 ), %%ymm0 \n\t" // x4
46
- "vbroadcastss 20(%2 ), %%ymm1 \n\t" // x5
47
- "vbroadcastss 24(%2 ), %%ymm2 \n\t" // x6
48
- "vbroadcastss 28(%2 ), %%ymm3 \n\t" // x7
40
+ "vbroadcastss (%3 ), %%ymm12 \n\t" // x0
41
+ "vbroadcastss 4(%3 ), %%ymm13 \n\t" // x1
42
+ "vbroadcastss 8(%3 ), %%ymm14 \n\t" // x2
43
+ "vbroadcastss 12(%3 ), %%ymm15 \n\t" // x3
44
+ "vbroadcastss 16(%3 ), %%ymm0 \n\t" // x4
45
+ "vbroadcastss 20(%3 ), %%ymm1 \n\t" // x5
46
+ "vbroadcastss 24(%3 ), %%ymm2 \n\t" // x6
47
+ "vbroadcastss 28(%3 ), %%ymm3 \n\t" // x7
49
48
50
49
"vbroadcastss (%9), %%ymm6 \n\t" // alpha
51
50
52
51
"testq $0x04, %1 \n\t"
53
52
"jz 2f \n\t"
54
53
55
- "vmovups (%3 ,%0,4), %%xmm7 \n\t" // 4 * y
54
+ "vmovups (%4 ,%0,4), %%xmm7 \n\t" // 4 * y
56
55
"vxorps %%xmm4 , %%xmm4, %%xmm4 \n\t"
57
56
"vxorps %%xmm5 , %%xmm5, %%xmm5 \n\t"
58
57
59
- "vfmadd231ps (%4 ,%0,4), %%xmm12, %%xmm4 \n\t"
60
- "vfmadd231ps (%5 ,%0,4), %%xmm13, %%xmm5 \n\t"
61
- "vfmadd231ps (%6 ,%0,4), %%xmm14, %%xmm4 \n\t"
62
- "vfmadd231ps (%7 ,%0,4), %%xmm15, %%xmm5 \n\t"
58
+ "vfmadd231ps (%5 ,%0,4), %%xmm12, %%xmm4 \n\t"
59
+ "vfmadd231ps (%6 ,%0,4), %%xmm13, %%xmm5 \n\t"
60
+ "vfmadd231ps (%7 ,%0,4), %%xmm14, %%xmm4 \n\t"
61
+ "vfmadd231ps (%8 ,%0,4), %%xmm15, %%xmm5 \n\t"
63
62
64
- "vfmadd231ps (%4,%8 ,4), %%xmm0 , %%xmm4 \n\t"
65
- "vfmadd231ps (%5,%8 ,4), %%xmm1 , %%xmm5 \n\t"
66
- "vfmadd231ps (%6,%8 ,4), %%xmm2 , %%xmm4 \n\t"
67
- "vfmadd231ps (%7,%8 ,4), %%xmm3 , %%xmm5 \n\t"
63
+ "vfmadd231ps (%5,%2 ,4), %%xmm0 , %%xmm4 \n\t"
64
+ "vfmadd231ps (%6,%2 ,4), %%xmm1 , %%xmm5 \n\t"
65
+ "vfmadd231ps (%7,%2 ,4), %%xmm2 , %%xmm4 \n\t"
66
+ "vfmadd231ps (%8,%2 ,4), %%xmm3 , %%xmm5 \n\t"
68
67
69
68
"vaddps %%xmm4 , %%xmm5 , %%xmm5 \n\t"
70
69
"vmulps %%xmm6 , %%xmm5 , %%xmm5 \n\t"
71
70
"vaddps %%xmm7 , %%xmm5 , %%xmm5 \n\t"
72
71
73
- "vmovups %%xmm5, (%3 ,%0,4) \n\t" // 4 * y
72
+ "vmovups %%xmm5, (%4 ,%0,4) \n\t" // 4 * y
74
73
75
- "addq $4 , %8 \n\t"
74
+ "addq $4 , %2 \n\t"
76
75
"addq $4 , %0 \n\t"
77
76
"subq $4 , %1 \n\t"
78
77
@@ -81,28 +80,28 @@ static void sgemv_kernel_4x8( BLASLONG n, FLOAT **ap, FLOAT *x, FLOAT *y, BLASLO
81
80
"testq $0x08, %1 \n\t"
82
81
"jz 3f \n\t"
83
82
84
- "vmovups (%3 ,%0,4), %%ymm7 \n\t" // 8 * y
83
+ "vmovups (%4 ,%0,4), %%ymm7 \n\t" // 8 * y
85
84
"vxorps %%ymm4 , %%ymm4, %%ymm4 \n\t"
86
85
"vxorps %%ymm5 , %%ymm5, %%ymm5 \n\t"
87
86
88
- "vfmadd231ps (%4 ,%0,4), %%ymm12, %%ymm4 \n\t"
89
- "vfmadd231ps (%5 ,%0,4), %%ymm13, %%ymm5 \n\t"
90
- "vfmadd231ps (%6 ,%0,4), %%ymm14, %%ymm4 \n\t"
91
- "vfmadd231ps (%7 ,%0,4), %%ymm15, %%ymm5 \n\t"
87
+ "vfmadd231ps (%5 ,%0,4), %%ymm12, %%ymm4 \n\t"
88
+ "vfmadd231ps (%6 ,%0,4), %%ymm13, %%ymm5 \n\t"
89
+ "vfmadd231ps (%7 ,%0,4), %%ymm14, %%ymm4 \n\t"
90
+ "vfmadd231ps (%8 ,%0,4), %%ymm15, %%ymm5 \n\t"
92
91
93
- "vfmadd231ps (%4,%8 ,4), %%ymm0 , %%ymm4 \n\t"
94
- "vfmadd231ps (%5,%8 ,4), %%ymm1 , %%ymm5 \n\t"
95
- "vfmadd231ps (%6,%8 ,4), %%ymm2 , %%ymm4 \n\t"
96
- "vfmadd231ps (%7,%8 ,4), %%ymm3 , %%ymm5 \n\t"
92
+ "vfmadd231ps (%5,%2 ,4), %%ymm0 , %%ymm4 \n\t"
93
+ "vfmadd231ps (%6,%2 ,4), %%ymm1 , %%ymm5 \n\t"
94
+ "vfmadd231ps (%7,%2 ,4), %%ymm2 , %%ymm4 \n\t"
95
+ "vfmadd231ps (%8,%2 ,4), %%ymm3 , %%ymm5 \n\t"
97
96
98
97
"vaddps %%ymm4 , %%ymm5 , %%ymm5 \n\t"
99
98
"vmulps %%ymm6 , %%ymm5 , %%ymm5 \n\t"
100
99
"vaddps %%ymm7 , %%ymm5 , %%ymm5 \n\t"
101
100
102
101
103
- "vmovups %%ymm5, (%3 ,%0,4) \n\t" // 8 * y
102
+ "vmovups %%ymm5, (%4 ,%0,4) \n\t" // 8 * y
104
103
105
- "addq $8 , %8 \n\t"
104
+ "addq $8 , %2 \n\t"
106
105
"addq $8 , %0 \n\t"
107
106
"subq $8 , %1 \n\t"
108
107
@@ -117,35 +116,35 @@ static void sgemv_kernel_4x8( BLASLONG n, FLOAT **ap, FLOAT *x, FLOAT *y, BLASLO
117
116
118
117
"vxorps %%ymm4 , %%ymm4, %%ymm4 \n\t"
119
118
"vxorps %%ymm5 , %%ymm5, %%ymm5 \n\t"
120
- "vmovups (%3 ,%0,4), %%ymm8 \n\t" // 8 * y
121
- "vmovups 32(%3 ,%0,4), %%ymm9 \n\t" // 8 * y
122
-
123
- "vfmadd231ps (%4 ,%0,4), %%ymm12, %%ymm4 \n\t"
124
- "vfmadd231ps 32(%4 ,%0,4), %%ymm12, %%ymm5 \n\t"
125
- "vfmadd231ps (%5 ,%0,4), %%ymm13, %%ymm4 \n\t"
126
- "vfmadd231ps 32(%5 ,%0,4), %%ymm13, %%ymm5 \n\t"
127
- "vfmadd231ps (%6 ,%0,4), %%ymm14, %%ymm4 \n\t"
128
- "vfmadd231ps 32(%6 ,%0,4), %%ymm14, %%ymm5 \n\t"
129
- "vfmadd231ps (%7 ,%0,4), %%ymm15, %%ymm4 \n\t"
130
- "vfmadd231ps 32(%7 ,%0,4), %%ymm15, %%ymm5 \n\t"
131
-
132
- "vfmadd231ps (%4,%8 ,4), %%ymm0 , %%ymm4 \n\t"
119
+ "vmovups (%4 ,%0,4), %%ymm8 \n\t" // 8 * y
120
+ "vmovups 32(%4 ,%0,4), %%ymm9 \n\t" // 8 * y
121
+
122
+ "vfmadd231ps (%5 ,%0,4), %%ymm12, %%ymm4 \n\t"
123
+ "vfmadd231ps 32(%5 ,%0,4), %%ymm12, %%ymm5 \n\t"
124
+ "vfmadd231ps (%6 ,%0,4), %%ymm13, %%ymm4 \n\t"
125
+ "vfmadd231ps 32(%6 ,%0,4), %%ymm13, %%ymm5 \n\t"
126
+ "vfmadd231ps (%7 ,%0,4), %%ymm14, %%ymm4 \n\t"
127
+ "vfmadd231ps 32(%7 ,%0,4), %%ymm14, %%ymm5 \n\t"
128
+ "vfmadd231ps (%8 ,%0,4), %%ymm15, %%ymm4 \n\t"
129
+ "vfmadd231ps 32(%8 ,%0,4), %%ymm15, %%ymm5 \n\t"
130
+
131
+ "vfmadd231ps (%5,%2 ,4), %%ymm0 , %%ymm4 \n\t"
133
132
"addq $16, %0 \n\t"
134
- "vfmadd231ps 32(%4,%8 ,4), %%ymm0 , %%ymm5 \n\t"
135
- "vfmadd231ps (%5,%8 ,4), %%ymm1 , %%ymm4 \n\t"
136
- "vfmadd231ps 32(%5,%8 ,4), %%ymm1 , %%ymm5 \n\t"
137
- "vfmadd231ps (%6,%8 ,4), %%ymm2 , %%ymm4 \n\t"
138
- "vfmadd231ps 32(%6,%8 ,4), %%ymm2 , %%ymm5 \n\t"
139
- "vfmadd231ps (%7,%8 ,4), %%ymm3 , %%ymm4 \n\t"
140
- "vfmadd231ps 32(%7,%8 ,4), %%ymm3 , %%ymm5 \n\t"
133
+ "vfmadd231ps 32(%5,%2 ,4), %%ymm0 , %%ymm5 \n\t"
134
+ "vfmadd231ps (%6,%2 ,4), %%ymm1 , %%ymm4 \n\t"
135
+ "vfmadd231ps 32(%6,%2 ,4), %%ymm1 , %%ymm5 \n\t"
136
+ "vfmadd231ps (%7,%2 ,4), %%ymm2 , %%ymm4 \n\t"
137
+ "vfmadd231ps 32(%7,%2 ,4), %%ymm2 , %%ymm5 \n\t"
138
+ "vfmadd231ps (%8,%2 ,4), %%ymm3 , %%ymm4 \n\t"
139
+ "vfmadd231ps 32(%8,%2 ,4), %%ymm3 , %%ymm5 \n\t"
141
140
142
141
"vfmadd231ps %%ymm6 , %%ymm4 , %%ymm8 \n\t"
143
142
"vfmadd231ps %%ymm6 , %%ymm5 , %%ymm9 \n\t"
144
143
145
- "addq $16, %8 \n\t"
146
- "vmovups %%ymm8,-64(%3 ,%0,4) \n\t" // 8 * y
144
+ "addq $16, %2 \n\t"
145
+ "vmovups %%ymm8,-64(%4 ,%0,4) \n\t" // 8 * y
147
146
"subq $16, %1 \n\t"
148
- "vmovups %%ymm9,-32(%3 ,%0,4) \n\t" // 8 * y
147
+ "vmovups %%ymm9,-32(%4 ,%0,4) \n\t" // 8 * y
149
148
150
149
"jnz 1b \n\t"
151
150
@@ -154,15 +153,15 @@ static void sgemv_kernel_4x8( BLASLONG n, FLOAT **ap, FLOAT *x, FLOAT *y, BLASLO
154
153
155
154
:
156
155
"+r" (i ), // 0
157
- "+r" (n ) // 1
156
+ "+r" (n ), // 1
157
+ "+r" (lda4 ) // 2
158
158
:
159
- "r" (x ), // 2
160
- "r" (y ), // 3
161
- "r" (ap [0 ]), // 4
162
- "r" (ap [1 ]), // 5
163
- "r" (ap [2 ]), // 6
164
- "r" (ap [3 ]), // 7
165
- "r" (lda4 ), // 8
159
+ "r" (x ), // 3
160
+ "r" (y ), // 4
161
+ "r" (ap [0 ]), // 5
162
+ "r" (ap [1 ]), // 6
163
+ "r" (ap [2 ]), // 7
164
+ "r" (ap [3 ]), // 8
166
165
"r" (alpha ) // 9
167
166
: "cc" ,
168
167
"%xmm0" , "%xmm1" ,
@@ -177,7 +176,6 @@ static void sgemv_kernel_4x8( BLASLONG n, FLOAT **ap, FLOAT *x, FLOAT *y, BLASLO
177
176
}
178
177
179
178
180
-
181
179
#define HAVE_KERNEL_4x4 1
182
180
static void sgemv_kernel_4x4 ( BLASLONG n , FLOAT * * ap , FLOAT * x , FLOAT * y , FLOAT * alpha ) __attribute__ ((noinline ));
183
181
@@ -196,6 +194,7 @@ static void sgemv_kernel_4x4( BLASLONG n, FLOAT **ap, FLOAT *x, FLOAT *y, FLOAT
196
194
197
195
"vbroadcastss (%8), %%ymm6 \n\t" // alpha
198
196
197
+
199
198
"testq $0x04, %1 \n\t"
200
199
"jz 2f \n\t"
201
200
0 commit comments