1 #ifndef __MONO_ARM_VFP_CODEGEN_H__
2 #define __MONO_ARM_VFP_CODEGEN_H__
4 #include "arm-codegen.h"
41 ARM_VFP_D0 = ARM_VFP_F0,
42 ARM_VFP_D1 = ARM_VFP_F2,
43 ARM_VFP_D2 = ARM_VFP_F4,
44 ARM_VFP_D3 = ARM_VFP_F6,
45 ARM_VFP_D4 = ARM_VFP_F8,
46 ARM_VFP_D5 = ARM_VFP_F10,
47 ARM_VFP_D6 = ARM_VFP_F12,
48 ARM_VFP_D7 = ARM_VFP_F14,
49 ARM_VFP_D8 = ARM_VFP_F16,
50 ARM_VFP_D9 = ARM_VFP_F18,
51 ARM_VFP_D10 = ARM_VFP_F20,
52 ARM_VFP_D11 = ARM_VFP_F22,
53 ARM_VFP_D12 = ARM_VFP_F24,
54 ARM_VFP_D13 = ARM_VFP_F26,
55 ARM_VFP_D14 = ARM_VFP_F28,
56 ARM_VFP_D15 = ARM_VFP_F30,
58 ARM_VFP_COPROC_SINGLE = 10,
59 ARM_VFP_COPROC_DOUBLE = 11,
61 #define ARM_VFP_OP(p,q,r,s) (((p) << 23) | ((q) << 21) | ((r) << 20) | ((s) << 6))
62 #define ARM_VFP_OP2(Fn,N) (ARM_VFP_OP (1,1,1,1) | ((Fn) << 16) | ((N) << 7))
64 ARM_VFP_MUL = ARM_VFP_OP (0,1,0,0),
65 ARM_VFP_NMUL = ARM_VFP_OP (0,1,0,1),
66 ARM_VFP_ADD = ARM_VFP_OP (0,1,1,0),
67 ARM_VFP_SUB = ARM_VFP_OP (0,1,1,1),
68 ARM_VFP_DIV = ARM_VFP_OP (1,0,0,0),
70 ARM_VFP_CPY = ARM_VFP_OP2 (0,0),
71 ARM_VFP_ABS = ARM_VFP_OP2 (0,1),
72 ARM_VFP_NEG = ARM_VFP_OP2 (1,0),
73 ARM_VFP_SQRT = ARM_VFP_OP2 (1,1),
74 ARM_VFP_CMP = ARM_VFP_OP2 (4,0),
75 ARM_VFP_CMPE = ARM_VFP_OP2 (4,1),
76 ARM_VFP_CMPZ = ARM_VFP_OP2 (5,0),
77 ARM_VFP_CMPEZ = ARM_VFP_OP2 (5,1),
78 ARM_VFP_CVT = ARM_VFP_OP2 (7,1),
79 ARM_VFP_UITO = ARM_VFP_OP2 (8,0),
80 ARM_VFP_SITO = ARM_VFP_OP2 (8,1),
81 ARM_VFP_TOUI = ARM_VFP_OP2 (12,0),
82 ARM_VFP_TOSI = ARM_VFP_OP2 (13,0),
83 ARM_VFP_TOUIZ = ARM_VFP_OP2 (12,1),
84 ARM_VFP_TOSIZ = ARM_VFP_OP2 (13,1),
91 #define ARM_DEF_VFP_DYADIC(cond,cp,op,Fd,Fn,Fm) \
95 (((Fd) >> 1) << 12) | \
96 (((Fd) & 1) << 22) | \
97 (((Fn) >> 1) << 16) | \
99 (((Fm) >> 1) << 0) | \
100 (((Fm) & 1) << 5) | \
103 #define ARM_DEF_VFP_MONADIC(cond,cp,op,Fd,Fm) \
107 (((Fd) >> 1) << 12) | \
108 (((Fd) & 1) << 22) | \
109 (((Fm) >> 1) << 0) | \
110 (((Fm) & 1) << 5) | \
113 #define ARM_DEF_VFP_LSF(cond,cp,post,ls,wback,basereg,Fd,offset) \
114 ((offset) >= 0? (offset)>>2: -(offset)>>2) | \
117 (((Fd) >> 1) << 12) | \
118 (((Fd) & 1) << 22) | \
119 ((basereg) << 16) | \
122 (((offset) >= 0) << 23) | \
127 #define ARM_DEF_VFP_CPT(cond,cp,op,L,Fn,Rd) \
134 (((Fn) >> 1) << 16) | \
135 (((Fn) & 1) << 7) | \
138 /* FP load and stores */
139 #define ARM_FLDS_COND(p,freg,base,offset,cond) \
140 ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_SINGLE,1,ARMOP_LDR,0,(base),(freg),(offset)))
141 #define ARM_FLDS(p,freg,base,offset) \
142 ARM_FLDS_COND(p,freg,base,offset,ARMCOND_AL)
144 #define ARM_FLDD_COND(p,freg,base,offset,cond) \
145 ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,1,ARMOP_LDR,0,(base),(freg),(offset)))
146 #define ARM_FLDD(p,freg,base,offset) \
147 ARM_FLDD_COND(p,freg,base,offset,ARMCOND_AL)
149 #define ARM_FSTS_COND(p,freg,base,offset,cond) \
150 ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_SINGLE,1,ARMOP_STR,0,(base),(freg),(offset)))
151 #define ARM_FSTS(p,freg,base,offset) \
152 ARM_FSTS_COND(p,freg,base,offset,ARMCOND_AL)
154 #define ARM_FSTD_COND(p,freg,base,offset,cond) \
155 ARM_EMIT((p), ARM_DEF_VFP_LSF((cond),ARM_VFP_COPROC_DOUBLE,1,ARMOP_STR,0,(base),(freg),(offset)))
156 #define ARM_FSTD(p,freg,base,offset) \
157 ARM_FSTD_COND(p,freg,base,offset,ARMCOND_AL)
159 #include "arm_vfpmacros.h"
161 #define ARM_DEF_VFP_CPT(cond,cp,op,L,Fn,Rd)
162 /* coprocessor register transfer */
163 #define ARM_FMSR(p,freg,reg) \
164 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,0,0,(freg),(reg)))
165 #define ARM_FMRS(p,reg,freg) \
166 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,0,1,(freg),(reg)))
168 #define ARM_FMDLR(p,freg,reg) \
169 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,0,0,(freg),(reg)))
170 #define ARM_FMRDL(p,reg,freg) \
171 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,0,1,(freg),(reg)))
172 #define ARM_FMDHR(p,freg,reg) \
173 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,1,0,(freg),(reg)))
174 #define ARM_FMRDH(p,reg,freg) \
175 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_DOUBLE,1,1,(freg),(reg)))
177 #define ARM_FMXR(p,freg,reg) \
178 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,7,0,(freg),(reg)))
179 #define ARM_FMRX(p,reg,freg) \
180 ARM_EMIT((p), ARM_DEF_VFP_CPT(ARMCOND_AL,ARM_VFP_COPROC_SINGLE,7,1,(freg),(reg)))
182 #endif /* __MONO_ARM_VFP_CODEGEN_H__ */