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

« back to all changes in this revision

Viewing changes to tune/blas/level1/AXPY/daxpy_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
#include "atlas_asm.h"
 
2
 
 
3
#ifndef ATL_SSE2
 
4
   #error "This kernel requires SSE2"
 
5
#endif
 
6
#ifdef ATL_GAS_x8632
 
7
   #define movq movl
 
8
   #define addq addl
 
9
   #define subq subl
 
10
   #define X    %eax
 
11
   #define Y    %edx
 
12
   #define N    %ecx
 
13
   #define Nr   %ebp
 
14
#elif defined(ATL_GAS_x8664)
 
15
   #define N    %rdi
 
16
   #define X    %rsi
 
17
   #define Y    %rcx
 
18
   #define Nr   %rdx
 
19
#else
 
20
   #error "This kernel requires x86 assembly!"
 
21
#endif
 
22
 
 
23
#define alpha %xmm0
 
24
#define rY0   %xmm1
 
25
#define rX0   %xmm2
 
26
 
 
27
#ifndef PFDIST
 
28
   #ifdef ATL_ARCH_P4E
 
29
      #define PFDIST 384
 
30
   #else
 
31
      #define PFDIST 416
 
32
   #endif
 
33
#endif
 
34
 
 
35
# byte offset              4                  8              16             20
 
36
# void ATL_UAXPY(const int N, const SCALAR alpha, const TYPE *X, const int incX,
 
37
#                TYPE *Y, const int incY)
 
38
        .text
 
39
.global ATL_asmdecor(ATL_UAXPY)
 
40
ATL_asmdecor(ATL_UAXPY):
 
41
#ifdef ATL_GAS_x8632
 
42
   #define OFF 8
 
43
        subl    $OFF, %esp
 
44
        movl    %ebp, (%esp)
 
45
        movl    %ebx, 4(%esp)
 
46
 
 
47
        movl    OFF+4(%esp), N
 
48
        movlpd  OFF+8(%esp),  alpha
 
49
        movl    OFF+16(%esp), X
 
50
        movl    OFF+24(%esp), Y
 
51
#endif
 
52
        unpcklpd       alpha, alpha
 
53
 
 
54
        movq    N, Nr
 
55
        cmp     $4, N
 
56
        jbe     SCALAR_TEST
 
57
 
 
58
        movq    Y, Nr
 
59
        shr     $4, Nr
 
60
        shl     $4, Nr
 
61
        cmp     Nr, Y
 
62
        je      YALIGNED
 
63
        movlpd  (X), rX0
 
64
        mulsd   alpha, rX0
 
65
        movlpd  (Y), rY0
 
66
        subq    $1, N
 
67
        addsd   rX0, rY0
 
68
        addq    $8, X
 
69
        movlpd  rY0, (Y)
 
70
        addq    $8, Y
 
71
YALIGNED:
 
72
        movq    X, Nr
 
73
        shr     $4, Nr
 
74
        shl     $4, Nr
 
75
        cmp     Nr, X
 
76
        jne     XUNALIGNED
 
77
 
 
78
        movq    N, Nr
 
79
        shr     $1, N
 
80
        shl     $1, N
 
81
        sub     N, Nr
 
82
        lea     (X, N, 8), X
 
83
        lea     (Y, N, 8), Y
 
84
        neg     N
 
85
NLOOP:
 
86
        movapd  (X,N,8), rX0
 
87
        movapd  (Y,N,8), rY0
 
88
        mulpd   alpha, rX0
 
89
                                        prefetchw       PFDIST(Y,N,8)
 
90
        addpd   rX0, rY0
 
91
        movapd  rY0, (Y,N,8)
 
92
                                        prefetchnta     PFDIST(X,N,8)
 
93
        addq    $2, N
 
94
        jnz     NLOOP
 
95
#
 
96
#  This loop assumes num of iterations is in Nr
 
97
#
 
98
SCALAR_TEST:
 
99
        cmp     $0, Nr
 
100
        je      DONE
 
101
SLOOP:
 
102
        movlpd  (X), rX0
 
103
        mulsd   alpha, rX0
 
104
        movlpd  (Y), rY0
 
105
        addsd   rX0, rY0
 
106
        addq    $8, X
 
107
        movlpd  rY0, (Y)
 
108
        addq    $8, Y
 
109
        subq    $1, Nr
 
110
        jnz     SLOOP
 
111
#
 
112
#       Epilogue
 
113
#
 
114
DONE:
 
115
#ifdef ATL_GAS_x8632
 
116
        movl    (%esp), %ebp
 
117
        movl    4(%esp), %ebx
 
118
        addl    $OFF, %esp
 
119
#endif
 
120
        ret
 
121
XUNALIGNED:
 
122
        movq    N, Nr
 
123
        shr     $1, N
 
124
        shl     $1, N
 
125
        sub     N, Nr
 
126
        lea     (X, N, 8), X
 
127
        lea     (Y, N, 8), Y
 
128
        neg     N
 
129
UNLOOP:
 
130
        movupd  (X,N,8), rX0
 
131
        movapd  (Y,N,8), rY0
 
132
        mulpd   alpha, rX0
 
133
        addpd   rX0, rY0
 
134
        movapd  rY0, (Y,N,8)
 
135
        addq    $2, N
 
136
        jnz     UNLOOP
 
137
        jmp     SCALAR_TEST