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

« back to all changes in this revision

Viewing changes to tune/blas/gemm/CASES/ATL_smm4x1x60_4_sse2.c

  • Committer: Bazaar Package Importer
  • Author(s): Sylvestre Ledru
  • Date: 2009-09-17 23:31:54 UTC
  • mto: (2.2.1 experimental)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: james.westby@ubuntu.com-20090917233154-9esw88ub02twbuab
Tags: upstream-3.8.3
ImportĀ upstreamĀ versionĀ 3.8.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *             Automatically Tuned Linear Algebra Software v3.8.3
 
3
 *                    (C) Copyright 2004 R. Clint Whaley
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 *   1. Redistributions of source code must retain the above copyright
 
9
 *      notice, this list of conditions and the following disclaimer.
 
10
 *   2. Redistributions in binary form must reproduce the above copyright
 
11
 *      notice, this list of conditions, and the following disclaimer in the
 
12
 *      documentation and/or other materials provided with the distribution.
 
13
 *   3. The name of the ATLAS group or the names of its contributers may
 
14
 *      not be used to endorse or promote products derived from this
 
15
 *      software without specific written permission.
 
16
 *
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
18
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 
19
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
20
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS
 
21
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
22
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
23
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
24
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
25
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
26
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
27
 * POSSIBILITY OF SUCH DAMAGE.
 
28
 *
 
29
 */
 
30
#include "atlas_asm.h"
 
31
 
 
32
 
 
33
/*
 
34
 *Efficeon-optimized 4x1x60 SGEMM.  Pipelined to 4 (4 accumulators).
 
35
 *Prefetches the next col of B, and a col from the next block of A in the M-loop
 
36
 *Purposely kept small so it is retained in cache, and easy to translate when
 
37
 *not
 
38
 */
 
39
 
 
40
#ifndef ATL_GAS_x8632
 
41
   #error "This kernel requires gas x86-32 assembler!"
 
42
#endif
 
43
/*
 
44
#if KB != 60
 
45
   #error "KB must be 60!"
 
46
#endif
 
47
*/
 
48
#if !defined(KB) || (KB == 0)
 
49
   #error "KB must be a compile-time constant!"
 
50
#endif
 
51
#if !defined(NB)
 
52
   #define NB 0
 
53
#endif
 
54
#if !defined(MB)
 
55
   #define MB 0
 
56
#endif
 
57
#if (MB/4)*4 != MB
 
58
   #error "MB must be multiple of 4!"
 
59
#endif
 
60
 
 
61
#ifdef SCPLX
 
62
   #define OFF 16
 
63
   #define CMUL(i_) (2*(i_))
 
64
#else
 
65
   #define OFF 8
 
66
   #define CMUL(i_) i_
 
67
#endif
 
68
/*
 
69
 * Integer register usage shown be these defines
 
70
 */
 
71
#define pC      %esi
 
72
#define pA      %ecx
 
73
#define pB      %edi
 
74
#define incCn   %eax
 
75
#define stM     %bl
 
76
#define stN     %bh
 
77
#define pfB     %edx
 
78
#define pfA     %ebp
 
79
 
 
80
#define pA0     pA
 
81
#define pB0     pB
 
82
 
 
83
#define m0      %xmm0
 
84
#define m1      %xmm1
 
85
#define m2      %xmm2
 
86
#define m3      %xmm3
 
87
#define rC0     %xmm4
 
88
#define rC1     %xmm5
 
89
#define rC2     %xmm6
 
90
#define rC3     %xmm7
 
91
 
 
92
#define NB0so   0
 
93
#define NBso    (KB*4)
 
94
#define NB1so   (KB*4)
 
95
#define NB2so   (NBso+NBso)
 
96
#define NB3so   (NBso+NBso+NBso)
 
97
#define NB4so   (NBso+NBso+NBso+NBso)
 
98
#define NB5so   (NBso+NBso+NBso+NBso+NBso)
 
99
#define NB6so   (NBso+NBso+NBso+NBso+NBso+NBso)
 
100
#define NB7so   (NB6so+NBso)
 
101
#define NB8so   (NB6so+NB2so)
 
102
#define NB9so   (NB6so+NB3so)
 
103
#define NB10so   (NB6so+NB4so)
 
104
#define NB11so   (NB6so+NB5so)
 
105
#if MB != 0
 
106
   #define MBKBso  (MB*KB*4)
 
107
#endif
 
108
 
 
109
/*
 
110
 * Prefetch defines
 
111
 */
 
112
#if 1
 
113
   #define pref2(mem) prefetcht0        mem
 
114
   #define prefB(mem) prefetcht0        mem
 
115
   #define prefC(mem) prefetcht0        mem
 
116
#else
 
117
   #define pref2(mem)
 
118
   #define prefB(mem)
 
119
   #define prefC(mem)
 
120
#endif
 
121
/*offset                    4            8           12                16
 
122
 *void ATL_USERMM(const int M, const int N, const int K, const TYPE alpha,
 
123
 *offset                     20             24             28            32
 
124
 *                const TYPE *A, const int lda, const TYPE *B, const int ldb,
 
125
 *offset                       36       40             44
 
126
 *                const TYPE beta, TYPE *C, const int ldc)
 
127
 */
 
128
        .text
 
129
.global ATL_asmdecor(ATL_USERMM)
 
130
ATL_asmdecor(ATL_USERMM):
 
131
/*
 
132
 *      Save callee-saved iregs; Save old stack pointer in eax,
 
133
 *      so we can adjust for BETA alignment
 
134
 */
 
135
#define FSIZE 28
 
136
#define BETAOFF FSIZE+36
 
137
#define COFF 16
 
138
        subl    $FSIZE, %esp
 
139
        movl    %ebp, 12(%esp)
 
140
        movl    %ebx,  8(%esp)
 
141
        movl    %esi,  4(%esp)
 
142
        movl    %edi,   (%esp)
 
143
/*
 
144
 *      Initialize pA = A;  pB = B; pC = C;
 
145
 */
 
146
#if MB == 0
 
147
        movl    FSIZE+4(%esp), %ebx
 
148
        movl    %ebx, COFF+4(%esp)
 
149
        imul    $NBso, %ebx
 
150
        movl    %ebx, COFF+8(%esp)
 
151
#endif
 
152
        movl    FSIZE+20(%esp), pA
 
153
        movl    FSIZE+28(%esp), pB
 
154
        movl    FSIZE+40(%esp), pC
 
155
#if NB == 0
 
156
        movb    FSIZE+8(%esp), stN
 
157
#else
 
158
        movb    $NB, stN
 
159
#endif
 
160
/*
 
161
 *      Set incCn = (ldc - MB)*sizeof
 
162
 */
 
163
        movl    FSIZE+44(%esp), incCn
 
164
   #if MB == 0
 
165
        subl    COFF+4(%esp), incCn
 
166
   #else
 
167
        subl    $MB, incCn
 
168
   #endif
 
169
   #ifdef SCPLX
 
170
        shl     $3, incCn
 
171
   #else
 
172
        shl     $2, incCn
 
173
   #endif
 
174
/*      movl    incCn, COFF(%esp) */
 
175
        movl    pA0, pfA
 
176
#if MB == 0
 
177
        addl    COFF+8(%esp), pfA
 
178
#else
 
179
        addl    $MBKBso, pfA
 
180
#endif
 
181
        addl    $120, pA0
 
182
        addl    $120, pB0
 
183
NLOOP:
 
184
#if MB == 0
 
185
        movb    COFF+4(%esp), stM
 
186
#else
 
187
        movb     $MB, stM
 
188
#endif
 
189
        lea     120+NBso(pB0), pfB
 
190
MLOOP:
 
191
#ifdef BETA0
 
192
        xorps   rC0, rC0
 
193
        xorps   rC1, rC1
 
194
        xorps   rC2, rC2
 
195
        xorps   rC3, rC3
 
196
#else
 
197
        movss   (pC), rC0
 
198
        movss   CMUL(4)(pC), rC1
 
199
        movss   CMUL(8)(pC), rC2
 
200
        movss   CMUL(12)(pC), rC3
 
201
   #ifdef BETAX
 
202
        movss   BETAOFF(%esp), m0
 
203
        mulss   m0, rC0
 
204
        mulss   m0, rC1
 
205
        mulss   m0, rC2
 
206
        mulss   m0, rC3
 
207
   #endif
 
208
#endif
 
209
        movaps  0-120(pB0), m3
 
210
        movaps  0-120(pA0), m0
 
211
        movaps  NBso+0-120(pA0), m1
 
212
        movaps  NB2so+0-120(pA0), m2
 
213
        mulps   m3, m0
 
214
        mulps   m3, m1
 
215
        mulps   m3, m2
 
216
/*
 
217
 *      Unrolled & pipelined K-loop
 
218
 */
 
219
        mulps   NB3so+0-120(pA0), m3
 
220
        addps   m0, rC0
 
221
        movaps  16-120(pB0), m0
 
222
        addps   m1, rC1
 
223
        movaps  NB0so+16-120(pA0), m1
 
224
        mulps   m0, m1
 
225
        addps   m2, rC2
 
226
        movaps  NB1so+16-120(pA0), m2
 
227
        mulps   m0, m2
 
228
        addps   m3, rC3
 
229
        movaps  NB2so+16-120(pA0), m3
 
230
        mulps   m0, m3
 
231
 
 
232
        mulps   NB3so+16-120(pA0), m0
 
233
        addps   m1, rC0
 
234
        movaps  32-120(pB0), m1
 
235
        addps   m2, rC1
 
236
        movaps  NB0so+32-120(pA0), m2
 
237
        mulps   m1, m2
 
238
        addps   m3, rC2
 
239
        movaps  NB1so+32-120(pA0), m3
 
240
        mulps   m1, m3
 
241
        addps   m0, rC3
 
242
        movaps  NB2so+32-120(pA0), m0
 
243
        mulps   m1, m0
 
244
 
 
245
        mulps   NB3so+32-120(pA0), m1
 
246
        addps   m2, rC0
 
247
        movaps  48-120(pB0), m2
 
248
        addps   m3, rC1
 
249
        movaps  NB0so+48-120(pA0), m3
 
250
        mulps   m2, m3
 
251
        addps   m0, rC2
 
252
        movaps  NB1so+48-120(pA0), m0
 
253
        mulps   m2, m0
 
254
        addps   m1, rC3
 
255
        movaps  NB2so+48-120(pA0), m1
 
256
        mulps   m2, m1
 
257
 
 
258
        mulps   NB3so+48-120(pA0), m2
 
259
        addps   m3, rC0
 
260
        movaps  64-120(pB0), m3
 
261
        addps   m0, rC1
 
262
        movaps  NB0so+64-120(pA0), m0
 
263
        mulps   m3, m0
 
264
        addps   m1, rC2
 
265
        movaps  NB1so+64-120(pA0), m1
 
266
        mulps   m3, m1
 
267
        addps   m2, rC3
 
268
        movaps  NB2so+64-120(pA0), m2
 
269
        mulps   m3, m2
 
270
 
 
271
        mulps   NB3so+64-120(pA0), m3
 
272
        addps   m0, rC0
 
273
        movaps  80-120(pB0), m0
 
274
        addps   m1, rC1
 
275
        movaps  NB0so+80-120(pA0), m1
 
276
        mulps   m0, m1
 
277
        addps   m2, rC2
 
278
        movaps  NB1so+80-120(pA0), m2
 
279
        mulps   m0, m2
 
280
        addps   m3, rC3
 
281
        movaps  NB2so+80-120(pA0), m3
 
282
        mulps   m0, m3
 
283
 
 
284
        mulps   NB3so+80-120(pA0), m0
 
285
        addps   m1, rC0
 
286
        movaps  96-120(pB0), m1
 
287
        addps   m2, rC1
 
288
        movaps  NB0so+96-120(pA0), m2
 
289
        mulps   m1, m2
 
290
        addps   m3, rC2
 
291
        movaps  NB1so+96-120(pA0), m3
 
292
        mulps   m1, m3
 
293
        addps   m0, rC3
 
294
        movaps  NB2so+96-120(pA0), m0
 
295
        mulps   m1, m0
 
296
 
 
297
        mulps   NB3so+96-120(pA0), m1
 
298
        addps   m2, rC0
 
299
        movaps  112-120(pB0), m2
 
300
        addps   m3, rC1
 
301
        movaps  NB0so+112-120(pA0), m3
 
302
        mulps   m2, m3
 
303
        addps   m0, rC2
 
304
        movaps  NB1so+112-120(pA0), m0
 
305
        mulps   m2, m0
 
306
        addps   m1, rC3
 
307
        movaps  NB2so+112-120(pA0), m1
 
308
        mulps   m2, m1
 
309
 
 
310
        mulps   NB3so+112-120(pA0), m2
 
311
        addps   m3, rC0
 
312
        movaps  128-120(pB0), m3
 
313
        addps   m0, rC1
 
314
        movaps  NB0so+128-120(pA0), m0
 
315
        mulps   m3, m0
 
316
        addps   m1, rC2
 
317
        movaps  NB1so+128-120(pA0), m1
 
318
        mulps   m3, m1
 
319
        addps   m2, rC3
 
320
        movaps  NB2so+128-120(pA0), m2
 
321
        mulps   m3, m2
 
322
 
 
323
        mulps   NB3so+128-120(pA0), m3
 
324
        addps   m0, rC0
 
325
        movaps  144-120(pB0), m0
 
326
        addps   m1, rC1
 
327
        movaps  NB0so+144-120(pA0), m1
 
328
        mulps   m0, m1
 
329
        addps   m2, rC2
 
330
        movaps  NB1so+144-120(pA0), m2
 
331
        mulps   m0, m2
 
332
        addps   m3, rC3
 
333
        movaps  NB2so+144-120(pA0), m3
 
334
        mulps   m0, m3
 
335
 
 
336
        mulps   NB3so+144-120(pA0), m0
 
337
        addps   m1, rC0
 
338
        movaps  160-120(pB0), m1
 
339
        addps   m2, rC1
 
340
        movaps  NB0so+160-120(pA0), m2
 
341
        mulps   m1, m2
 
342
        addps   m3, rC2
 
343
        movaps  NB1so+160-120(pA0), m3
 
344
        mulps   m1, m3
 
345
        addps   m0, rC3
 
346
        movaps  NB2so+160-120(pA0), m0
 
347
        mulps   m1, m0
 
348
 
 
349
        mulps   NB3so+160-120(pA0), m1
 
350
        addps   m2, rC0
 
351
        movaps  176-120(pB0), m2
 
352
        addps   m3, rC1
 
353
        movaps  NB0so+176-120(pA0), m3
 
354
        mulps   m2, m3
 
355
        addps   m0, rC2
 
356
        movaps  NB1so+176-120(pA0), m0
 
357
        mulps   m2, m0
 
358
        addps   m1, rC3
 
359
        movaps  NB2so+176-120(pA0), m1
 
360
        mulps   m2, m1
 
361
 
 
362
        mulps   NB3so+176-120(pA0), m2
 
363
        addps   m3, rC0
 
364
        movaps  192-120(pB0), m3
 
365
        addps   m0, rC1
 
366
        movaps  NB0so+192-120(pA0), m0
 
367
        mulps   m3, m0
 
368
        addps   m1, rC2
 
369
        movaps  NB1so+192-120(pA0), m1
 
370
        mulps   m3, m1
 
371
        addps   m2, rC3
 
372
        movaps  NB2so+192-120(pA0), m2
 
373
        mulps   m3, m2
 
374
 
 
375
        mulps   NB3so+192-120(pA0), m3
 
376
        addps   m0, rC0
 
377
        movaps  208-120(pB0), m0
 
378
        addps   m1, rC1
 
379
        movaps  NB0so+208-120(pA0), m1
 
380
        mulps   m0, m1
 
381
        addps   m2, rC2
 
382
        movaps  NB1so+208-120(pA0), m2
 
383
        mulps   m0, m2
 
384
        addps   m3, rC3
 
385
        movaps  NB2so+208-120(pA0), m3
 
386
        mulps   m0, m3
 
387
 
 
388
        mulps   NB3so+208-120(pA0), m0
 
389
        addps   m1, rC0
 
390
        movaps  224-120(pB0), m1
 
391
        addps   m2, rC1
 
392
        movaps  NB0so+224-120(pA0), m2
 
393
        mulps   m1, m2
 
394
        addps   m3, rC2
 
395
        movaps  NB1so+224-120(pA0), m3
 
396
        mulps   m1, m3
 
397
        addps   m0, rC3
 
398
        movaps  NB2so+224-120(pA0), m0
 
399
        mulps   m1, m0
 
400
 
 
401
        mulps   NB3so+224-120(pA0), m1
 
402
        addps   m2, rC0
 
403
        addps   m3, rC1
 
404
        addps   m0, rC2
 
405
        addps   m1, rC3
 
406
 
 
407
/*
 
408
 *      Get these bastard things summed up correctly
 
409
 *      Note this summation is Camm's, as his sequence was faster
 
410
 *      than the piece of crap I came up with
 
411
 */
 
412
        movaps          rC0, m0        /* m0 = c0d    c0c    c0b    c0a */
 
413
        unpcklps        rC1, rC0        /* rC0 = c1b    c0b    c1a    c0d */
 
414
        movaps          rC2, m1        /* m1 = c2d    c2c    c2b    c2a */
 
415
        unpckhps        rC1, m0        /* m0 = c1d    c0d    c1c    c0c */
 
416
                                        prefB((pfB))
 
417
        unpcklps        rC3, rC2        /* rC2 = c3b    c2b    c3a    c2a */
 
418
                                        addl    $16, pfB
 
419
        addps           m0, rC0        /* rC0 = c1bd   c0bd   c1ac   c0ac */
 
420
        unpckhps        rC3, m1        /* m1 = c3d    c2d    c3c    c2c */
 
421
                                        addl    $NB4so, pA0
 
422
        movaps          rC0, m0        /* m0 = c1bd   c0bd   c1ac   c0ac */
 
423
        addps           m1, rC2        /* rC2 = c3bd   c2bd   c3ac   c2ac */
 
424
        shufps          $0x44,rC2,rC0   /* rC0 = c3ac   c2ac   c1ac   c0ac */
 
425
                                        pref2((pfA))
 
426
        shufps          $0xEE,rC2,m0   /* m0 = c3bd   c2bd   c1bd   c0bd */
 
427
                                        addl    $16, pfA
 
428
        addps           m0, rC0        /* rC0 = c3abcd c2abcd c1abcd c0abcd */
 
429
                                        /* rC1 = c1a  c1b */
 
430
                                        /* rC2 = c2a  c2b */
 
431
/*
 
432
 *      Write results back to C
 
433
 */
 
434
   #ifdef SCPLX
 
435
                                        /* rC0 = c3 c2 c1 c0 */
 
436
        pshufd  $0xB1, rC0, rC1         /* rC1 = c2 c3 c0 c1 */
 
437
        movhlps rC0, rC2                /* rC2 =  X  X c3 c2 */
 
438
        movhlps rC1, rC3                /* rC3 =  X  X c2 c3 */
 
439
        movss   rC0, (pC)
 
440
        movss   rC1, 8(pC)
 
441
        movss   rC2, 16(pC)
 
442
        movss   rC3, 24(pC)
 
443
   #else
 
444
        movups  rC0, (pC)
 
445
   #endif
 
446
/*
 
447
 *      pC += 6;  pA += 2*NB
 
448
 */
 
449
        addl    $CMUL(16), pC
 
450
/*
 
451
 *      while (pA != stM);
 
452
 */
 
453
        subb    $4, stM
 
454
        jnz     MLOOP
 
455
/*
 
456
 *      pC += incCn;  pA -= NBNB;  pB += NB;
 
457
 */
 
458
        addl    incCn, pC
 
459
/*      addl    COFF(%esp), pC */
 
460
   #if MB == 0
 
461
        subl    COFF+8(%esp), pA0
 
462
   #else
 
463
        subl    $MBKBso, pA0
 
464
   #endif
 
465
        addl    $NBso, pB
 
466
/*
 
467
 *      while (pB != stN);
 
468
 */
 
469
        sub     $1, stN
 
470
        jnz     NLOOP
 
471
 
 
472
/*
 
473
 *      Restore callee-saved iregs
 
474
 */
 
475
        movl    12(%esp), %ebp
 
476
        movl     8(%esp), %ebx
 
477
        movl     4(%esp), %esi
 
478
        movl      (%esp), %edi
 
479
        addl    $FSIZE, %esp
 
480
        ret