~ubuntu-branches/ubuntu/vivid/atlas/vivid

« back to all changes in this revision

Viewing changes to tune/blas/gemv/MVNCASES/ATL_mvnk_28x1_dot.c

  • Committer: Package Import Robot
  • Author(s): Sébastien Villemot
  • Date: 2013-06-11 15:58:16 UTC
  • mfrom: (1.1.3 upstream)
  • mto: (2.2.21 experimental)
  • mto: This revision was merged to the branch mainline in revision 26.
  • Revision ID: package-import@ubuntu.com-20130611155816-b72z8f621tuhbzn0
Tags: upstream-3.10.1
Import upstream version 3.10.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * This kernel does GEMV by performing 28 simultaneous dot-products along
 
3
 * the rows of the no-transpose matrix A.  It assumes M is a multiple of 28.
 
4
 */
 
5
#include "atlas_asm.h"
 
6
#ifndef ATL_GAS_x8664
 
7
   #error "This kernel requires x86-64 assembly!"
 
8
#endif
 
9
/*
 
10
 * Integer register usage
 
11
 */
 
12
#define MM      %rdi
 
13
#define NN      %rsi
 
14
#define pA0     %rdx
 
15
#define pA      %rax
 
16
#define lda     %rcx
 
17
#define pX      %r8
 
18
#define pY      %r9
 
19
#define incAm   %rbp
 
20
#define N0      %r11
 
21
/*
 
22
 * Floating point vector register usage
 
23
 */
 
24
#define rX0     %xmm0
 
25
#define rA0     %xmm1
 
26
#define rY0     %xmm2
 
27
#define rY2     %xmm3
 
28
#define rY4     %xmm4
 
29
#define rY6     %xmm5
 
30
#define rY8     %xmm6
 
31
#define rY10    %xmm7
 
32
#define rY12    %xmm8
 
33
#define rY14    %xmm9
 
34
#define rY16    %xmm10
 
35
#define rY18    %xmm11
 
36
#define rY20    %xmm12
 
37
#define rY22    %xmm13
 
38
#define rY24    %xmm14
 
39
#define rY26    %xmm15
 
40
 
 
41
/*
 
42
 *
 
43
 *                      rdi         rsi            rdx           rcx
 
44
 *void ATL_UGEMV(ATL_CINT M, ATL_CINT N, const TYPE *A, ATL_CINT lda,
 
45
 *               const TYPE *X, TYPE *Y)
 
46
 *                        r8       r9
 
47
 *
 
48
 *  y = [0,1]*y + A*x, A is MxN,  len(X) = N, len(Y) = M
 
49
 */
 
50
#ifdef BETA0
 
51
   #define AddYtoDot(addr_, reg_)
 
52
#else
 
53
   #define AddYtoDot(addr_, reg_) addpd addr_, reg_
 
54
#endif
 
55
#ifdef ATL_3DNow
 
56
   #define prefY(addr_) prefetchw addr_
 
57
#else
 
58
   #define prefY(addr_) prefetcht0 addr_
 
59
#endif
 
60
.text
 
61
.global ATL_asmdecor(ATL_UGEMV)
 
62
ALIGN64
 
63
ATL_asmdecor(ATL_UGEMV):
 
64
   movq %rbp, -8(%rsp)
 
65
 
 
66
   neg NN                  /* make N negative for update X */
 
67
   mov NN, N0              /* backup of N so we can restore at end of M loop */
 
68
   mov $28*8, incAm
 
69
   sub $-128, pA0          /* pA0 += 128 bytes */
 
70
   sub $-128, pY           /* pY  += 128 bytes */
 
71
   shl $3, lda             /* lda *= sizeof */
 
72
   mov pA0, pA
 
73
   MLOOP:
 
74
      #ifdef ATL_SSE3
 
75
         movddup (pX), rX0
 
76
      #else
 
77
         movlpd  (pX), rX0
 
78
         unpcklpd rX0, rX0
 
79
      #endif
 
80
      add $8, pX
 
81
      movapd -128(pA0), rY0
 
82
      mulpd   rX0, rY0
 
83
      movapd -112(pA0), rY2
 
84
      mulpd   rX0, rY2
 
85
      movapd  -96(pA0), rY4
 
86
      mulpd   rX0, rY4
 
87
      movapd  -80(pA0), rY6
 
88
      mulpd   rX0, rY6
 
89
      movapd  -64(pA0), rY8
 
90
      mulpd   rX0, rY8
 
91
      movapd  -48(pA0), rY10
 
92
      mulpd   rX0, rY10
 
93
      movapd  -32(pA0), rY12
 
94
      mulpd   rX0, rY12
 
95
      movapd  -16(pA0), rY14
 
96
      mulpd   rX0, rY14
 
97
      movapd     (pA0), rY16
 
98
      mulpd   rX0, rY16
 
99
      movapd   16(pA0), rY18
 
100
      mulpd   rX0, rY18
 
101
      movapd   32(pA0), rY20
 
102
      mulpd   rX0, rY20
 
103
      movapd   48(pA0), rY22
 
104
      mulpd   rX0, rY22
 
105
      movapd   64(pA0), rY24
 
106
      mulpd   rX0, rY24
 
107
      movapd   80(pA0), rY26
 
108
      mulpd   rX0, rY26
 
109
      add lda, pA0
 
110
      add $1, NN
 
111
      jz DONENLOOP
 
112
      NLOOP:
 
113
         #ifdef ATL_SSE3
 
114
            movddup (pX), rX0
 
115
         #else
 
116
            movlpd  (pX), rX0
 
117
            unpcklpd rX0, rX0
 
118
         #endif
 
119
         add $8, pX   /* pX++ */
 
120
 
 
121
         movapd -128(pA0), rA0
 
122
         mulpd  rX0, rA0
 
123
         addpd  rA0, rY0
 
124
         movapd -112(pA0), rA0
 
125
         mulpd  rX0, rA0
 
126
         addpd  rA0, rY2
 
127
         movapd -96(pA0), rA0
 
128
         mulpd  rX0, rA0
 
129
         addpd  rA0, rY4
 
130
         movapd -80(pA0), rA0
 
131
         mulpd  rX0, rA0
 
132
         addpd  rA0, rY6
 
133
         movapd -64(pA0), rA0
 
134
         mulpd  rX0, rA0
 
135
         addpd  rA0, rY8
 
136
         movapd -48(pA0), rA0
 
137
         mulpd  rX0, rA0
 
138
         addpd  rA0, rY10
 
139
         movapd -32(pA0), rA0
 
140
         mulpd  rX0, rA0
 
141
         addpd  rA0, rY12
 
142
         movapd -16(pA0), rA0
 
143
         mulpd  rX0, rA0
 
144
         addpd  rA0, rY14
 
145
         movapd (pA0), rA0
 
146
         mulpd  rX0, rA0
 
147
         addpd  rA0, rY16
 
148
         movapd 16(pA0), rA0
 
149
         mulpd  rX0, rA0
 
150
         addpd  rA0, rY18
 
151
         movapd 32(pA0), rA0
 
152
         mulpd  rX0, rA0
 
153
         addpd  rA0, rY20
 
154
         movapd 48(pA0), rA0
 
155
         mulpd  rX0, rA0
 
156
         addpd  rA0, rY22
 
157
         movapd 64(pA0), rA0
 
158
         mulpd  rX0, rA0
 
159
         addpd  rA0, rY24
 
160
         movapd 80(pA0), rA0
 
161
         mulpd  rX0, rA0
 
162
         addpd  rA0, rY26
 
163
         add lda, pA0
 
164
      add $1, NN
 
165
      jnz NLOOP
 
166
      DONENLOOP:
 
167
      AddYtoDot(-128(pY), rY0)
 
168
      movapd rY0, -128(pY)
 
169
      AddYtoDot(-112(pY), rY2)
 
170
      movapd rY2, -112(pY)
 
171
      AddYtoDot(-96(pY), rY4)
 
172
      movapd rY4, -96(pY)
 
173
      AddYtoDot(-80(pY), rY6)
 
174
      movapd rY6, -80(pY)
 
175
      AddYtoDot(-64(pY), rY8)
 
176
      movapd rY8, -64(pY)
 
177
      AddYtoDot(-48(pY), rY10)
 
178
      movapd rY10, -48(pY)
 
179
      AddYtoDot(-32(pY), rY12)
 
180
      movapd rY12, -32(pY)
 
181
      AddYtoDot(-16(pY), rY14)
 
182
      movapd rY14, -16(pY)
 
183
      AddYtoDot((pY), rY16)
 
184
      movapd rY16, (pY)
 
185
      AddYtoDot(16(pY), rY18)
 
186
      movapd rY18, 16(pY)
 
187
      AddYtoDot(32(pY), rY20)
 
188
      movapd rY20, 32(pY)
 
189
      AddYtoDot(48(pY), rY22)
 
190
      movapd rY22, 48(pY)
 
191
      AddYtoDot(64(pY), rY24)
 
192
      movapd rY24, 64(pY)
 
193
      AddYtoDot(80(pY), rY26)
 
194
      movapd rY26, 80(pY)
 
195
 
 
196
      lea (pX, N0, 8), pX   /* pX -= N*sizeof */
 
197
      prefY(-80(pY,incAm))
 
198
      mov N0, NN
 
199
      prefY(-16(pY,incAm))
 
200
      add incAm, pA
 
201
      prefY(48(pY,incAm))
 
202
      mov pA, pA0
 
203
      prefY(112(pY,incAm))
 
204
      add incAm, pY
 
205
   sub $28, MM
 
206
   jnz MLOOP
 
207
 
 
208
   movq -8(%rsp), %rbp
 
209
   ret