First set of licensing changes
[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  * Licensed under the MIT license. See LICENSE file in the project root for full license information.\r
6  */\r
7 \r
8 #ifndef __WMMX_H__\r
9 #define __WMMX_H__ 1\r
10 \r
11 #if 0\r
12 #include <arm-codegen.h>\r
13 #endif\r
14 \r
15 #if defined(ARM_IASM)\r
16 #       define WM_ASM(_expr) ARM_IASM(_expr)\r
17 #else\r
18 #       define WM_ASM(_expr) __emit (_expr)\r
19 #endif\r
20 \r
21 #if defined(ARM_EMIT)\r
22 #       define WM_EMIT(p, i) ARM_EMIT(p, i)\r
23 #else\r
24 #       define WM_EMIT(p, i) \r
25 #endif\r
26 \r
27 enum {\r
28         WM_CC_EQ = 0x0,\r
29         WM_CC_NE = 0x1,\r
30         WM_CC_CS = 0x2,\r
31         WM_CC_HS = WM_CC_CS,\r
32         WM_CC_CC = 0x3,\r
33         WM_CC_LO = WM_CC_CC,\r
34         WM_CC_MI = 0x4,\r
35         WM_CC_PL = 0x5,\r
36         WM_CC_VS = 0x6,\r
37         WM_CC_VC = 0x7,\r
38         WM_CC_HI = 0x8,\r
39         WM_CC_LS = 0x9,\r
40         WM_CC_GE = 0xA,\r
41         WM_CC_LT = 0xB,\r
42         WM_CC_GT = 0xC,\r
43         WM_CC_LE = 0xD,\r
44         WM_CC_AL = 0xE,\r
45         WM_CC_NV = 0xF,\r
46         WM_CC_SHIFT = 28\r
47 };\r
48 \r
49 #if defined(ARM_DEF_COND)\r
50 #       define WM_DEF_CC(_cc) ARM_DEF_COND(_cc)\r
51 #else\r
52 #       define WM_DEF_CC(_cc) ((_cc & 0xF) << WM_CC_SHIFT)\r
53 #endif\r
54 \r
55 \r
56 enum {\r
57         WM_R0   = 0x0,\r
58         WM_R1   = 0x1,\r
59         WM_R2   = 0x2,\r
60         WM_R3   = 0x3,\r
61         WM_R4   = 0x4,\r
62         WM_R5   = 0x5,\r
63         WM_R6   = 0x6,\r
64         WM_R7   = 0x7,\r
65         WM_R8   = 0x8,\r
66         WM_R9   = 0x9,\r
67         WM_R10  = 0xA,\r
68         WM_R11  = 0xB,\r
69         WM_R12  = 0xC,\r
70         WM_R13  = 0xD,\r
71         WM_R14  = 0xE,\r
72         WM_R15  = 0xF,\r
73 \r
74         WM_wR0  = 0x0,\r
75         WM_wR1  = 0x1,\r
76         WM_wR2  = 0x2,\r
77         WM_wR3  = 0x3,\r
78         WM_wR4  = 0x4,\r
79         WM_wR5  = 0x5,\r
80         WM_wR6  = 0x6,\r
81         WM_wR7  = 0x7,\r
82         WM_wR8  = 0x8,\r
83         WM_wR9  = 0x9,\r
84         WM_wR10 = 0xA,\r
85         WM_wR11 = 0xB,\r
86         WM_wR12 = 0xC,\r
87         WM_wR13 = 0xD,\r
88         WM_wR14 = 0xE,\r
89         WM_wR15 = 0xF\r
90 };\r
91 \r
92 \r
93 /*\r
94  * Qualifiers:\r
95  *      H - 16-bit (HalfWord) SIMD\r
96  *      W - 32-bit (Word) SIMD\r
97  *      D - 64-bit (Double)\r
98  */\r
99 enum {\r
100         WM_B = 0,\r
101         WM_H = 1,\r
102         WM_D = 2\r
103 };\r
104 \r
105 /*\r
106  * B.2.3 Transfers From Coprocessor Register (MRC)\r
107  * Table B-5\r
108  */\r
109 enum {\r
110         WM_TMRC_OP2      = 0,\r
111         WM_TMRC_CPNUM    = 1,\r
112 \r
113         WM_TMOVMSK_OP2   = 1,\r
114         WM_TMOVMSK_CPNUM = 0,\r
115 \r
116         WM_TANDC_OP2     = 1,\r
117         WM_TANDC_CPNUM   = 1,\r
118 \r
119         WM_TORC_OP2      = 2,\r
120         WM_TORC_CPNUM    = 1,\r
121 \r
122         WM_TEXTRC_OP2    = 3,\r
123         WM_TEXTRC_CPNUM  = 1,\r
124 \r
125         WM_TEXTRM_OP2    = 3,\r
126         WM_TEXTRM_CPNUM  = 0\r
127 };\r
128 \r
129 \r
130 /*\r
131  * TANDC<B,H,W>{Cond} R15\r
132  * Performs AND across the fields of the SIMD PSR register (wCASF) and sends the result\r
133  * to CPSR; can be performed after a Byte, Half-word or Word operation that sets the flags.\r
134  * NOTE: R15 is omitted from the macro declaration;\r
135  */\r
136 #define DEF_WM_TNADC_CC(_q, _cc) WM_DEF_CC((_cc)) + ((_q) << 0x16) + 0xE13F130\r
137 \r
138 #define _WM_TNADC_CC(_q, _cc) WM_ASM(DEF_WM_TNADC_CC(_q, _cc))\r
139 #define ARM_WM_TNADC_CC(_p, _q, _cc) WM_EMIT(_p, DEF_WM_TNADC_CC(_q, _cc))\r
140 \r
141 /* inline assembly */\r
142 #define _WM_TNADC(_q) _WM_TNADC_CC((_q), WM_CC_AL)\r
143 #define _WM_TNADCB() _WM_TNADC(WM_B)\r
144 #define _WM_TNADCH() _WM_TNADC(WM_H)\r
145 #define _WM_TNADCD() _WM_TNADC(WM_D)\r
146 \r
147 /* codegen */\r
148 #define ARM_WM_TNADC(_p, _q) ARM_WM_TNADC_CC((_p), (_q), WM_CC_AL)\r
149 #define ARM_WM_TNADCB(_p) ARM_WM_TNADC(_p, WM_B)\r
150 #define ARM_WM_TNADCH(_p) ARM_WM_TNADC(_p, WM_H)\r
151 #define ARM_WM_TNADCD(_p) ARM_WM_TNADC(_p, WM_D)\r
152 \r
153 \r
154 /*\r
155  * TBCST<B,H,W>{Cond} wRd, Rn\r
156  * Broadcasts a value from the ARM Source reg (Rn) to every SIMD position\r
157  * in the WMMX Destination reg (wRd).\r
158  */\r
159 #define DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn) \\r
160         WM_DEF_CC((_cc)) + ((_q) << 6) + ((_wrd) << 16) + ((_rn) << 12) + 0xE200010\r
161 \r
162 #define _WM_TBCST_CC(_q, _cc, _wrd, _rn) WM_ASM(DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn))\r
163 #define ARM_WM_TBCST_CC(_p, _q, _cc, _wrd, _rn) WM_EMIT(_p, DEF_WM_TBCST_CC(_q, _cc, _wrd, _rn))\r
164 \r
165 /* inline */\r
166 #define _WM_TBCST(_q, _wrd, _rn) _WM_TBCST_CC(_q, WM_CC_AL, _wrd, _rn)\r
167 #define _WM_TBCSTB(_wrd, _rn) _WM_TBCST(WM_B)\r
168 #define _WM_TBCSTH(_wrd, _rn) _WM_TBCST(WM_H)\r
169 #define _WM_TBCSTD(_wrd, _rn) _WM_TBCST(WM_D)\r
170 \r
171 /* codegen */\r
172 #define ARM_WM_TBCST(_p, _q, _wrd, _rn) ARM_WM_TBCST_CC(_p, _q, WM_CC_AL, _wrd, _rn)\r
173 #define ARM_WM_TBCSTB(_p, _wrd, _rn) _WM_TBCST(_p, WM_B)\r
174 #define ARM_WM_TBCSTH(_p, _wrd, _rn) _WM_TBCST(_p, WM_H)\r
175 #define ARM_WM_TBCSTD(_p, _wrd, _rn) _WM_TBCST(_p, WM_D)\r
176 \r
177 \r
178 #endif /* __WMMX_H__ */\r