427c4fc9f6066e5670172dc81c3dac0dafc52747
[mono.git] / mono / arch / arm / arm-wmmx.h
1 /*\r
2  * ARM CodeGen\r
3  * XScale WirelessMMX extensions\r
4  * Copyright 2002 Wild West Software\r
5  */\r
6 \r
7 #ifndef __WMMX_H__\r
8 #define __WMMX_H__ 1\r
9 \r
10 #if 0\r
11 #include <arm-codegen.h>\r
12 #endif\r
13 \r
14 #if defined(ARM_IASM)\r
15 #       define WM_ASM(_expr) ARM_IASM(_expr)\r
16 #else\r
17 #       define WM_ASM(_expr) __emit (_expr)\r
18 #endif\r
19 \r
20 #if defined(ARM_EMIT)\r
21 #       define WM_EMIT(p, i) ARM_EMIT(p, i)\r
22 #else\r
23 #       define WM_EMIT(p, i) \r
24 #endif\r
25 \r
26 enum {\r
27         WM_CC_EQ = 0x0,\r
28         WM_CC_NE = 0x1,\r
29         WM_CC_CS = 0x2,\r
30         WM_CC_HS = WM_CC_CS,\r
31         WM_CC_CC = 0x3,\r
32         WM_CC_LO = WM_CC_CC,\r
33         WM_CC_MI = 0x4,\r
34         WM_CC_PL = 0x5,\r
35         WM_CC_VS = 0x6,\r
36         WM_CC_VC = 0x7,\r
37         WM_CC_HI = 0x8,\r
38         WM_CC_LS = 0x9,\r
39         WM_CC_GE = 0xA,\r
40         WM_CC_LT = 0xB,\r
41         WM_CC_GT = 0xC,\r
42         WM_CC_LE = 0xD,\r
43         WM_CC_AL = 0xE,\r
44         WM_CC_NV = 0xF,\r
45         WM_CC_SHIFT = 28\r
46 };\r
47 \r
48 #if defined(ARM_DEF_COND)\r
49 #       define WM_DEF_CC(_cc) ARM_DEF_COND(_cc)\r
50 #else\r
51 #       define WM_DEF_CC(_cc) ((_cc & 0xF) << WM_CC_SHIFT)\r
52 #endif\r
53 \r
54 \r
55 enum {\r
56         WM_R0   = 0x0,\r
57         WM_R1   = 0x1,\r
58         WM_R2   = 0x2,\r
59         WM_R3   = 0x3,\r
60         WM_R4   = 0x4,\r
61         WM_R5   = 0x5,\r
62         WM_R6   = 0x6,\r
63         WM_R7   = 0x7,\r
64         WM_R8   = 0x8,\r
65         WM_R9   = 0x9,\r
66         WM_R10  = 0xA,\r
67         WM_R11  = 0xB,\r
68         WM_R12  = 0xC,\r
69         WM_R13  = 0xD,\r
70         WM_R14  = 0xE,\r
71         WM_R15  = 0xF,\r
72 \r
73         WM_wR0  = 0x0,\r
74         WM_wR1  = 0x1,\r
75         WM_wR2  = 0x2,\r
76         WM_wR3  = 0x3,\r
77         WM_wR4  = 0x4,\r
78         WM_wR5  = 0x5,\r
79         WM_wR6  = 0x6,\r
80         WM_wR7  = 0x7,\r
81         WM_wR8  = 0x8,\r
82         WM_wR9  = 0x9,\r
83         WM_wR10 = 0xA,\r
84         WM_wR11 = 0xB,\r
85         WM_wR12 = 0xC,\r
86         WM_wR13 = 0xD,\r
87         WM_wR14 = 0xE,\r
88         WM_wR15 = 0xF\r
89 };\r
90 \r
91 \r
92 /*\r
93  * Qualifiers:\r
94  *      H - 16-bit (HalfWord) SIMD\r
95  *      W - 32-bit (Word) SIMD\r
96  *      D - 64-bit (Double)\r
97  */\r
98 enum {\r
99         WM_B = 0,\r
100         WM_H = 1,\r
101         WM_D = 2\r
102 };\r
103 \r
104 /*\r
105  * B.2.3 Transfers From Coprocessor Register (MRC)\r
106  * Table B-5\r
107  */\r
108 enum {\r
109         WM_TMRC_OP2      = 0,\r
110         WM_TMRC_CPNUM    = 1,\r
111 \r
112         WM_TMOVMSK_OP2   = 1,\r
113         WM_TMOVMSK_CPNUM = 0,\r
114 \r
115         WM_TANDC_OP2     = 1,\r
116         WM_TANDC_CPNUM   = 1,\r
117 \r
118         WM_TORC_OP2      = 2,\r
119         WM_TORC_CPNUM    = 1,\r
120 \r
121         WM_TEXTRC_OP2    = 3,\r
122         WM_TEXTRC_CPNUM  = 1,\r
123 \r
124         WM_TEXTRM_OP2    = 3,\r
125         WM_TEXTRM_CPNUM  = 0\r
126 };\r
127 \r
128 \r
129 /*\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
134  */\r
135 #define DEF_WM_TNADC_CC(_q, _cc) WM_DEF_CC((_cc)) + ((_q) << 0x16) + 0xE13F130\r
136 \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
139 \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
145 \r
146 /* codegen */\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
151 \r
152 \r
153 /*\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
157  */\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
160 \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
163 \r
164 /* inline */\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
169 \r
170 /* codegen */\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
175 \r
176 \r
177 #endif /* __WMMX_H__ */\r