58 |
58 |
|
59 |
59 |
#define F_HELPER(name, p) void helper_f##name##p(void)
|
60 |
60 |
|
61 |
|
#if defined(CONFIG_USER_ONLY)
|
62 |
|
#define F_BINOP(name) \
|
63 |
|
F_HELPER(name, s) \
|
64 |
|
{ \
|
65 |
|
FT0 = float32_ ## name (FT0, FT1, &env->fp_status); \
|
66 |
|
} \
|
67 |
|
F_HELPER(name, d) \
|
68 |
|
{ \
|
69 |
|
DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \
|
70 |
|
} \
|
71 |
|
F_HELPER(name, q) \
|
72 |
|
{ \
|
73 |
|
QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \
|
74 |
|
}
|
75 |
|
#else
|
76 |
61 |
#define F_BINOP(name) \
|
77 |
62 |
F_HELPER(name, s) \
|
78 |
63 |
{ \
|
... | ... | |
82 |
67 |
{ \
|
83 |
68 |
DT0 = float64_ ## name (DT0, DT1, &env->fp_status); \
|
84 |
69 |
}
|
85 |
|
#endif
|
86 |
70 |
|
87 |
71 |
F_BINOP(add);
|
88 |
72 |
F_BINOP(sub);
|
... | ... | |
97 |
81 |
&env->fp_status);
|
98 |
82 |
}
|
99 |
83 |
|
100 |
|
#if defined(CONFIG_USER_ONLY)
|
101 |
|
void helper_fdmulq(void)
|
102 |
|
{
|
103 |
|
QT0 = float128_mul(float64_to_float128(DT0, &env->fp_status),
|
104 |
|
float64_to_float128(DT1, &env->fp_status),
|
105 |
|
&env->fp_status);
|
106 |
|
}
|
107 |
|
#endif
|
108 |
|
|
109 |
84 |
F_HELPER(neg, s)
|
110 |
85 |
{
|
111 |
86 |
FT0 = float32_chs(FT1);
|
... | ... | |
116 |
91 |
{
|
117 |
92 |
DT0 = float64_chs(DT1);
|
118 |
93 |
}
|
119 |
|
|
120 |
|
#if defined(CONFIG_USER_ONLY)
|
121 |
|
F_HELPER(neg, q)
|
122 |
|
{
|
123 |
|
QT0 = float128_chs(QT1);
|
124 |
|
}
|
125 |
|
#endif
|
126 |
94 |
#endif
|
127 |
95 |
|
128 |
96 |
/* Integer to float conversion. */
|
... | ... | |
136 |
104 |
DT0 = int32_to_float64(*((int32_t *)&FT1), &env->fp_status);
|
137 |
105 |
}
|
138 |
106 |
|
139 |
|
#if defined(CONFIG_USER_ONLY)
|
140 |
|
F_HELPER(ito, q)
|
141 |
|
{
|
142 |
|
QT0 = int32_to_float128(*((int32_t *)&FT1), &env->fp_status);
|
143 |
|
}
|
144 |
|
#endif
|
145 |
|
|
146 |
107 |
#ifdef TARGET_SPARC64
|
147 |
108 |
F_HELPER(xto, s)
|
148 |
109 |
{
|
... | ... | |
153 |
114 |
{
|
154 |
115 |
DT0 = int64_to_float64(*((int64_t *)&DT1), &env->fp_status);
|
155 |
116 |
}
|
156 |
|
#if defined(CONFIG_USER_ONLY)
|
157 |
|
F_HELPER(xto, q)
|
158 |
|
{
|
159 |
|
QT0 = int64_to_float128(*((int64_t *)&DT1), &env->fp_status);
|
160 |
|
}
|
161 |
|
#endif
|
162 |
117 |
#endif
|
163 |
118 |
#undef F_HELPER
|
164 |
119 |
|
... | ... | |
173 |
128 |
DT0 = float32_to_float64(FT1, &env->fp_status);
|
174 |
129 |
}
|
175 |
130 |
|
176 |
|
#if defined(CONFIG_USER_ONLY)
|
177 |
|
void helper_fqtos(void)
|
178 |
|
{
|
179 |
|
FT0 = float128_to_float32(QT1, &env->fp_status);
|
180 |
|
}
|
181 |
|
|
182 |
|
void helper_fstoq(void)
|
183 |
|
{
|
184 |
|
QT0 = float32_to_float128(FT1, &env->fp_status);
|
185 |
|
}
|
186 |
|
|
187 |
|
void helper_fqtod(void)
|
188 |
|
{
|
189 |
|
DT0 = float128_to_float64(QT1, &env->fp_status);
|
190 |
|
}
|
191 |
|
|
192 |
|
void helper_fdtoq(void)
|
193 |
|
{
|
194 |
|
QT0 = float64_to_float128(DT1, &env->fp_status);
|
195 |
|
}
|
196 |
|
#endif
|
197 |
|
|
198 |
131 |
/* Float to integer conversion. */
|
199 |
132 |
void helper_fstoi(void)
|
200 |
133 |
{
|
... | ... | |
206 |
139 |
*((int32_t *)&FT0) = float64_to_int32_round_to_zero(DT1, &env->fp_status);
|
207 |
140 |
}
|
208 |
141 |
|
209 |
|
#if defined(CONFIG_USER_ONLY)
|
210 |
|
void helper_fqtoi(void)
|
211 |
|
{
|
212 |
|
*((int32_t *)&FT0) = float128_to_int32_round_to_zero(QT1, &env->fp_status);
|
213 |
|
}
|
214 |
|
#endif
|
215 |
|
|
216 |
142 |
#ifdef TARGET_SPARC64
|
217 |
143 |
void helper_fstox(void)
|
218 |
144 |
{
|
... | ... | |
224 |
150 |
*((int64_t *)&DT0) = float64_to_int64_round_to_zero(DT1, &env->fp_status);
|
225 |
151 |
}
|
226 |
152 |
|
227 |
|
#if defined(CONFIG_USER_ONLY)
|
228 |
|
void helper_fqtox(void)
|
229 |
|
{
|
230 |
|
*((int64_t *)&DT0) = float128_to_int64_round_to_zero(QT1, &env->fp_status);
|
231 |
|
}
|
232 |
|
#endif
|
233 |
|
|
234 |
153 |
void helper_faligndata(void)
|
235 |
154 |
{
|
236 |
155 |
uint64_t tmp;
|
... | ... | |
718 |
637 |
{
|
719 |
638 |
DT0 = float64_abs(DT1);
|
720 |
639 |
}
|
721 |
|
|
722 |
|
#if defined(CONFIG_USER_ONLY)
|
723 |
|
void helper_fabsq(void)
|
724 |
|
{
|
725 |
|
QT0 = float128_abs(QT1);
|
726 |
|
}
|
727 |
|
#endif
|
728 |
640 |
#endif
|
729 |
641 |
|
730 |
642 |
void helper_fsqrts(void)
|
... | ... | |
737 |
649 |
DT0 = float64_sqrt(DT1, &env->fp_status);
|
738 |
650 |
}
|
739 |
651 |
|
740 |
|
#if defined(CONFIG_USER_ONLY)
|
741 |
|
void helper_fsqrtq(void)
|
742 |
|
{
|
743 |
|
QT0 = float128_sqrt(QT1, &env->fp_status);
|
744 |
|
}
|
745 |
|
#endif
|
746 |
|
|
747 |
652 |
#define GEN_FCMP(name, size, reg1, reg2, FS, TRAP) \
|
748 |
653 |
void glue(helper_, name) (void) \
|
749 |
654 |
{ \
|
... | ... | |
781 |
686 |
GEN_FCMP(fcmpes, float32, FT0, FT1, 0, 1);
|
782 |
687 |
GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1);
|
783 |
688 |
|
784 |
|
#ifdef CONFIG_USER_ONLY
|
785 |
|
GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0);
|
786 |
|
GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1);
|
787 |
|
#endif
|
788 |
|
|
789 |
689 |
#ifdef TARGET_SPARC64
|
790 |
690 |
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0);
|
791 |
691 |
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0);
|
... | ... | |
804 |
704 |
|
805 |
705 |
GEN_FCMP(fcmpes_fcc3, float32, FT0, FT1, 26, 1);
|
806 |
706 |
GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1);
|
807 |
|
#ifdef CONFIG_USER_ONLY
|
808 |
|
GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0);
|
809 |
|
GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0);
|
810 |
|
GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0);
|
811 |
|
GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1);
|
812 |
|
GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1);
|
813 |
|
GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1);
|
814 |
|
#endif
|
815 |
707 |
#endif
|
816 |
708 |
|
817 |
709 |
#if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY) && defined(DEBUG_MXCC)
|