]> git.proxmox.com Git - qemu.git/blame - op-i386.c
added float support
[qemu.git] / op-i386.c
CommitLineData
7bfdb6d1
FB
1typedef unsigned char uint8_t;
2typedef unsigned short uint16_t;
3typedef unsigned int uint32_t;
4typedef unsigned long long uint64_t;
5
6typedef signed char int8_t;
7typedef signed short int16_t;
8typedef signed int int32_t;
9typedef signed long long int64_t;
10
367e86e8
FB
11#define NULL 0
12
7bfdb6d1
FB
13#ifdef __i386__
14register int T0 asm("esi");
15register int T1 asm("ebx");
16register int A0 asm("edi");
17register struct CPU86State *env asm("ebp");
18#define FORCE_RET() asm volatile ("ret");
19#endif
20#ifdef __powerpc__
21register int T0 asm("r24");
22register int T1 asm("r25");
23register int A0 asm("r26");
24register struct CPU86State *env asm("r27");
25#define FORCE_RET() asm volatile ("blr");
26#endif
27#ifdef __arm__
28register int T0 asm("r4");
29register int T1 asm("r5");
30register int A0 asm("r6");
31register struct CPU86State *env asm("r7");
32#define FORCE_RET() asm volatile ("mov pc, lr");
33#endif
34#ifdef __mips__
35register int T0 asm("s0");
36register int T1 asm("s1");
37register int A0 asm("s2");
38register struct CPU86State *env asm("s3");
39#define FORCE_RET() asm volatile ("jr $31");
40#endif
41#ifdef __sparc__
42register int T0 asm("l0");
43register int T1 asm("l1");
44register int A0 asm("l2");
45register struct CPU86State *env asm("l3");
46#define FORCE_RET() asm volatile ("retl ; nop");
47#endif
48
49#ifndef OPPROTO
50#define OPPROTO
51#endif
52
53#define xglue(x, y) x ## y
54#define glue(x, y) xglue(x, y)
55
56#define EAX (env->regs[R_EAX])
57#define ECX (env->regs[R_ECX])
58#define EDX (env->regs[R_EDX])
59#define EBX (env->regs[R_EBX])
60#define ESP (env->regs[R_ESP])
61#define EBP (env->regs[R_EBP])
62#define ESI (env->regs[R_ESI])
63#define EDI (env->regs[R_EDI])
64#define PC (env->pc)
65#define DF (env->df)
66
67#define CC_SRC (env->cc_src)
68#define CC_DST (env->cc_dst)
927f621e
FB
69#define CC_OP (env->cc_op)
70
71/* float macros */
72#define FT0 (env->ft0)
73#define ST0 (env->fpregs[env->fpstt])
74#define ST(n) (env->fpregs[(env->fpstt + (n)) & 7])
75#define ST1 ST(1)
7bfdb6d1
FB
76
77extern int __op_param1, __op_param2, __op_param3;
78#define PARAM1 ((long)(&__op_param1))
79#define PARAM2 ((long)(&__op_param2))
80#define PARAM3 ((long)(&__op_param3))
81
82#include "cpu-i386.h"
83
84typedef struct CCTable {
7bfdb6d1 85 int (*compute_all)(void); /* return all the flags */
367e86e8 86 int (*compute_c)(void); /* return the C flag */
7bfdb6d1
FB
87} CCTable;
88
367e86e8
FB
89extern CCTable cc_table[];
90
7bfdb6d1
FB
91uint8_t parity_table[256] = {
92 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
93 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
94 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
95 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
96 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
97 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
98 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
99 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
100 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
101 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
102 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
103 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
104 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
105 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
106 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
107 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
108 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
109 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
110 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
111 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
112 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
113 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
114 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
115 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
116 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
117 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
118 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
119 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
120 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
121 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
122 CC_P, 0, 0, CC_P, 0, CC_P, CC_P, 0,
123 0, CC_P, CC_P, 0, CC_P, 0, 0, CC_P,
124};
125
367e86e8
FB
126/* modulo 17 table */
127const uint8_t rclw_table[32] = {
128 0, 1, 2, 3, 4, 5, 6, 7,
129 8, 9,10,11,12,13,14,15,
130 16, 0, 1, 2, 3, 4, 5, 6,
131 7, 8, 9,10,11,12,13,14,
132};
7bfdb6d1 133
367e86e8
FB
134/* modulo 9 table */
135const uint8_t rclb_table[32] = {
136 0, 1, 2, 3, 4, 5, 6, 7,
137 8, 0, 1, 2, 3, 4, 5, 6,
138 7, 8, 0, 1, 2, 3, 4, 5,
139 6, 7, 8, 0, 1, 2, 3, 4,
140};
7bfdb6d1 141
927f621e
FB
142#ifdef USE_X86LDOUBLE
143/* an array of Intel 80-bit FP constants, to be loaded via integer ops */
144typedef unsigned short f15ld[5];
145const f15ld f15rk[] =
146{
147/*0*/ {0x0000,0x0000,0x0000,0x0000,0x0000},
148/*1*/ {0x0000,0x0000,0x0000,0x8000,0x3fff},
149/*pi*/ {0xc235,0x2168,0xdaa2,0xc90f,0x4000},
150/*lg2*/ {0xf799,0xfbcf,0x9a84,0x9a20,0x3ffd},
151/*ln2*/ {0x79ac,0xd1cf,0x17f7,0xb172,0x3ffe},
152/*l2e*/ {0xf0bc,0x5c17,0x3b29,0xb8aa,0x3fff},
153/*l2t*/ {0x8afe,0xcd1b,0x784b,0xd49a,0x4000}
154};
155#else
156/* the same, 64-bit version */
157typedef unsigned short f15ld[4];
158const f15ld f15rk[] =
159{
160#ifndef WORDS_BIGENDIAN
161/*0*/ {0x0000,0x0000,0x0000,0x0000},
162/*1*/ {0x0000,0x0000,0x0000,0x3ff0},
163/*pi*/ {0x2d18,0x5444,0x21fb,0x4009},
164/*lg2*/ {0x79ff,0x509f,0x4413,0x3fd3},
165/*ln2*/ {0x39ef,0xfefa,0x2e42,0x3fe6},
166/*l2e*/ {0x82fe,0x652b,0x1547,0x3ff7},
167/*l2t*/ {0xa371,0x0979,0x934f,0x400a}
168#else
169/*0*/ {0x0000,0x0000,0x0000,0x0000},
170/*1*/ {0x3ff0,0x0000,0x0000,0x0000},
171/*pi*/ {0x4009,0x21fb,0x5444,0x2d18},
172/*lg2*/ {0x3fd3,0x4413,0x509f,0x79ff},
173/*ln2*/ {0x3fe6,0x2e42,0xfefa,0x39ef},
174/*l2e*/ {0x3ff7,0x1547,0x652b,0x82fe},
175/*l2t*/ {0x400a,0x934f,0x0979,0xa371}
176#endif
177};
178#endif
179
367e86e8
FB
180/* n must be a constant to be efficient */
181static inline int lshift(int x, int n)
7bfdb6d1 182{
367e86e8
FB
183 if (n >= 0)
184 return x << n;
185 else
186 return x >> (-n);
7bfdb6d1 187}
7bfdb6d1
FB
188
189/* we define the various pieces of code used by the JIT */
190
191#define REG EAX
192#define REGNAME _EAX
193#include "opreg_template.h"
194#undef REG
195#undef REGNAME
196
197#define REG ECX
198#define REGNAME _ECX
199#include "opreg_template.h"
200#undef REG
201#undef REGNAME
202
203#define REG EDX
204#define REGNAME _EDX
205#include "opreg_template.h"
206#undef REG
207#undef REGNAME
208
209#define REG EBX
210#define REGNAME _EBX
211#include "opreg_template.h"
212#undef REG
213#undef REGNAME
214
215#define REG ESP
216#define REGNAME _ESP
217#include "opreg_template.h"
218#undef REG
219#undef REGNAME
220
221#define REG EBP
222#define REGNAME _EBP
223#include "opreg_template.h"
224#undef REG
225#undef REGNAME
226
227#define REG ESI
228#define REGNAME _ESI
229#include "opreg_template.h"
230#undef REG
231#undef REGNAME
232
233#define REG EDI
234#define REGNAME _EDI
235#include "opreg_template.h"
236#undef REG
237#undef REGNAME
238
239/* operations */
240
241void OPPROTO op_addl_T0_T1_cc(void)
242{
243 CC_SRC = T0;
244 T0 += T1;
245 CC_DST = T0;
246}
247
248void OPPROTO op_orl_T0_T1_cc(void)
249{
250 T0 |= T1;
251 CC_DST = T0;
252}
253
254void OPPROTO op_adcl_T0_T1_cc(void)
255{
256 CC_SRC = T0;
257 T0 = T0 + T1 + cc_table[CC_OP].compute_c();
258 CC_DST = T0;
259}
260
261void OPPROTO op_sbbl_T0_T1_cc(void)
262{
263 CC_SRC = T0;
264 T0 = T0 - T1 - cc_table[CC_OP].compute_c();
265 CC_DST = T0;
266}
267
268void OPPROTO op_andl_T0_T1_cc(void)
269{
270 T0 &= T1;
271 CC_DST = T0;
272}
273
274void OPPROTO op_subl_T0_T1_cc(void)
275{
276 CC_SRC = T0;
277 T0 -= T1;
278 CC_DST = T0;
279}
280
281void OPPROTO op_xorl_T0_T1_cc(void)
282{
283 T0 ^= T1;
284 CC_DST = T0;
285}
286
287void OPPROTO op_cmpl_T0_T1_cc(void)
288{
289 CC_SRC = T0;
290 CC_DST = T0 - T1;
291}
292
293void OPPROTO op_notl_T0(void)
294{
295 T0 = ~T0;
296}
297
298void OPPROTO op_negl_T0_cc(void)
299{
300 CC_SRC = 0;
301 T0 = -T0;
302 CC_DST = T0;
303}
304
305void OPPROTO op_incl_T0_cc(void)
306{
307 T0++;
308 CC_DST = T0;
309}
310
311void OPPROTO op_decl_T0_cc(void)
312{
313 T0--;
314 CC_DST = T0;
315}
316
317void OPPROTO op_testl_T0_T1_cc(void)
318{
319 CC_SRC = T0;
320 CC_DST = T0 & T1;
321}
322
7bfdb6d1
FB
323/* multiply/divide */
324void OPPROTO op_mulb_AL_T0(void)
325{
326 unsigned int res;
327 res = (uint8_t)EAX * (uint8_t)T0;
328 EAX = (EAX & 0xffff0000) | res;
329 CC_SRC = (res & 0xff00);
330}
331
332void OPPROTO op_imulb_AL_T0(void)
333{
334 int res;
335 res = (int8_t)EAX * (int8_t)T0;
336 EAX = (EAX & 0xffff0000) | (res & 0xffff);
337 CC_SRC = (res != (int8_t)res);
338}
339
340void OPPROTO op_mulw_AX_T0(void)
341{
342 unsigned int res;
343 res = (uint16_t)EAX * (uint16_t)T0;
344 EAX = (EAX & 0xffff0000) | (res & 0xffff);
345 EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);
346 CC_SRC = res >> 16;
347}
348
349void OPPROTO op_imulw_AX_T0(void)
350{
351 int res;
352 res = (int16_t)EAX * (int16_t)T0;
353 EAX = (EAX & 0xffff0000) | (res & 0xffff);
354 EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);
355 CC_SRC = (res != (int16_t)res);
356}
357
358void OPPROTO op_mull_EAX_T0(void)
359{
360 uint64_t res;
361 res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0);
362 EAX = res;
363 EDX = res >> 32;
364 CC_SRC = res >> 32;
365}
366
367void OPPROTO op_imull_EAX_T0(void)
368{
369 int64_t res;
370 res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T0);
371 EAX = res;
372 EDX = res >> 32;
373 CC_SRC = (res != (int32_t)res);
374}
375
376void OPPROTO op_imulw_T0_T1(void)
377{
378 int res;
379 res = (int16_t)T0 * (int16_t)T1;
380 T0 = res;
381 CC_SRC = (res != (int16_t)res);
382}
383
384void OPPROTO op_imull_T0_T1(void)
385{
386 int64_t res;
387 res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T1);
388 T0 = res;
389 CC_SRC = (res != (int32_t)res);
390}
391
392/* division, flags are undefined */
393/* XXX: add exceptions for overflow & div by zero */
394void OPPROTO op_divb_AL_T0(void)
395{
396 unsigned int num, den, q, r;
397
398 num = (EAX & 0xffff);
399 den = (T0 & 0xff);
400 q = (num / den) & 0xff;
401 r = (num % den) & 0xff;
402 EAX = (EAX & 0xffff0000) | (r << 8) | q;
403}
404
405void OPPROTO op_idivb_AL_T0(void)
406{
407 int num, den, q, r;
408
409 num = (int16_t)EAX;
410 den = (int8_t)T0;
411 q = (num / den) & 0xff;
412 r = (num % den) & 0xff;
413 EAX = (EAX & 0xffff0000) | (r << 8) | q;
414}
415
416void OPPROTO op_divw_AX_T0(void)
417{
418 unsigned int num, den, q, r;
419
420 num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);
421 den = (T0 & 0xffff);
422 q = (num / den) & 0xffff;
423 r = (num % den) & 0xffff;
424 EAX = (EAX & 0xffff0000) | q;
425 EDX = (EDX & 0xffff0000) | r;
426}
427
428void OPPROTO op_idivw_AX_T0(void)
429{
430 int num, den, q, r;
431
432 num = (EAX & 0xffff) | ((EDX & 0xffff) << 16);
433 den = (int16_t)T0;
434 q = (num / den) & 0xffff;
435 r = (num % den) & 0xffff;
436 EAX = (EAX & 0xffff0000) | q;
437 EDX = (EDX & 0xffff0000) | r;
438}
439
440void OPPROTO op_divl_EAX_T0(void)
441{
442 unsigned int den, q, r;
443 uint64_t num;
444
445 num = EAX | ((uint64_t)EDX << 32);
446 den = T0;
447 q = (num / den);
448 r = (num % den);
449 EAX = q;
450 EDX = r;
451}
452
453void OPPROTO op_idivl_EAX_T0(void)
454{
455 int den, q, r;
456 int16_t num;
457
458 num = EAX | ((uint64_t)EDX << 32);
459 den = (int16_t)T0;
460 q = (num / den);
461 r = (num % den);
462 EAX = q;
463 EDX = r;
464}
465
466/* constant load */
467
468void OPPROTO op1_movl_T0_im(void)
469{
470 T0 = PARAM1;
471}
472
473void OPPROTO op1_movl_T1_im(void)
474{
475 T1 = PARAM1;
476}
477
478void OPPROTO op1_movl_A0_im(void)
479{
480 A0 = PARAM1;
481}
482
483/* memory access */
484
485void OPPROTO op_ldub_T0_A0(void)
486{
487 T0 = ldub((uint8_t *)A0);
488}
489
490void OPPROTO op_ldsb_T0_A0(void)
491{
492 T0 = ldsb((int8_t *)A0);
493}
494
495void OPPROTO op_lduw_T0_A0(void)
496{
497 T0 = lduw((uint8_t *)A0);
498}
499
500void OPPROTO op_ldsw_T0_A0(void)
501{
502 T0 = ldsw((int8_t *)A0);
503}
504
505void OPPROTO op_ldl_T0_A0(void)
506{
507 T0 = ldl((uint8_t *)A0);
508}
509
510void OPPROTO op_ldub_T1_A0(void)
511{
512 T1 = ldub((uint8_t *)A0);
513}
514
515void OPPROTO op_ldsb_T1_A0(void)
516{
517 T1 = ldsb((int8_t *)A0);
518}
519
520void OPPROTO op_lduw_T1_A0(void)
521{
522 T1 = lduw((uint8_t *)A0);
523}
524
525void OPPROTO op_ldsw_T1_A0(void)
526{
527 T1 = ldsw((int8_t *)A0);
528}
529
530void OPPROTO op_ldl_T1_A0(void)
531{
532 T1 = ldl((uint8_t *)A0);
533}
534
535void OPPROTO op_stb_T0_A0(void)
536{
537 stb((uint8_t *)A0, T0);
538}
539
540void OPPROTO op_stw_T0_A0(void)
541{
542 stw((uint8_t *)A0, T0);
543}
544
545void OPPROTO op_stl_T0_A0(void)
546{
547 stl((uint8_t *)A0, T0);
548}
549
7bfdb6d1
FB
550/* jumps */
551
552/* indirect jump */
553void OPPROTO op_jmp_T0(void)
554{
555 PC = T0;
556}
557
558void OPPROTO op_jmp_im(void)
559{
560 PC = PARAM1;
561}
562
7bfdb6d1
FB
563/* string ops */
564
565#define ldul ldl
566
7bfdb6d1 567#define SHIFT 0
367e86e8 568#include "ops_template.h"
7bfdb6d1
FB
569#undef SHIFT
570
7bfdb6d1 571#define SHIFT 1
367e86e8 572#include "ops_template.h"
7bfdb6d1
FB
573#undef SHIFT
574
7bfdb6d1 575#define SHIFT 2
367e86e8 576#include "ops_template.h"
7bfdb6d1
FB
577#undef SHIFT
578
579/* sign extend */
580
581void OPPROTO op_movsbl_T0_T0(void)
582{
583 T0 = (int8_t)T0;
584}
585
586void OPPROTO op_movzbl_T0_T0(void)
587{
588 T0 = (uint8_t)T0;
589}
590
591void OPPROTO op_movswl_T0_T0(void)
592{
593 T0 = (int16_t)T0;
594}
595
596void OPPROTO op_movzwl_T0_T0(void)
597{
598 T0 = (uint16_t)T0;
599}
600
601void OPPROTO op_movswl_EAX_AX(void)
602{
603 EAX = (int16_t)EAX;
604}
605
606void OPPROTO op_movsbw_AX_AL(void)
607{
608 EAX = (EAX & 0xffff0000) | ((int8_t)EAX & 0xffff);
609}
610
611void OPPROTO op_movslq_EDX_EAX(void)
612{
613 EDX = (int32_t)EAX >> 31;
614}
615
616void OPPROTO op_movswl_DX_AX(void)
617{
618 EDX = (EDX & 0xffff0000) | (((int16_t)EAX >> 15) & 0xffff);
619}
620
621/* push/pop */
622/* XXX: add 16 bit operand/16 bit seg variants */
623
624void op_pushl_T0(void)
625{
626 uint32_t offset;
627 offset = ESP - 4;
628 stl((void *)offset, T0);
629 /* modify ESP after to handle exceptions correctly */
630 ESP = offset;
631}
632
633void op_pushl_T1(void)
634{
635 uint32_t offset;
636 offset = ESP - 4;
637 stl((void *)offset, T1);
638 /* modify ESP after to handle exceptions correctly */
639 ESP = offset;
640}
641
642void op_popl_T0(void)
643{
644 T0 = ldl((void *)ESP);
645 ESP += 4;
646}
647
648void op_addl_ESP_im(void)
649{
650 ESP += PARAM1;
651}
367e86e8
FB
652
653/* flags handling */
654
655/* slow jumps cases (compute x86 flags) */
656void OPPROTO op_jo_cc(void)
657{
658 int eflags;
659 eflags = cc_table[CC_OP].compute_all();
660 if (eflags & CC_O)
661 PC += PARAM1;
662 else
663 PC += PARAM2;
664}
665
666void OPPROTO op_jb_cc(void)
667{
668 if (cc_table[CC_OP].compute_c())
669 PC += PARAM1;
670 else
671 PC += PARAM2;
672}
673
674void OPPROTO op_jz_cc(void)
675{
676 int eflags;
677 eflags = cc_table[CC_OP].compute_all();
678 if (eflags & CC_Z)
679 PC += PARAM1;
680 else
681 PC += PARAM2;
682}
683
684void OPPROTO op_jbe_cc(void)
685{
686 int eflags;
687 eflags = cc_table[CC_OP].compute_all();
688 if (eflags & (CC_Z | CC_C))
689 PC += PARAM1;
690 else
691 PC += PARAM2;
692}
693
694void OPPROTO op_js_cc(void)
695{
696 int eflags;
697 eflags = cc_table[CC_OP].compute_all();
698 if (eflags & CC_S)
699 PC += PARAM1;
700 else
701 PC += PARAM2;
702}
703
704void OPPROTO op_jp_cc(void)
705{
706 int eflags;
707 eflags = cc_table[CC_OP].compute_all();
708 if (eflags & CC_P)
709 PC += PARAM1;
710 else
711 PC += PARAM2;
712}
713
714void OPPROTO op_jl_cc(void)
715{
716 int eflags;
717 eflags = cc_table[CC_OP].compute_all();
718 if ((eflags ^ (eflags >> 4)) & 0x80)
719 PC += PARAM1;
720 else
721 PC += PARAM2;
722}
723
724void OPPROTO op_jle_cc(void)
725{
726 int eflags;
727 eflags = cc_table[CC_OP].compute_all();
728 if (((eflags ^ (eflags >> 4)) & 0x80) || (eflags & CC_Z))
729 PC += PARAM1;
730 else
731 PC += PARAM2;
732}
733
734/* slow set cases (compute x86 flags) */
735void OPPROTO op_seto_T0_cc(void)
736{
737 int eflags;
738 eflags = cc_table[CC_OP].compute_all();
739 T0 = (eflags >> 11) & 1;
740}
741
742void OPPROTO op_setb_T0_cc(void)
743{
744 T0 = cc_table[CC_OP].compute_c();
745}
746
747void OPPROTO op_setz_T0_cc(void)
748{
749 int eflags;
750 eflags = cc_table[CC_OP].compute_all();
751 T0 = (eflags >> 6) & 1;
752}
753
754void OPPROTO op_setbe_T0_cc(void)
755{
756 int eflags;
757 eflags = cc_table[CC_OP].compute_all();
758 T0 = (eflags & (CC_Z | CC_C)) != 0;
759}
760
761void OPPROTO op_sets_T0_cc(void)
762{
763 int eflags;
764 eflags = cc_table[CC_OP].compute_all();
765 T0 = (eflags >> 7) & 1;
766}
767
768void OPPROTO op_setp_T0_cc(void)
769{
770 int eflags;
771 eflags = cc_table[CC_OP].compute_all();
772 T0 = (eflags >> 2) & 1;
773}
774
775void OPPROTO op_setl_T0_cc(void)
776{
777 int eflags;
778 eflags = cc_table[CC_OP].compute_all();
779 T0 = ((eflags ^ (eflags >> 4)) >> 7) & 1;
780}
781
782void OPPROTO op_setle_T0_cc(void)
783{
784 int eflags;
785 eflags = cc_table[CC_OP].compute_all();
786 T0 = (((eflags ^ (eflags >> 4)) & 0x80) || (eflags & CC_Z)) != 0;
787}
788
789void OPPROTO op_xor_T0_1(void)
790{
791 T0 ^= 1;
792}
793
794void OPPROTO op_set_cc_op(void)
795{
796 CC_OP = PARAM1;
797}
798
799void OPPROTO op_movl_eflags_T0(void)
800{
801 CC_SRC = T0;
802 DF = 1 - (2 * ((T0 >> 10) & 1));
803}
804
805/* XXX: compute only O flag */
806void OPPROTO op_movb_eflags_T0(void)
807{
808 int of;
809 of = cc_table[CC_OP].compute_all() & CC_O;
810 CC_SRC = T0 | of;
811}
812
813void OPPROTO op_movl_T0_eflags(void)
814{
815 T0 = cc_table[CC_OP].compute_all();
816 T0 |= (DF & DIRECTION_FLAG);
817}
818
819void OPPROTO op_cld(void)
820{
821 DF = 1;
822}
823
824void OPPROTO op_std(void)
825{
826 DF = -1;
827}
828
829void OPPROTO op_clc(void)
830{
831 int eflags;
832 eflags = cc_table[CC_OP].compute_all();
833 eflags &= ~CC_C;
834 CC_SRC = eflags;
835}
836
837void OPPROTO op_stc(void)
838{
839 int eflags;
840 eflags = cc_table[CC_OP].compute_all();
841 eflags |= CC_C;
842 CC_SRC = eflags;
843}
844
845void OPPROTO op_cmc(void)
846{
847 int eflags;
848 eflags = cc_table[CC_OP].compute_all();
849 eflags ^= CC_C;
850 CC_SRC = eflags;
851}
852
853static int compute_all_eflags(void)
854{
855 return CC_SRC;
856}
857
858static int compute_c_eflags(void)
859{
860 return CC_SRC & CC_C;
861}
862
863static int compute_c_mul(void)
864{
865 int cf;
866 cf = (CC_SRC != 0);
867 return cf;
868}
869
870static int compute_all_mul(void)
871{
872 int cf, pf, af, zf, sf, of;
873 cf = (CC_SRC != 0);
874 pf = 0; /* undefined */
875 af = 0; /* undefined */
876 zf = 0; /* undefined */
877 sf = 0; /* undefined */
878 of = cf << 11;
879 return cf | pf | af | zf | sf | of;
880}
881
882CCTable cc_table[CC_OP_NB] = {
883 [CC_OP_DYNAMIC] = { /* should never happen */ },
884
885 [CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags },
886
887 [CC_OP_MUL] = { compute_all_mul, compute_c_mul },
888
889 [CC_OP_ADDB] = { compute_all_addb, compute_c_addb },
890 [CC_OP_ADDW] = { compute_all_addw, compute_c_addw },
891 [CC_OP_ADDL] = { compute_all_addl, compute_c_addl },
892
893 [CC_OP_SUBB] = { compute_all_subb, compute_c_subb },
894 [CC_OP_SUBW] = { compute_all_subw, compute_c_subw },
895 [CC_OP_SUBL] = { compute_all_subl, compute_c_subl },
896
897 [CC_OP_LOGICB] = { compute_all_logicb, compute_c_logicb },
898 [CC_OP_LOGICW] = { compute_all_logicw, compute_c_logicw },
899 [CC_OP_LOGICL] = { compute_all_logicl, compute_c_logicl },
900
901 [CC_OP_INCB] = { compute_all_incb, compute_c_incb },
902 [CC_OP_INCW] = { compute_all_incw, compute_c_incw },
903 [CC_OP_INCL] = { compute_all_incl, compute_c_incl },
904
905 [CC_OP_DECB] = { compute_all_decb, compute_c_incb },
906 [CC_OP_DECW] = { compute_all_decw, compute_c_incw },
907 [CC_OP_DECL] = { compute_all_decl, compute_c_incl },
908
909 [CC_OP_SHLB] = { compute_all_shlb, compute_c_shlb },
910 [CC_OP_SHLW] = { compute_all_shlw, compute_c_shlw },
911 [CC_OP_SHLL] = { compute_all_shll, compute_c_shll },
912};
927f621e
FB
913
914/* floating point support */
915
916#ifdef USE_X86LDOUBLE
917/* use long double functions */
918#define lrint lrintl
919#define llrint llrintl
920#define fabs fabsl
921#define sin sinl
922#define cos cosl
923#define sqrt sqrtl
924#define pow powl
925#define log logl
926#define tan tanl
927#define atan2 atan2l
928#define floor floorl
929#define ceil ceill
930#define rint rintl
931#endif
932
933extern int lrint(CPU86_LDouble x);
934extern int64_t llrint(CPU86_LDouble x);
935extern CPU86_LDouble fabs(CPU86_LDouble x);
936extern CPU86_LDouble sin(CPU86_LDouble x);
937extern CPU86_LDouble cos(CPU86_LDouble x);
938extern CPU86_LDouble sqrt(CPU86_LDouble x);
939extern CPU86_LDouble pow(CPU86_LDouble, CPU86_LDouble);
940extern CPU86_LDouble log(CPU86_LDouble x);
941extern CPU86_LDouble tan(CPU86_LDouble x);
942extern CPU86_LDouble atan2(CPU86_LDouble, CPU86_LDouble);
943extern CPU86_LDouble floor(CPU86_LDouble x);
944extern CPU86_LDouble ceil(CPU86_LDouble x);
945extern CPU86_LDouble rint(CPU86_LDouble x);
946
947#define RC_MASK 0xc00
948#define RC_NEAR 0x000
949#define RC_DOWN 0x400
950#define RC_UP 0x800
951#define RC_CHOP 0xc00
952
953#define MAXTAN 9223372036854775808.0
954
955#ifdef USE_X86LDOUBLE
956
957/* only for x86 */
958typedef union {
959 long double d;
960 struct {
961 unsigned long long lower;
962 unsigned short upper;
963 } l;
964} CPU86_LDoubleU;
965
966/* the following deal with x86 long double-precision numbers */
967#define MAXEXPD 0x7fff
968#define EXPBIAS 16383
969#define EXPD(fp) (fp.l.upper & 0x7fff)
970#define SIGND(fp) ((fp.l.upper) & 0x8000)
971#define MANTD(fp) (fp.l.lower)
972#define BIASEXPONENT(fp) fp.l.upper = (fp.l.upper & ~(0x7fff)) | EXPBIAS
973
974#else
975
976typedef {
977 double d;
978#ifndef WORDS_BIGENDIAN
979 struct {
980 unsigned long lower;
981 long upper;
982 } l;
983#else
984 struct {
985 long upper;
986 unsigned long lower;
987 } l;
988#endif
989 long long ll;
990} CPU86_LDoubleU;
991
992/* the following deal with IEEE double-precision numbers */
993#define MAXEXPD 0x7ff
994#define EXPBIAS 1023
995#define EXPD(fp) (((fp.l.upper) >> 20) & 0x7FF)
996#define SIGND(fp) ((fp.l.upper) & 0x80000000)
997#define MANTD(fp) (fp.ll & ((1LL << 52) - 1))
998#define BIASEXPONENT(fp) fp.l.upper = (fp.l.upper & ~(0x7ff << 20)) | (EXPBIAS << 20)
999#endif
1000
1001/* fp load FT0 */
1002
1003void OPPROTO op_flds_FT0_A0(void)
1004{
1005 FT0 = ldfl((void *)A0);
1006}
1007
1008void OPPROTO op_fldl_FT0_A0(void)
1009{
1010 FT0 = ldfq((void *)A0);
1011}
1012
1013void OPPROTO op_fild_FT0_A0(void)
1014{
1015 FT0 = (CPU86_LDouble)ldsw((void *)A0);
1016}
1017
1018void OPPROTO op_fildl_FT0_A0(void)
1019{
1020 FT0 = (CPU86_LDouble)((int32_t)ldl((void *)A0));
1021}
1022
1023void OPPROTO op_fildll_FT0_A0(void)
1024{
1025 FT0 = (CPU86_LDouble)((int64_t)ldq((void *)A0));
1026}
1027
1028/* fp load ST0 */
1029
1030void OPPROTO op_flds_ST0_A0(void)
1031{
1032 ST0 = ldfl((void *)A0);
1033}
1034
1035void OPPROTO op_fldl_ST0_A0(void)
1036{
1037 ST0 = ldfq((void *)A0);
1038}
1039
1040void OPPROTO op_fild_ST0_A0(void)
1041{
1042 ST0 = (CPU86_LDouble)ldsw((void *)A0);
1043}
1044
1045void OPPROTO op_fildl_ST0_A0(void)
1046{
1047 ST0 = (CPU86_LDouble)((int32_t)ldl((void *)A0));
1048}
1049
1050void OPPROTO op_fildll_ST0_A0(void)
1051{
1052 ST0 = (CPU86_LDouble)((int64_t)ldq((void *)A0));
1053}
1054
1055/* fp store */
1056
1057void OPPROTO op_fsts_ST0_A0(void)
1058{
1059 stfl((void *)A0, (float)ST0);
1060}
1061
1062void OPPROTO op_fstl_ST0_A0(void)
1063{
1064 ST0 = ldfq((void *)A0);
1065}
1066
1067void OPPROTO op_fist_ST0_A0(void)
1068{
1069 int val;
1070 val = lrint(ST0);
1071 stw((void *)A0, val);
1072}
1073
1074void OPPROTO op_fistl_ST0_A0(void)
1075{
1076 int val;
1077 val = lrint(ST0);
1078 stl((void *)A0, val);
1079}
1080
1081void OPPROTO op_fistll_ST0_A0(void)
1082{
1083 int64_t val;
1084 val = llrint(ST0);
1085 stq((void *)A0, val);
1086}
1087
1088/* FPU move */
1089
1090static inline void fpush(void)
1091{
1092 env->fpstt = (env->fpstt - 1) & 7;
1093 env->fptags[env->fpstt] = 0; /* validate stack entry */
1094}
1095
1096static inline void fpop(void)
1097{
1098 env->fptags[env->fpstt] = 1; /* invvalidate stack entry */
1099 env->fpstt = (env->fpstt + 1) & 7;
1100}
1101
1102void OPPROTO op_fpush(void)
1103{
1104 fpush();
1105}
1106
1107void OPPROTO op_fpop(void)
1108{
1109 fpop();
1110}
1111
1112void OPPROTO op_fdecstp(void)
1113{
1114 env->fpstt = (env->fpstt - 1) & 7;
1115 env->fpus &= (~0x4700);
1116}
1117
1118void OPPROTO op_fincstp(void)
1119{
1120 env->fpstt = (env->fpstt + 1) & 7;
1121 env->fpus &= (~0x4700);
1122}
1123
1124void OPPROTO op_fmov_ST0_FT0(void)
1125{
1126 ST0 = FT0;
1127}
1128
1129void OPPROTO op_fmov_FT0_STN(void)
1130{
1131 FT0 = ST(PARAM1);
1132}
1133
1134void OPPROTO op_fmov_ST0_STN(void)
1135{
1136 ST0 = ST(PARAM1);
1137}
1138
1139void OPPROTO op_fmov_STN_ST0(void)
1140{
1141 ST(PARAM1) = ST0;
1142}
1143
1144void OPPROTO op_fxchg_ST0_STN(void)
1145{
1146 CPU86_LDouble tmp;
1147 tmp = ST(PARAM1);
1148 ST(PARAM1) = ST0;
1149 ST0 = tmp;
1150}
1151
1152/* FPU operations */
1153
1154/* XXX: handle nans */
1155void OPPROTO op_fcom_ST0_FT0(void)
1156{
1157 env->fpus &= (~0x4500); /* (C3,C2,C0) <-- 000 */
1158 if (ST0 < FT0)
1159 env->fpus |= 0x100; /* (C3,C2,C0) <-- 001 */
1160 else if (ST0 == FT0)
1161 env->fpus |= 0x4000; /* (C3,C2,C0) <-- 100 */
1162 FORCE_RET();
1163}
1164
1165void OPPROTO op_fadd_ST0_FT0(void)
1166{
1167 ST0 += FT0;
1168}
1169
1170void OPPROTO op_fmul_ST0_FT0(void)
1171{
1172 ST0 *= FT0;
1173}
1174
1175void OPPROTO op_fsub_ST0_FT0(void)
1176{
1177 ST0 -= FT0;
1178}
1179
1180void OPPROTO op_fsubr_ST0_FT0(void)
1181{
1182 ST0 = FT0 - ST0;
1183}
1184
1185void OPPROTO op_fdiv_ST0_FT0(void)
1186{
1187 ST0 /= FT0;
1188}
1189
1190void OPPROTO op_fdivr_ST0_FT0(void)
1191{
1192 ST0 = FT0 / ST0;
1193}
1194
1195/* fp operations between STN and ST0 */
1196
1197void OPPROTO op_fadd_STN_ST0(void)
1198{
1199 ST(PARAM1) += ST0;
1200}
1201
1202void OPPROTO op_fmul_STN_ST0(void)
1203{
1204 ST(PARAM1) *= ST0;
1205}
1206
1207void OPPROTO op_fsub_STN_ST0(void)
1208{
1209 ST(PARAM1) -= ST0;
1210}
1211
1212void OPPROTO op_fsubr_STN_ST0(void)
1213{
1214 CPU86_LDouble *p;
1215 p = &ST(PARAM1);
1216 *p = ST0 - *p;
1217}
1218
1219void OPPROTO op_fdiv_STN_ST0(void)
1220{
1221 ST(PARAM1) /= ST0;
1222}
1223
1224void OPPROTO op_fdivr_STN_ST0(void)
1225{
1226 CPU86_LDouble *p;
1227 p = &ST(PARAM1);
1228 *p = ST0 / *p;
1229}
1230
1231/* misc FPU operations */
1232void OPPROTO op_fchs_ST0(void)
1233{
1234 ST0 = -ST0;
1235}
1236
1237void OPPROTO op_fabs_ST0(void)
1238{
1239 ST0 = fabs(ST0);
1240}
1241
1242void OPPROTO op_fxam_ST0(void)
1243{
1244 CPU86_LDoubleU temp;
1245 int expdif;
1246
1247 temp.d = ST0;
1248
1249 env->fpus &= (~0x4700); /* (C3,C2,C1,C0) <-- 0000 */
1250 if (SIGND(temp))
1251 env->fpus |= 0x200; /* C1 <-- 1 */
1252
1253 expdif = EXPD(temp);
1254 if (expdif == MAXEXPD) {
1255 if (MANTD(temp) == 0)
1256 env->fpus |= 0x500 /*Infinity*/;
1257 else
1258 env->fpus |= 0x100 /*NaN*/;
1259 } else if (expdif == 0) {
1260 if (MANTD(temp) == 0)
1261 env->fpus |= 0x4000 /*Zero*/;
1262 else
1263 env->fpus |= 0x4400 /*Denormal*/;
1264 } else {
1265 env->fpus |= 0x400;
1266 }
1267 FORCE_RET();
1268}
1269
1270void OPPROTO op_fld1_ST0(void)
1271{
1272 ST0 = *(CPU86_LDouble *)&f15rk[1];
1273}
1274
1275void OPPROTO op_fld2t_ST0(void)
1276{
1277 ST0 = *(CPU86_LDouble *)&f15rk[6];
1278}
1279
1280void OPPROTO op_fld2e_ST0(void)
1281{
1282 ST0 = *(CPU86_LDouble *)&f15rk[5];
1283}
1284
1285void OPPROTO op_fldpi_ST0(void)
1286{
1287 ST0 = *(CPU86_LDouble *)&f15rk[2];
1288}
1289
1290void OPPROTO op_fldlg2_ST0(void)
1291{
1292 ST0 = *(CPU86_LDouble *)&f15rk[3];
1293}
1294
1295void OPPROTO op_fldln2_ST0(void)
1296{
1297 ST0 = *(CPU86_LDouble *)&f15rk[4];
1298}
1299
1300void OPPROTO op_fldz_ST0(void)
1301{
1302 ST0 = *(CPU86_LDouble *)&f15rk[0];
1303}
1304
1305void OPPROTO op_fldz_FT0(void)
1306{
1307 ST0 = *(CPU86_LDouble *)&f15rk[0];
1308}
1309
1310void helper_f2xm1(void)
1311{
1312 ST0 = pow(2.0,ST0) - 1.0;
1313}
1314
1315void helper_fyl2x(void)
1316{
1317 CPU86_LDouble fptemp;
1318
1319 fptemp = ST0;
1320 if (fptemp>0.0){
1321 fptemp = log(fptemp)/log(2.0); /* log2(ST) */
1322 ST1 *= fptemp;
1323 fpop();
1324 } else {
1325 env->fpus &= (~0x4700);
1326 env->fpus |= 0x400;
1327 }
1328}
1329
1330void helper_fptan(void)
1331{
1332 CPU86_LDouble fptemp;
1333
1334 fptemp = ST0;
1335 if((fptemp > MAXTAN)||(fptemp < -MAXTAN)) {
1336 env->fpus |= 0x400;
1337 } else {
1338 ST0 = tan(fptemp);
1339 fpush();
1340 ST0 = 1.0;
1341 env->fpus &= (~0x400); /* C2 <-- 0 */
1342 /* the above code is for |arg| < 2**52 only */
1343 }
1344}
1345
1346void helper_fpatan(void)
1347{
1348 CPU86_LDouble fptemp, fpsrcop;
1349
1350 fpsrcop = ST1;
1351 fptemp = ST0;
1352 ST1 = atan2(fpsrcop,fptemp);
1353 fpop();
1354}
1355
1356void helper_fxtract(void)
1357{
1358 CPU86_LDoubleU temp;
1359 unsigned int expdif;
1360
1361 temp.d = ST0;
1362 expdif = EXPD(temp) - EXPBIAS;
1363 /*DP exponent bias*/
1364 ST0 = expdif;
1365 fpush();
1366 BIASEXPONENT(temp);
1367 ST0 = temp.d;
1368}
1369
1370void helper_fprem1(void)
1371{
1372 CPU86_LDouble dblq, fpsrcop, fptemp;
1373 CPU86_LDoubleU fpsrcop1, fptemp1;
1374 int expdif;
1375 int q;
1376
1377 fpsrcop = ST0;
1378 fptemp = ST1;
1379 fpsrcop1.d = fpsrcop;
1380 fptemp1.d = fptemp;
1381 expdif = EXPD(fpsrcop1) - EXPD(fptemp1);
1382 if (expdif < 53) {
1383 dblq = fpsrcop / fptemp;
1384 dblq = (dblq < 0.0)? ceil(dblq): floor(dblq);
1385 ST0 = fpsrcop - fptemp*dblq;
1386 q = (int)dblq; /* cutting off top bits is assumed here */
1387 env->fpus &= (~0x4700); /* (C3,C2,C1,C0) <-- 0000 */
1388 /* (C0,C1,C3) <-- (q2,q1,q0) */
1389 env->fpus |= (q&0x4) << 6; /* (C0) <-- q2 */
1390 env->fpus |= (q&0x2) << 8; /* (C1) <-- q1 */
1391 env->fpus |= (q&0x1) << 14; /* (C3) <-- q0 */
1392 } else {
1393 env->fpus |= 0x400; /* C2 <-- 1 */
1394 fptemp = pow(2.0, expdif-50);
1395 fpsrcop = (ST0 / ST1) / fptemp;
1396 /* fpsrcop = integer obtained by rounding to the nearest */
1397 fpsrcop = (fpsrcop-floor(fpsrcop) < ceil(fpsrcop)-fpsrcop)?
1398 floor(fpsrcop): ceil(fpsrcop);
1399 ST0 -= (ST1 * fpsrcop * fptemp);
1400 }
1401}
1402
1403void helper_fprem(void)
1404{
1405 CPU86_LDouble dblq, fpsrcop, fptemp;
1406 CPU86_LDoubleU fpsrcop1, fptemp1;
1407 int expdif;
1408 int q;
1409
1410 fpsrcop = ST0;
1411 fptemp = ST1;
1412 fpsrcop1.d = fpsrcop;
1413 fptemp1.d = fptemp;
1414 expdif = EXPD(fpsrcop1) - EXPD(fptemp1);
1415 if ( expdif < 53 ) {
1416 dblq = fpsrcop / fptemp;
1417 dblq = (dblq < 0.0)? ceil(dblq): floor(dblq);
1418 ST0 = fpsrcop - fptemp*dblq;
1419 q = (int)dblq; /* cutting off top bits is assumed here */
1420 env->fpus &= (~0x4700); /* (C3,C2,C1,C0) <-- 0000 */
1421 /* (C0,C1,C3) <-- (q2,q1,q0) */
1422 env->fpus |= (q&0x4) << 6; /* (C0) <-- q2 */
1423 env->fpus |= (q&0x2) << 8; /* (C1) <-- q1 */
1424 env->fpus |= (q&0x1) << 14; /* (C3) <-- q0 */
1425 } else {
1426 env->fpus |= 0x400; /* C2 <-- 1 */
1427 fptemp = pow(2.0, expdif-50);
1428 fpsrcop = (ST0 / ST1) / fptemp;
1429 /* fpsrcop = integer obtained by chopping */
1430 fpsrcop = (fpsrcop < 0.0)?
1431 -(floor(fabs(fpsrcop))): floor(fpsrcop);
1432 ST0 -= (ST1 * fpsrcop * fptemp);
1433 }
1434}
1435
1436void helper_fyl2xp1(void)
1437{
1438 CPU86_LDouble fptemp;
1439
1440 fptemp = ST0;
1441 if ((fptemp+1.0)>0.0) {
1442 fptemp = log(fptemp+1.0) / log(2.0); /* log2(ST+1.0) */
1443 ST1 *= fptemp;
1444 fpop();
1445 } else {
1446 env->fpus &= (~0x4700);
1447 env->fpus |= 0x400;
1448 }
1449}
1450
1451void helper_fsqrt(void)
1452{
1453 CPU86_LDouble fptemp;
1454
1455 fptemp = ST0;
1456 if (fptemp<0.0) {
1457 env->fpus &= (~0x4700); /* (C3,C2,C1,C0) <-- 0000 */
1458 env->fpus |= 0x400;
1459 }
1460 ST0 = sqrt(fptemp);
1461}
1462
1463void helper_fsincos(void)
1464{
1465 CPU86_LDouble fptemp;
1466
1467 fptemp = ST0;
1468 if ((fptemp > MAXTAN)||(fptemp < -MAXTAN)) {
1469 env->fpus |= 0x400;
1470 } else {
1471 ST0 = sin(fptemp);
1472 fpush();
1473 ST0 = cos(fptemp);
1474 env->fpus &= (~0x400); /* C2 <-- 0 */
1475 /* the above code is for |arg| < 2**63 only */
1476 }
1477}
1478
1479void helper_frndint(void)
1480{
1481 ST0 = rint(ST0);
1482}
1483
1484void helper_fscale(void)
1485{
1486 CPU86_LDouble fpsrcop, fptemp;
1487
1488 fpsrcop = 2.0;
1489 fptemp = pow(fpsrcop,ST1);
1490 ST0 *= fptemp;
1491}
1492
1493void helper_fsin(void)
1494{
1495 CPU86_LDouble fptemp;
1496
1497 fptemp = ST0;
1498 if ((fptemp > MAXTAN)||(fptemp < -MAXTAN)) {
1499 env->fpus |= 0x400;
1500 } else {
1501 ST0 = sin(fptemp);
1502 env->fpus &= (~0x400); /* C2 <-- 0 */
1503 /* the above code is for |arg| < 2**53 only */
1504 }
1505}
1506
1507void helper_fcos(void)
1508{
1509 CPU86_LDouble fptemp;
1510
1511 fptemp = ST0;
1512 if((fptemp > MAXTAN)||(fptemp < -MAXTAN)) {
1513 env->fpus |= 0x400;
1514 } else {
1515 ST0 = cos(fptemp);
1516 env->fpus &= (~0x400); /* C2 <-- 0 */
1517 /* the above code is for |arg5 < 2**63 only */
1518 }
1519}
1520
1521/* associated heplers to reduce generated code length and to simplify
1522 relocation (FP constants are usually stored in .rodata section) */
1523
1524void OPPROTO op_f2xm1(void)
1525{
1526 helper_f2xm1();
1527}
1528
1529void OPPROTO op_fyl2x(void)
1530{
1531 helper_fyl2x();
1532}
1533
1534void OPPROTO op_fptan(void)
1535{
1536 helper_fptan();
1537}
1538
1539void OPPROTO op_fpatan(void)
1540{
1541 helper_fpatan();
1542}
1543
1544void OPPROTO op_fxtract(void)
1545{
1546 helper_fxtract();
1547}
1548
1549void OPPROTO op_fprem1(void)
1550{
1551 helper_fprem1();
1552}
1553
1554
1555void OPPROTO op_fprem(void)
1556{
1557 helper_fprem();
1558}
1559
1560void OPPROTO op_fyl2xp1(void)
1561{
1562 helper_fyl2xp1();
1563}
1564
1565void OPPROTO op_fsqrt(void)
1566{
1567 helper_fsqrt();
1568}
1569
1570void OPPROTO op_fsincos(void)
1571{
1572 helper_fsincos();
1573}
1574
1575void OPPROTO op_frndint(void)
1576{
1577 helper_frndint();
1578}
1579
1580void OPPROTO op_fscale(void)
1581{
1582 helper_fscale();
1583}
1584
1585void OPPROTO op_fsin(void)
1586{
1587 helper_fsin();
1588}
1589
1590void OPPROTO op_fcos(void)
1591{
1592 helper_fcos();
1593}
1594