3 * XScale WirelessMMX extensions
\r
4 * Copyright 2002 Wild West Software
\r
11 #include <arm-codegen.h>
\r
14 #if defined(ARM_IASM)
\r
15 # define WM_ASM(_expr) ARM_IASM(_expr)
\r
17 # define WM_ASM(_expr) __emit (_expr)
\r
20 #if defined(ARM_EMIT)
\r
21 # define WM_EMIT(p, i) ARM_EMIT(p, i)
\r
23 # define WM_EMIT(p, i)
\r
30 WM_CC_HS = WM_CC_CS,
\r
32 WM_CC_LO = WM_CC_CC,
\r
48 #if defined(ARM_DEF_COND)
\r
49 # define WM_DEF_CC(_cc) ARM_DEF_COND(_cc)
\r
51 # define WM_DEF_CC(_cc) ((_cc & 0xF) << WM_CC_SHIFT)
\r
94 * H - 16-bit (HalfWord) SIMD
\r
95 * W - 32-bit (Word) SIMD
\r
96 * D - 64-bit (Double)
\r
105 * B.2.3 Transfers From Coprocessor Register (MRC)
\r
112 WM_TMOVMSK_OP2 = 1,
\r
113 WM_TMOVMSK_CPNUM = 0,
\r
116 WM_TANDC_CPNUM = 1,
\r
122 WM_TEXTRC_CPNUM = 1,
\r
125 WM_TEXTRM_CPNUM = 0
\r
130 * TANDC<B,H,W>{Cond} R15
\r
131 * Performs AND across the fields of the SIMD PSR register (wCASF) and sends the result
\r
132 * to CPSR; can be performed after a Byte, Half-word or Word operation that sets the flags.
\r
133 * NOTE: R15 is omitted from the macro declaration;
\r
135 #define DEF_WM_TNADC_CC(_q, _cc) WM_DEF_CC((_cc)) + ((_q) << 0x16) + 0xE13F130
\r
137 #define _WM_TNADC_CC(_q, _cc) WM_ASM(DEF_WM_TNADC_CC(_q, _cc))
\r
138 #define ARM_WM_TNADC_CC(_p, _q, _cc) WM_EMIT(_p, DEF_WM_TNADC_CC(_q, _cc))
\r
140 /* inline assembly */
\r
141 #define _WM_TNADC(_q) _WM_TNADC_CC((_q), WM_CC_AL)
\r
142 #define _WM_TNADCB() _WM_TNADC(WM_B)
\r
143 #define _WM_TNADCH() _WM_TNADC(WM_H)
\r
144 #define _WM_TNADCD() _WM_TNADC(WM_D)
\r
147 #define ARM_WM_TNADC(_p, _q) ARM_WM_TNADC_CC((_p), (_q), WM_CC_AL)
\r
148 #define ARM_WM_TNADCB(_p) ARM_WM_TNADC(_p, WM_B)
\r
149 #define ARM_WM_TNADCH(_p) ARM_WM_TNADC(_p, WM_H)
\r
150 #define ARM_WM_TNADCD(_p) ARM_WM_TNADC(_p, WM_D)
\r
154 * TBCST<B,H,W>{Cond} wRd, Rn
\r
155 * Broadcasts a value from the ARM Source reg (Rn) to every SIMD position
\r
156 * in the WMMX Destination reg (wRd).
\r
158 #define DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn) \
\r
159 WM_DEF_CC((_cc)) + ((_q) << 6) + ((_wrd) << 16) + ((_rn) << 12) + 0xE200010
\r
161 #define _WM_TBCST_CC(_q, _cc, _wrd, _rn) WM_ASM(DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn))
\r
162 #define ARM_WM_TBCST_CC(_p, _q, _cc, _wrd, _rn) WM_EMIT(_p, DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn))
\r
165 #define _WM_TBCST(_q, _wrd, _rn) _WM_TBCST_CC(_q, WM_CC_AL, _wrd, _rn)
\r
166 #define _WM_TBCSTB(_wrd, _rn) _WM_TBCST(WM_B)
\r
167 #define _WM_TBCSTH(_wrd, _rn) _WM_TBCST(WM_H)
\r
168 #define _WM_TBCSTD(_wrd, _rn) _WM_TBCST(WM_D)
\r
171 #define ARM_WM_TBCST(_p, _q, _wrd, _rn) ARM_WM_TBCST_CC(_p, _q, WM_CC_AL, _wrd, _rn)
\r
172 #define ARM_WM_TBCSTB(_p, _wrd, _rn) _WM_TBCST(_p, WM_B)
\r
173 #define ARM_WM_TBCSTH(_p, _wrd, _rn) _WM_TBCST(_p, WM_H)
\r
174 #define ARM_WM_TBCSTD(_p, _wrd, _rn) _WM_TBCST(_p, WM_D)
\r
177 #endif /* __WMMX_H__ */
\r