comparison libmpeg2/alpha_asm.h @ 9857:89b48bc6c441

Importing libmpeg2 from mpeg2dec-0.3.1
author arpi
date Sun, 06 Apr 2003 16:41:49 +0000
parents
children d0a8810e155c
comparison
equal deleted inserted replaced
9856:08496327b7ec 9857:89b48bc6c441
1 /*
2 * Alpha assembly macros
3 * Copyright (c) 2002 Falk Hueffner <falk@debian.org>
4 *
5 * This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
6 * See http://libmpeg2.sourceforge.net/ for updates.
7 *
8 * mpeg2dec is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * mpeg2dec is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22
23 #ifndef ALPHA_ASM_H
24 #define ALPHA_ASM_H
25
26 #include <inttypes.h>
27
28 #if defined __GNUC__
29 # define GNUC_PREREQ(maj, min) \
30 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
31 #else
32 # define GNUC_PREREQ(maj, min) 0
33 #endif
34
35 #define AMASK_BWX (1 << 0)
36 #define AMASK_FIX (1 << 1)
37 #define AMASK_CIX (1 << 2)
38 #define AMASK_MVI (1 << 8)
39
40 #ifdef __alpha_bwx__
41 # define HAVE_BWX() 1
42 #else
43 # define HAVE_BWX() (amask(AMASK_BWX) == 0)
44 #endif
45 #ifdef __alpha_fix__
46 # define HAVE_FIX() 1
47 #else
48 # define HAVE_FIX() (amask(AMASK_FIX) == 0)
49 #endif
50 #ifdef __alpha_max__
51 # define HAVE_MVI() 1
52 #else
53 # define HAVE_MVI() (amask(AMASK_MVI) == 0)
54 #endif
55 #ifdef __alpha_cix__
56 # define HAVE_CIX() 1
57 #else
58 # define HAVE_CIX() (amask(AMASK_CIX) == 0)
59 #endif
60
61 inline static uint64_t BYTE_VEC(uint64_t x)
62 {
63 x |= x << 8;
64 x |= x << 16;
65 x |= x << 32;
66 return x;
67 }
68 inline static uint64_t WORD_VEC(uint64_t x)
69 {
70 x |= x << 16;
71 x |= x << 32;
72 return x;
73 }
74
75 #define ldq(p) (*(const uint64_t *) (p))
76 #define ldl(p) (*(const int32_t *) (p))
77 #define stl(l, p) do { *(uint32_t *) (p) = (l); } while (0)
78 #define stq(l, p) do { *(uint64_t *) (p) = (l); } while (0)
79 #define sextw(x) ((int16_t) (x))
80
81 #ifdef __GNUC__
82 struct unaligned_long { uint64_t l; } __attribute__((packed));
83 #define ldq_u(p) (*(const uint64_t *) (((uint64_t) (p)) & ~7ul))
84 #define uldq(a) (((const struct unaligned_long *) (a))->l)
85
86 #if GNUC_PREREQ(3,0)
87 /* Unfortunately, __builtin_prefetch is slightly buggy on Alpha. The
88 defines here are kludged so we still get the right
89 instruction. This needs to be adapted as soon as gcc is fixed. */
90 # define prefetch(p) __builtin_prefetch((p), 0, 1)
91 # define prefetch_en(p) __builtin_prefetch((p), 1, 1)
92 # define prefetch_m(p) __builtin_prefetch((p), 0, 0)
93 # define prefetch_men(p) __builtin_prefetch((p), 1, 0)
94 #else
95 # define prefetch(p) asm volatile("ldl $31,%0" : : "m"(*(const char *) (p)) : "memory")
96 # define prefetch_en(p) asm volatile("ldq $31,%0" : : "m"(*(const char *) (p)) : "memory")
97 # define prefetch_m(p) asm volatile("lds $f31,%0" : : "m"(*(const char *) (p)) : "memory")
98 # define prefetch_men(p) asm volatile("ldt $f31,%0" : : "m"(*(const char *) (p)) : "memory")
99 #endif
100
101 #if GNUC_PREREQ(3,3)
102 #define cmpbge __builtin_alpha_cmpbge
103 /* Avoid warnings. */
104 #define extql(a, b) __builtin_alpha_extql(a, (uint64_t) (b))
105 #define extwl(a, b) __builtin_alpha_extwl(a, (uint64_t) (b))
106 #define extqh(a, b) __builtin_alpha_extqh(a, (uint64_t) (b))
107 #define zap __builtin_alpha_zap
108 #define zapnot __builtin_alpha_zapnot
109 #define amask __builtin_alpha_amask
110 #define implver __builtin_alpha_implver
111 #define rpcc __builtin_alpha_rpcc
112 #define minub8 __builtin_alpha_minub8
113 #define minsb8 __builtin_alpha_minsb8
114 #define minuw4 __builtin_alpha_minuw4
115 #define minsw4 __builtin_alpha_minsw4
116 #define maxub8 __builtin_alpha_maxub8
117 #define maxsb8 __builtin_alpha_maxsb8
118 #define maxuw4 __builtin_alpha_maxuw4
119 #define maxsw4 __builtin_alpha_maxsw4
120 #define perr __builtin_alpha_perr
121 #define pklb __builtin_alpha_pklb
122 #define pkwb __builtin_alpha_pkwb
123 #define unpkbl __builtin_alpha_unpkbl
124 #define unpkbw __builtin_alpha_unpkbw
125 #else
126 #define cmpbge(a, b) ({ uint64_t __r; asm ("cmpbge %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
127 #define extql(a, b) ({ uint64_t __r; asm ("extql %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
128 #define extwl(a, b) ({ uint64_t __r; asm ("extwl %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
129 #define extqh(a, b) ({ uint64_t __r; asm ("extqh %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
130 #define zap(a, b) ({ uint64_t __r; asm ("zap %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
131 #define zapnot(a, b) ({ uint64_t __r; asm ("zapnot %r1,%2,%0" : "=r" (__r) : "rJ" (a), "rI" (b)); __r; })
132 #define amask(a) ({ uint64_t __r; asm ("amask %1,%0" : "=r" (__r) : "rI" (a)); __r; })
133 #define implver() ({ uint64_t __r; asm ("implver %0" : "=r" (__r)); __r; })
134 #define rpcc() ({ uint64_t __r; asm volatile ("rpcc %0" : "=r" (__r)); __r; })
135 #define minub8(a, b) ({ uint64_t __r; asm ("minub8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
136 #define minsb8(a, b) ({ uint64_t __r; asm ("minsb8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
137 #define minuw4(a, b) ({ uint64_t __r; asm ("minuw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
138 #define minsw4(a, b) ({ uint64_t __r; asm ("minsw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
139 #define maxub8(a, b) ({ uint64_t __r; asm ("maxub8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
140 #define maxsb8(a, b) ({ uint64_t __r; asm ("maxsb8 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
141 #define maxuw4(a, b) ({ uint64_t __r; asm ("maxuw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
142 #define maxsw4(a, b) ({ uint64_t __r; asm ("maxsw4 %r1,%2,%0" : "=r" (__r) : "%rJ" (a), "rI" (b)); __r; })
143 #define perr(a, b) ({ uint64_t __r; asm ("perr %r1,%r2,%0" : "=r" (__r) : "%rJ" (a), "rJ" (b)); __r; })
144 #define pklb(a) ({ uint64_t __r; asm ("pklb %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
145 #define pkwb(a) ({ uint64_t __r; asm ("pkwb %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
146 #define unpkbl(a) ({ uint64_t __r; asm ("unpkbl %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
147 #define unpkbw(a) ({ uint64_t __r; asm ("unpkbw %r1,%0" : "=r" (__r) : "rJ" (a)); __r; })
148 #endif
149 #define wh64(p) asm volatile("wh64 (%0)" : : "r"(p) : "memory")
150
151 #elif defined(__DECC) /* Digital/Compaq/hp "ccc" compiler */
152
153 #include <c_asm.h>
154 #define ldq_u(a) asm ("ldq_u %v0,0(%a0)", a)
155 #define uldq(a) (*(const __unaligned uint64_t *) (a))
156 #define cmpbge(a, b) asm ("cmpbge %a0,%a1,%v0", a, b)
157 #define extql(a, b) asm ("extql %a0,%a1,%v0", a, b)
158 #define extwl(a, b) asm ("extwl %a0,%a1,%v0", a, b)
159 #define extqh(a, b) asm ("extqh %a0,%a1,%v0", a, b)
160 #define zap(a, b) asm ("zap %a0,%a1,%v0", a, b)
161 #define zapnot(a, b) asm ("zapnot %a0,%a1,%v0", a, b)
162 #define amask(a) asm ("amask %a0,%v0", a)
163 #define implver() asm ("implver %v0")
164 #define rpcc() asm ("rpcc %v0")
165 #define minub8(a, b) asm ("minub8 %a0,%a1,%v0", a, b)
166 #define minsb8(a, b) asm ("minsb8 %a0,%a1,%v0", a, b)
167 #define minuw4(a, b) asm ("minuw4 %a0,%a1,%v0", a, b)
168 #define minsw4(a, b) asm ("minsw4 %a0,%a1,%v0", a, b)
169 #define maxub8(a, b) asm ("maxub8 %a0,%a1,%v0", a, b)
170 #define maxsb8(a, b) asm ("maxsb8 %a0,%a1,%v0", a, b)
171 #define maxuw4(a, b) asm ("maxuw4 %a0,%a1,%v0", a, b)
172 #define maxsw4(a, b) asm ("maxsw4 %a0,%a1,%v0", a, b)
173 #define perr(a, b) asm ("perr %a0,%a1,%v0", a, b)
174 #define pklb(a) asm ("pklb %a0,%v0", a)
175 #define pkwb(a) asm ("pkwb %a0,%v0", a)
176 #define unpkbl(a) asm ("unpkbl %a0,%v0", a)
177 #define unpkbw(a) asm ("unpkbw %a0,%v0", a)
178 #define wh64(a) asm ("wh64 %a0", a)
179
180 #else
181 #error "Unknown compiler!"
182 #endif
183
184 #endif /* ALPHA_ASM_H */