LMMS
Loading...
Searching...
No Matches
asm-nseel-x86-gcc.c
Go to the documentation of this file.
1
2void nseel_asm_1pdd(void)
3{
4 __asm__(
5
7
8 "movl $0xfefefefe, %edi\n"
9 "subl $16, %esp\n"
10 "fstpl (%esp)\n"
11 "call *%edi\n"
12 "addl $16, %esp\n"
13
15
16 );
17}
18
20{
21 __asm__(
23
24 "movl $0xfefefefe, %edi\n"
25 "subl $16, %esp\n"
26 "fstpl 8(%esp)\n"
27 "fstpl (%esp)\n"
28 "call *%edi\n"
29 "addl $16, %esp\n"
30
32 );
33}
34
36{
37 __asm__(
39
40 "movl $0xfefefefe, %eax\n"
41 "subl $8, %esp\n"
42 "fstpl (%esp)\n"
43 "pushl 4(%edi)\n" /* push parameter */
44 "pushl (%edi)\n" /* push the rest of the parameter */
45 "call *%eax\n"
46 "addl $16, %esp\n"
47 "fstpl (%edi)\n" /* store result */
48 "movl %edi, %eax\n" /* set return value */
49
50 // denormal-fix result (this is only currently used for pow_op, so we want this!)
51 "movl 4(%edi), %edx\n"
52 "addl $0x00100000, %edx\n"
53 "andl $0x7FF00000, %edx\n"
54 "cmpl $0x00200000, %edx\n"
55 "jg 0f\n"
56 "subl %edx, %edx\n"
57 "movl %edx, (%edi)\n"
58 "movl %edx, 4(%edi)\n"
59 "0:\n"
60
62
63 );
64}
65
66
67
68//---------------------------------------------------------------------------------------------------------------
69
70
72{
73 __asm__(
75 "movl $0x5f3759df, %edx\n"
76 "fsts (%esi)\n"
77 "fmul" EEL_F_SUFFIX " (0xfefefefe)\n"
78 "movl (%esi), %ecx\n"
79 "sarl $1, %ecx\n"
80 "subl %ecx, %edx\n"
81 "movl %edx, (%esi)\n"
82 "fmuls (%esi)\n"
83 "fmuls (%esi)\n"
84 "fadd" EEL_F_SUFFIX " (0xfefefefe)\n"
85 "fmuls (%esi)\n"
86
88 );
89}
90
91
93{
94 __asm__(
96#ifdef __clang__
97 "ffree %st(0)\n"
98#else
99 "fstpl %st(0)\n"
100#endif
101 "movl %esp, (%esi)\n"
102 "fildl (%esi)\n"
103
105 );
106}
107
108//---------------------------------------------------------------------------------------------------------------
110{
111 __asm__(
113 "fsin\n"
115 );
116}
117
118//---------------------------------------------------------------------------------------------------------------
120{
121 __asm__(
123 "fcos\n"
125 );
126}
127
128//---------------------------------------------------------------------------------------------------------------
130{
131 __asm__(
133 "fptan\n"
134 "fstp %st(0)\n"
136 );
137}
138
139//---------------------------------------------------------------------------------------------------------------
141{
142 __asm__(
144 "fmul %st(0), %st(0)\n"
146 );
147}
148
149//---------------------------------------------------------------------------------------------------------------
151{
152 __asm__(
154 "fabs\n"
155 "fsqrt\n"
157 );
158}
159
160
161//---------------------------------------------------------------------------------------------------------------
163{
164 __asm__(
166 "fldln2\n"
167 "fxch\n"
168 "fyl2x\n"
170 );
171}
172
173//---------------------------------------------------------------------------------------------------------------
175{
176 __asm__(
178 "fldlg2\n"
179 "fxch\n"
180 "fyl2x\n"
181
183 );
184}
185
186//---------------------------------------------------------------------------------------------------------------
188{
189 __asm__(
191 "fabs\n"
193 );
194}
195
196
197//---------------------------------------------------------------------------------------------------------------
199{
200
201 __asm__(
203 "movl (%eax), %ecx\n"
204 "movl 4(%eax), %edx\n"
205 "movl %edx, %eax\n"
206 "addl $0x00100000, %eax\n" // if exponent is zero, make exponent 0x7ff, if 7ff, make 7fe
207 "andl $0x7ff00000, %eax\n"
208 "cmpl $0x00200000, %eax\n"
209 "jg 0f\n"
210 "subl %ecx, %ecx\n"
211 "subl %edx, %edx\n"
212 "0:\n"
213 "movl %edi, %eax\n"
214 "movl %ecx, (%edi)\n"
215 "movl %edx, 4(%edi)\n"
216
218 );
219
220}
221
222//---------------------------------------------------------------------------------------------------------------
224{
225 __asm__(
227 "fstpl (%edi)\n"
228 "movl 4(%edi), %edx\n"
229 "addl $0x00100000, %edx\n"
230 "andl $0x7FF00000, %edx\n"
231 "cmpl $0x00200000, %edx\n"
232 "movl %edi, %eax\n"
233 "jg 0f\n"
234 "subl %edx, %edx\n"
235 "movl %edx, (%edi)\n"
236 "movl %edx, 4(%edi)\n"
237 "0:\n"
238
240 );
241}
242
243
244//---------------------------------------------------------------------------------------------------------------
246{
247 __asm__(
249 "movl %edi, %eax\n"
250 "fstpl (%edi)\n"
252 );
253}
254
255
256
257//---------------------------------------------------------------------------------------------------------------
259{
260 __asm__(
262 "movl (%eax), %ecx\n"
263 "movl %ecx, (%edi)\n"
264 "movl 4(%eax), %ecx\n"
265
266 "movl %edi, %eax\n"
267 "movl %ecx, 4(%edi)\n"
269 );
270}
271
272//---------------------------------------------------------------------------------------------------------------
274{
275 __asm__(
277#ifdef __clang__
278 "faddp %st(1)\n"
279#else
280 "fadd\n"
281#endif
283 );
284}
285
287{
288 __asm__(
290 "fadd" EEL_F_SUFFIX " (%edi)\n"
291 "movl %edi, %eax\n"
292 "fstp" EEL_F_SUFFIX " (%edi)\n"
293
294 "movl 4(%edi), %edx\n"
295 "addl $0x00100000, %edx\n"
296 "andl $0x7FF00000, %edx\n"
297 "cmpl $0x00200000, %edx\n"
298 "jg 0f\n"
299 "subl %edx, %edx\n"
300 "movl %edx, (%edi)\n"
301 "movl %edx, 4(%edi)\n"
302 "0:\n"
304 );
305}
306
308{
309 __asm__(
311 "fadd" EEL_F_SUFFIX " (%edi)\n"
312 "movl %edi, %eax\n"
313 "fstp" EEL_F_SUFFIX " (%edi)\n"
315 );
316}
317
318
319//---------------------------------------------------------------------------------------------------------------
321{
322 __asm__(
324#ifdef __clang__
325 "fsubrp %st(0), %st(1)\n"
326#else
327 #ifdef __GNUC__
328 #ifdef __INTEL_COMPILER
329 "fsub\n"
330 #else
331 "fsubr\n" // gnuc has fsub/fsubr backwards, ack
332 #endif
333 #else
334 "fsub\n"
335 #endif
336#endif
338 );
339}
340
342{
343 __asm__(
345 "fsubr" EEL_F_SUFFIX " (%edi)\n"
346 "movl %edi, %eax\n"
347 "fstp" EEL_F_SUFFIX " (%edi)\n"
348
349 "movl 4(%edi), %edx\n"
350 "addl $0x00100000, %edx\n"
351 "andl $0x7FF00000, %edx\n"
352 "cmpl $0x00200000, %edx\n"
353 "jg 0f\n"
354 "subl %edx, %edx\n"
355 "movl %edx, (%edi)\n"
356 "movl %edx, 4(%edi)\n"
357 "0:\n"
359 );
360}
361
363{
364 __asm__(
366 "fsubr" EEL_F_SUFFIX " (%edi)\n"
367 "movl %edi, %eax\n"
368 "fstp" EEL_F_SUFFIX " (%edi)\n"
370 );
371}
372
373//---------------------------------------------------------------------------------------------------------------
375{
376 __asm__(
378#ifdef __clang__
379 "fmulp %st(0), %st(1)\n"
380#else
381 "fmul\n"
382#endif
384 );
385}
386
388{
389 __asm__(
391 "fmul" EEL_F_SUFFIX " (%edi)\n"
392 "movl %edi, %eax\n"
393 "fstp" EEL_F_SUFFIX " (%edi)\n"
394
395 "movl 4(%edi), %edx\n"
396 "addl $0x00100000, %edx\n"
397 "andl $0x7FF00000, %edx\n"
398 "cmpl $0x00200000, %edx\n"
399 "jg 0f\n"
400 "subl %edx, %edx\n"
401 "movl %edx, (%edi)\n"
402 "movl %edx, 4(%edi)\n"
403 "0:\n"
405 );
406}
407
409{
410 __asm__(
412 "fmul" EEL_F_SUFFIX " (%edi)\n"
413 "movl %edi, %eax\n"
414 "fstp" EEL_F_SUFFIX " (%edi)\n"
416 );
417}
418
419//---------------------------------------------------------------------------------------------------------------
421{
422 __asm__(
424#ifdef __clang__
425 "fdivrp %st(1)\n"
426#else
427 #ifdef __GNUC__
428 #ifdef __INTEL_COMPILER
429 "fdiv\n"
430 #else
431 "fdivr\n" // gcc inline asm seems to have fdiv/fdivr backwards
432 #endif
433 #else
434 "fdiv\n"
435 #endif
436#endif
438 );
439}
440
442{
443 __asm__(
445 "fld" EEL_F_SUFFIX " (%edi)\n"
446#ifdef __clang__
447 "fdivp %st(1)\n"
448#else
449 #ifndef __GNUC__
450 "fdivr\n"
451 #else
452 #ifdef __INTEL_COMPILER
453 "fdivp %st(1)\n"
454 #else
455 "fdiv\n"
456 #endif
457 #endif
458#endif
459 "movl %edi, %eax\n"
460 "fstp" EEL_F_SUFFIX " (%edi)\n"
461
462 "movl 4(%edi), %edx\n"
463 "addl $0x00100000, %edx\n"
464 "andl $0x7FF00000, %edx\n"
465 "cmpl $0x00200000, %edx\n"
466 "jg 0f\n"
467 "subl %edx, %edx\n"
468 "movl %edx, (%edi)\n"
469 "movl %edx, 4(%edi)\n"
470 "0:\n"
471
473 );
474}
475
477{
478 __asm__(
480 "fld" EEL_F_SUFFIX " (%edi)\n"
481#ifdef __clang__
482 "fdivp %st(1)\n"
483#else
484 #ifndef __GNUC__
485 "fdivr\n"
486 #else
487 #ifdef __INTEL_COMPILER
488 "fdivp %st(1)\n"
489 #else
490 "fdiv\n"
491 #endif
492 #endif
493#endif
494 "movl %edi, %eax\n"
495 "fstp" EEL_F_SUFFIX " (%edi)\n"
496
498 );
499}
500
501//---------------------------------------------------------------------------------------------------------------
503{
504 __asm__(
506 "fabs\n"
507 "fistpl (%esi)\n"
508 "fabs\n"
509 "fistpl 4(%esi)\n"
510 "xorl %edx, %edx\n"
511 "cmpl $0, (%esi)\n"
512 "je 0f\n" // skip devide, set return to 0
513 "movl 4(%esi), %eax\n"
514 "divl (%esi)\n"
515 "0:\n"
516 "movl %edx, (%esi)\n"
517 "fildl (%esi)\n"
518
520 );
521}
522
524{
525 __asm__(
527 "fistpl (%esi)\n"
528 "fistpl 4(%esi)\n"
529 "movl (%esi), %ecx\n"
530 "movl 4(%esi), %eax\n"
531 "shll %cl, %eax\n"
532 "movl %eax, (%esi)\n"
533 "fildl (%esi)\n"
535 );
536}
537
539{
540 __asm__(
542 "fistpl (%esi)\n"
543 "fistpl 4(%esi)\n"
544 "movl (%esi), %ecx\n"
545 "movl 4(%esi), %eax\n"
546 "sarl %cl, %eax\n"
547 "movl %eax, (%esi)\n"
548 "fildl (%esi)\n"
550 );
551}
552
553
555{
556 __asm__(
558 "fld" EEL_F_SUFFIX " (%edi)\n"
559 "fxch\n"
560 "fabs\n"
561 "fistpl (%edi)\n"
562 "fabs\n"
563 "fistpl (%esi)\n"
564 "xorl %edx, %edx\n"
565 "cmpl $0, (%edi)\n"
566 "je 0f\n" // skip devide, set return to 0
567 "movl (%esi), %eax\n"
568 "divl (%edi)\n"
569 "0:\n"
570 "movl %edx, (%edi)\n"
571 "fildl (%edi)\n"
572 "movl %edi, %eax\n"
573 "fstp" EEL_F_SUFFIX " (%edi)\n"
574
576 );
577}
578
579//---------------------------------------------------------------------------------------------------------------
580void nseel_asm_or(void)
581{
582 __asm__(
584 "fistpll (%esi)\n"
585 "fistpll 8(%esi)\n"
586 "movl 8(%esi), %edi\n"
587 "movl 12(%esi), %ecx\n"
588 "orl %edi, (%esi)\n"
589 "orl %ecx, 4(%esi)\n"
590 "fildll (%esi)\n"
591
593 );
594}
595
597{
598 __asm__(
600 "fistpll (%esi)\n"
601 "fildll (%esi)\n"
603 );
604}
605
607{
608 __asm__(
610 "fld" EEL_F_SUFFIX " (%edi)\n"
611 "fxch\n"
612 "fistpll (%edi)\n"
613 "fistpll (%esi)\n"
614 "movl (%esi), %eax\n"
615 "movl 4(%esi), %ecx\n"
616 "orl %eax, (%edi)\n"
617 "orl %ecx, 4(%edi)\n"
618 "fildll (%edi)\n"
619 "movl %edi, %eax\n"
620 "fstp" EEL_F_SUFFIX " (%edi)\n"
621
623 );
624}
625
626
628{
629 __asm__(
631 "fistpll (%esi)\n"
632 "fistpll 8(%esi)\n"
633 "movl 8(%esi), %edi\n"
634 "movl 12(%esi), %ecx\n"
635 "xorl %edi, (%esi)\n"
636 "xorl %ecx, 4(%esi)\n"
637 "fildll (%esi)\n"
638
640 );
641}
642
644{
645 __asm__(
647 "fld" EEL_F_SUFFIX " (%edi)\n"
648 "fxch\n"
649 "fistpll (%edi)\n"
650 "fistpll (%esi)\n"
651 "movl (%esi), %eax\n"
652 "movl 4(%esi), %ecx\n"
653 "xorl %eax, (%edi)\n"
654 "xorl %ecx, 4(%edi)\n"
655 "fildll (%edi)\n"
656 "movl %edi, %eax\n"
657 "fstp" EEL_F_SUFFIX " (%edi)\n"
658
660 );
661}
662
663
664//---------------------------------------------------------------------------------------------------------------
666{
667 __asm__(
669 "fistpll (%esi)\n"
670 "fistpll 8(%esi)\n"
671 "movl 8(%esi), %edi\n"
672 "movl 12(%esi), %ecx\n"
673 "andl %edi, (%esi)\n"
674 "andl %ecx, 4(%esi)\n"
675 "fildll (%esi)\n"
676
678 );
679}
680
682{
683 __asm__(
685 "fld" EEL_F_SUFFIX " (%edi)\n"
686 "fxch\n"
687 "fistpll (%edi)\n"
688 "fistpll (%esi)\n"
689 "movl (%esi), %eax\n"
690 "movl 4(%esi), %ecx\n"
691 "andl %eax, (%edi)\n"
692 "andl %ecx, 4(%edi)\n"
693 "fildll (%edi)\n"
694 "movl %edi, %eax\n"
695 "fstp" EEL_F_SUFFIX " (%edi)\n"
696
698 );
699}
700
701
702//---------------------------------------------------------------------------------------------------------------
704{
705 __asm__(
707 "fchs\n"
709 );
710}
711
712
713
714//---------------------------------------------------------------------------------------------------------------
716{
717 __asm__(
719
720 "fsts (%esi)\n"
721 "movl (%esi), %ecx\n"
722 "movl $0x7FFFFFFF, %edx\n"
723 "testl %edx, %ecx\n"
724 "jz 0f\n" // zero zero, return the value passed directly
725 // calculate sign
726 "incl %edx\n" // edx becomes 0x8000...
727 "fstp %st(0)\n"
728 "fld1\n"
729 "testl %edx, %ecx\n"
730 "jz 0f\n"
731 "fchs\n"
732 "0:\n"
733
735);
736}
737
738
739
740//---------------------------------------------------------------------------------------------------------------
742{
743 __asm__(
745 "testl %eax, %eax\n"
746 "setz %al\n"
747 "andl $0xff, %eax\n"
749 );
750}
751
752//---------------------------------------------------------------------------------------------------------------
754{
755 __asm__(
757 "movl $0xfefefefe, %edx\n"
758 "subl $12, %esp\n" /* keep stack 16 byte aligned, 4 bytes for return address */
759 "call *%edx\n"
760 "addl $12, %esp\n"
762 );
763}
764
766{
767 __asm__(
769 "testl %eax, %eax\n"
770 "jz 0f\n"
771
772 "movl $0xfefefefe, %ecx\n"
773 "subl $12, %esp\n"
774 "call *%ecx\n"
775 "addl $12, %esp\n"
776 "0:\n"
778 );
779}
780
782{
783 __asm__(
785 "testl %eax, %eax\n"
786 "jnz 0f\n"
787
788 "movl $0xfefefefe, %ecx\n"
789 "subl $12, %esp\n"
790 "call *%ecx\n"
791 "addl $12, %esp\n"
792 "0:\n"
794 );
795}
796
797//---------------------------------------------------------------------------------------------------------------
799{
800 __asm__(
802#ifdef __clang__
803 "fsubp %st(1)\n"
804#else
805 "fsub\n"
806#endif
807
808 "fabs\n"
809 "fcomp" EEL_F_SUFFIX " -8(%ebx)\n" //[g_closefact]
810 "fstsw %ax\n"
811 "andl $256, %eax\n" // old behavior: if 256 set, true (NaN means true)
812
814 );
815}
816//
817//---------------------------------------------------------------------------------------------------------------
819{
820 __asm__(
822 "fcompp\n"
823 "fstsw %ax\n" // for equal 256 and 1024 should be clear, 16384 should be set
824 "andl $17664, %eax\n" // mask C4/C3/C1, bits 8/10/14, 16384|256|1024 -- if equals 16384, then equality
825 "cmp $16384, %eax\n"
826 "je 0f\n"
827 "subl %eax, %eax\n"
828 "0:\n"
830 );
831}
832
834{
835 __asm__(
837 "fcompp\n"
838 "fstsw %ax\n" // for equal 256 and 1024 should be clear, 16384 should be set
839 "andl $17664, %eax\n" // mask C4/C3/C1, bits 8/10/14, 16384|256|1024 -- if equals 16384, then equality
840 "cmp $16384, %eax\n"
841 "je 0f\n"
842 "subl %eax, %eax\n"
843 "0:\n"
844 "xorl $16384, %eax\n" // flip the result
846 );
847}
848//
849//---------------------------------------------------------------------------------------------------------------
851{
852 __asm__(
854#ifdef __clang__
855 "fsubp %st(1)\n"
856#else
857 "fsub\n"
858#endif
859
860 "fabs\n"
861 "fcomp" EEL_F_SUFFIX " -8(%ebx)\n" //[g_closefact]
862 "fstsw %ax\n"
863 "andl $256, %eax\n"
864 "xorl $256, %eax\n" // old behavior: if 256 set, FALSE (NaN makes for false)
866 );
867}
868
869
870//---------------------------------------------------------------------------------------------------------------
872{
873 __asm__(
875 "fcompp\n"
876 "fstsw %ax\n"
877 "andl $1280, %eax\n" // (1024+256) old behavior: NaN would mean 1, preserve that
879 );
880}
881
882//---------------------------------------------------------------------------------------------------------------
884{
885 __asm__(
887 "fcompp\n"
888 "fstsw %ax\n"
889 "andl $256, %eax\n" // old behavior: NaN would be 0 (ugh)
890 "xorl $256, %eax\n"
892 );
893}
894
895
897{
898 __asm__(
900 "testl %eax, %eax\n"
901 "jz 0f\n"
902 "fld1\n"
903 "jmp 1f\n"
904 "0:\n"
905 "fldz\n"
906 "1:\n"
908 );
909}
910
912{
913 __asm__(
915 "fabs\n"
916 "fcomp" EEL_F_SUFFIX " -8(%ebx)\n" //[g_closefact]
917 "fstsw %ax\n"
918 "andl $256, %eax\n"
919 "xorl $256, %eax\n"
921 );
922}
923
925{
926 __asm__(
928 "fabs\n"
929 "fcomp" EEL_F_SUFFIX " -8(%ebx)\n" //[g_closefact]
930 "fstsw %ax\n"
931 "andl $256, %eax\n"
933 );
934}
935
937{
938 __asm__(
940 "fld" EEL_F_SUFFIX " (%edi)\n"
941 "fcomp" EEL_F_SUFFIX " (%eax)\n"
942 "movl %eax, %ecx\n"
943 "fstsw %ax\n"
944 "testl $256, %eax\n"
945 "movl %ecx, %eax\n"
946 "jz 0f\n"
947 "movl %edi, %eax\n"
948 "0:\n"
950 );
951
952}
953
955{
956 __asm__(
958 "fld" EEL_F_SUFFIX " (%edi)\n"
959 "fcomp" EEL_F_SUFFIX " (%eax)\n"
960 "movl %eax, %ecx\n"
961 "fstsw %ax\n"
962 "testl $256, %eax\n"
963 "movl %ecx, %eax\n"
964 "jnz 0f\n"
965 "movl %edi, %eax\n"
966 "0:\n"
968 );
969}
970
971
972
974{
975 __asm__(
977 "fcom\n"
978 "fstsw %ax\n"
979 "testl $256, %eax\n"
980 "jz 0f\n"
981 "fxch\n"
982 "0:\n"
983 "fstp %st(0)\n"
985 );
986
987}
988
990{
991 __asm__(
993 "fcom\n"
994 "fstsw %ax\n"
995 "testl $256, %eax\n"
996 "jnz 0f\n"
997 "fxch\n"
998 "0:\n"
999 "fstp %st(0)\n"
1001 );
1002}
1003
1004
1005
1006// just generic functions left, yay
1007
1008
1009
1010
1012{
1013 __asm__(
1015
1016 "movl $0xfefefefe, %edx\n"
1017 "pushl %eax\n" // push parameter
1018 "pushl %edi\n" // push parameter
1019 "movl $0xfefefefe, %edi\n"
1020 "pushl %ecx\n" // push parameter
1021 "pushl %edx\n" // push context pointer
1022 "call *%edi\n"
1023 "addl $16, %esp\n"
1024
1026 );
1027}
1028
1029
1031{
1032 __asm__(
1034
1035 "subl $16, %esp\n"
1036 "movl $0xfefefefe, %edx\n"
1037 "movl %edi, 8(%esp)\n"
1038 "movl $0xfefefefe, %edi\n"
1039 "movl %eax, 12(%esp)\n"
1040 "movl %ecx, 4(%esp)\n"
1041 "movl %edx, (%esp)\n"
1042 "call *%edi\n"
1043 "addl $16, %esp\n"
1044
1046 );
1047}
1048
1049
1050void _asm_generic2parm(void) // this prob neds to be fixed for ppc
1051{
1052 __asm__(
1054
1055 "movl $0xfefefefe, %edx\n"
1056 "movl $0xfefefefe, %ecx\n"
1057 "subl $4, %esp\n" // keep stack aligned
1058 "pushl %eax\n" // push parameter
1059 "pushl %edi\n" // push parameter
1060 "pushl %edx\n" // push context pointer
1061 "call *%ecx\n"
1062 "addl $16, %esp\n"
1063
1065 );
1066}
1067
1068
1070{
1071 __asm__(
1073
1074 "subl $16, %esp\n"
1075 "movl $0xfefefefe, %edx\n"
1076 "movl $0xfefefefe, %ecx\n"
1077 "movl %edx, (%esp)\n"
1078 "movl %edi, 4(%esp)\n"
1079 "movl %eax, 8(%esp)\n"
1080 "call *%ecx\n"
1081 "addl $16, %esp\n"
1082
1084 );
1085}
1086
1087
1089{
1090 __asm__(
1092 "subl $16, %esp\n"
1093 "movl $0xfefefefe, %edx\n" // first parameter
1094 "movl %edx, (%esp)\n"
1095 "movl %edi, 8(%esp)\n"
1096 "movl $0xfefefefe, %edx\n"
1097 "movl $0xfefefefe, %ecx\n" // function
1098 "movl %edx, 4(%esp)\n"
1099 "movl %eax, 12(%esp)\n"
1100 "call *%ecx\n"
1101 "addl $16, %esp\n"
1103 );
1104}
1105
1106
1107
1109{
1110 __asm__(
1112
1113 "movl $0xfefefefe, %edx\n"
1114 "subl $8, %esp\n" // keep stack aligned
1115 "movl $0xfefefefe, %ecx\n"
1116 "pushl %eax\n" // push parameter
1117 "pushl %edx\n" // push context pointer
1118 "call *%ecx\n"
1119 "addl $16, %esp\n"
1120
1122 );
1123}
1124
1125
1126void _asm_generic1parm_retd(void) // 1 parameter returning double
1127{
1128 __asm__(
1130
1131 "movl $0xfefefefe, %edx\n" // context pointer
1132 "movl $0xfefefefe, %ecx\n" // func-addr
1133 "subl $16, %esp\n"
1134 "movl %eax, 4(%esp)\n" // push parameter
1135 "movl %edx, (%esp)\n" // push context pointer
1136 "call *%ecx\n"
1137 "addl $16, %esp\n"
1138
1140 );
1141}
1142
1143
1144
1145
1146
1147// this gets its own stub because it's pretty crucial for performance :/
1148
1150{
1151 __asm__(
1152
1154
1155 "fadd" EEL_F_SUFFIX " -8(%%ebx)\n"
1156 "fistpl (%%esi)\n"
1157
1158 // check if (%esi) is in range, and buffer available, otherwise call function
1159 "movl (%%esi), %%edi\n"
1160 "cmpl %0, %%edi\n" //REPLACE=((NSEEL_RAM_BLOCKS*NSEEL_RAM_ITEMSPERBLOCK))
1161 "jae 0f\n"
1162
1163 "movl %%edi, %%eax\n"
1164 "shrl %1, %%eax\n" //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 2/*log2(sizeof(void *))*/ )
1165 "andl %2, %%eax\n" //REPLACE=((NSEEL_RAM_BLOCKS-1)*4 /*sizeof(void*)*/ )
1166 "movl (%%ebx, %%eax), %%eax\n"
1167 "testl %%eax, %%eax\n"
1168 "jnz 1f\n"
1169 "0:\n"
1170 "subl $8, %%esp\n" // keep stack aligned
1171 "movl $0xfefefefe, %%ecx\n"
1172 "pushl %%edi\n" // parameter
1173 "pushl %%ebx\n" // push context pointer
1174 "call *%%ecx\n"
1175 "addl $16, %%esp\n"
1176 "jmp 2f\n"
1177 "1:\n"
1178 "andl %3, %%edi\n" //REPLACE=(NSEEL_RAM_ITEMSPERBLOCK-1)
1179 "shll $3, %%edi\n" // 3 is log2(sizeof(EEL_F))
1180 "addl %%edi, %%eax\n"
1181 "2:"
1183
1184 #ifndef _MSC_VER
1186 "i" ((NSEEL_RAM_ITEMSPERBLOCK_LOG2 - 2/*log2(sizeof(void *))*/ )),
1187 "i" (((NSEEL_RAM_BLOCKS-1)*4 /*sizeof(void*)*/ )),
1188 "i" ((NSEEL_RAM_ITEMSPERBLOCK-1 ))
1189 #endif
1190
1191 );
1192}
1193
1194
1195
1197{
1198 __asm__(
1199
1201
1202 "subl $16, %esp\n" // keep stack aligned
1203 "movl $0xfefefefe, (%esp)\n"
1204 "fadd" EEL_F_SUFFIX " -8(%ebx)\n"
1205 "movl $0xfefefefe, %edi\n"
1206 "fistpl 4(%esp)\n"
1207 "call *%edi\n"
1208 "addl $16, %esp\n"
1209
1211 );
1212}
1213
1214
1216{
1217
1218 __asm__(
1220 "movl $0xfefefefe, %edi\n"
1221
1222 "movl (%eax), %ecx\n"
1223 "movl 4(%eax), %edx\n"
1224
1225 "movl (%edi), %eax\n"
1226
1227 "addl $8, %eax\n"
1228 "andl $0xfefefefe, %eax\n"
1229 "orl $0xfefefefe, %eax\n"
1230
1231 "movl %ecx, (%eax)\n"
1232 "movl %edx, 4(%eax)\n"
1233
1234 "movl %eax, (%edi)\n"
1236 );
1237
1238}
1239
1240
1241
1243{
1244 __asm__(
1246 "movl $0xfefefefe, %edi\n"
1247 "movl (%edi), %ecx\n"
1248 "fld" EEL_F_SUFFIX " (%ecx)\n"
1249 "subl $8, %ecx\n"
1250 "andl $0xfefefefe, %ecx\n"
1251 "orl $0xfefefefe, %ecx\n"
1252 "movl %ecx, (%edi)\n"
1253 "fstp" EEL_F_SUFFIX " (%eax)\n"
1255 );
1256}
1257
1258
1260{
1261 __asm__(
1263 "movl $0xfefefefe, %edi\n"
1264 "movl (%edi), %ecx\n"
1265 "movl %ecx, %eax\n"
1266 "subl $8, %ecx\n"
1267 "andl $0xfefefefe, %ecx\n"
1268 "orl $0xfefefefe, %ecx\n"
1269 "movl %ecx, (%edi)\n"
1271 );
1272}
1273
1275{
1276 __asm__(
1278 "movl $0xfefefefe, %edi\n"
1279 "movl (%edi), %eax\n"
1280 "movl $0xfefefefe, %edx\n"
1281 "subl %edx, %eax\n"
1282 "andl $0xfefefefe, %eax\n"
1283 "orl $0xfefefefe, %eax\n"
1285 );
1286}
1287
1288
1289
1291{
1292 __asm__(
1294 "movl $0xfefefefe, %edi\n"
1295 "fistpl (%esi)\n"
1296 "movl (%edi), %eax\n"
1297 "movl (%esi), %edx\n"
1298 "shll $3, %edx\n" // log2(sizeof(EEL_F))
1299 "subl %edx, %eax\n"
1300 "andl $0xfefefefe, %eax\n"
1301 "orl $0xfefefefe, %eax\n"
1303 );
1304}
1305
1306
1308{
1309 __asm__(
1311 "movl $0xfefefefe, %edi\n"
1312 "movl (%edi), %eax\n"
1314 );
1315
1316}
1317
1319{
1320 __asm__(
1322 "movl $0xfefefefe, %edi\n"
1323 "movl (%edi), %ecx\n"
1324 "fld" EEL_F_SUFFIX " (%ecx)\n"
1325 "fld" EEL_F_SUFFIX " (%eax)\n"
1326 "fstp" EEL_F_SUFFIX " (%ecx)\n"
1327 "fstp" EEL_F_SUFFIX " (%eax)\n"
1329 );
1330
1331}
1332
#define FUNCTION_MARKER
Definition asm-nseel-aarch64-gcc.c:1
void nseel_asm_equal(void)
Definition asm-nseel-x86-gcc.c:798
void nseel_asm_div_op_fast(void)
Definition asm-nseel-x86-gcc.c:476
void nseel_asm_xor_op(void)
Definition asm-nseel-x86-gcc.c:643
void nseel_asm_assign_fromfp(void)
Definition asm-nseel-x86-gcc.c:223
void _asm_generic3parm(void)
Definition asm-nseel-x86-gcc.c:1011
void nseel_asm_fptobool_rev(void)
Definition asm-nseel-x86-gcc.c:924
void nseel_asm_mod_op(void)
Definition asm-nseel-x86-gcc.c:554
void nseel_asm_sqr(void)
Definition asm-nseel-x86-gcc.c:140
void nseel_asm_add(void)
Definition asm-nseel-x86-gcc.c:273
void nseel_asm_log10(void)
Definition asm-nseel-x86-gcc.c:174
void nseel_asm_or0(void)
Definition asm-nseel-x86-gcc.c:596
void nseel_asm_stack_pop_fast(void)
Definition asm-nseel-x86-gcc.c:1259
void nseel_asm_above(void)
Definition asm-nseel-x86-gcc.c:871
void nseel_asm_booltofp(void)
Definition asm-nseel-x86-gcc.c:896
void nseel_asm_sqrt(void)
Definition asm-nseel-x86-gcc.c:150
void nseel_asm_or_op(void)
Definition asm-nseel-x86-gcc.c:606
void nseel_asm_add_op_fast(void)
Definition asm-nseel-x86-gcc.c:307
void nseel_asm_and(void)
Definition asm-nseel-x86-gcc.c:665
void nseel_asm_bnot(void)
Definition asm-nseel-x86-gcc.c:741
void nseel_asm_cos(void)
Definition asm-nseel-x86-gcc.c:119
void nseel_asm_or(void)
Definition asm-nseel-x86-gcc.c:580
void nseel_asm_stack_peek_int(void)
Definition asm-nseel-x86-gcc.c:1274
void _asm_generic3parm_retd(void)
Definition asm-nseel-x86-gcc.c:1030
void nseel_asm_shl(void)
Definition asm-nseel-x86-gcc.c:523
void nseel_asm_stack_peek(void)
Definition asm-nseel-x86-gcc.c:1290
void _asm_generic2parm_retd(void)
Definition asm-nseel-x86-gcc.c:1069
void nseel_asm_shr(void)
Definition asm-nseel-x86-gcc.c:538
void nseel_asm_band(void)
Definition asm-nseel-x86-gcc.c:765
void nseel_asm_abs(void)
Definition asm-nseel-x86-gcc.c:187
void nseel_asm_beloweq(void)
Definition asm-nseel-x86-gcc.c:883
void nseel_asm_1pdd(void)
Definition asm-nseel-x86-gcc.c:2
void nseel_asm_sub_op(void)
Definition asm-nseel-x86-gcc.c:341
void nseel_asm_sign(void)
Definition asm-nseel-x86-gcc.c:715
void nseel_asm_div_op(void)
Definition asm-nseel-x86-gcc.c:441
void nseel_asm_assign(void)
Definition asm-nseel-x86-gcc.c:198
void nseel_asm_stack_pop(void)
Definition asm-nseel-x86-gcc.c:1242
void nseel_asm_assign_fast(void)
Definition asm-nseel-x86-gcc.c:258
void nseel_asm_equal_exact(void)
Definition asm-nseel-x86-gcc.c:818
void nseel_asm_xor(void)
Definition asm-nseel-x86-gcc.c:627
void nseel_asm_invsqrt(void)
Definition asm-nseel-x86-gcc.c:71
void nseel_asm_sin(void)
Definition asm-nseel-x86-gcc.c:109
void nseel_asm_fcall(void)
Definition asm-nseel-x86-gcc.c:753
void nseel_asm_notequal_exact(void)
Definition asm-nseel-x86-gcc.c:833
void nseel_asm_stack_exch(void)
Definition asm-nseel-x86-gcc.c:1318
void nseel_asm_sub_op_fast(void)
Definition asm-nseel-x86-gcc.c:362
void nseel_asm_dbg_getstackptr(void)
Definition asm-nseel-x86-gcc.c:92
void nseel_asm_min(void)
Definition asm-nseel-x86-gcc.c:936
void nseel_asm_tan(void)
Definition asm-nseel-x86-gcc.c:129
void nseel_asm_bor(void)
Definition asm-nseel-x86-gcc.c:781
void nseel_asm_add_op(void)
Definition asm-nseel-x86-gcc.c:286
void _asm_generic1parm_retd(void)
Definition asm-nseel-x86-gcc.c:1126
void nseel_asm_max_fp(void)
Definition asm-nseel-x86-gcc.c:989
void nseel_asm_div(void)
Definition asm-nseel-x86-gcc.c:420
void _asm_generic2parm(void)
Definition asm-nseel-x86-gcc.c:1050
void nseel_asm_min_fp(void)
Definition asm-nseel-x86-gcc.c:973
void nseel_asm_stack_push(void)
Definition asm-nseel-x86-gcc.c:1215
void nseel_asm_sub(void)
Definition asm-nseel-x86-gcc.c:320
void nseel_asm_log(void)
Definition asm-nseel-x86-gcc.c:162
void nseel_asm_notequal(void)
Definition asm-nseel-x86-gcc.c:850
void _asm_gmegabuf(void)
Definition asm-nseel-x86-gcc.c:1196
void nseel_asm_uminus(void)
Definition asm-nseel-x86-gcc.c:703
void nseel_asm_mod(void)
Definition asm-nseel-x86-gcc.c:502
void _asm_generic2xparm_retd(void)
Definition asm-nseel-x86-gcc.c:1088
void nseel_asm_2pdds(void)
Definition asm-nseel-x86-gcc.c:35
void _asm_generic1parm(void)
Definition asm-nseel-x86-gcc.c:1108
void nseel_asm_assign_fast_fromfp(void)
Definition asm-nseel-x86-gcc.c:245
void nseel_asm_mul_op(void)
Definition asm-nseel-x86-gcc.c:387
void nseel_asm_2pdd(void)
Definition asm-nseel-x86-gcc.c:19
void nseel_asm_mul(void)
Definition asm-nseel-x86-gcc.c:374
void _asm_megabuf(void)
Definition asm-nseel-x86-gcc.c:1149
void nseel_asm_max(void)
Definition asm-nseel-x86-gcc.c:954
void nseel_asm_mul_op_fast(void)
Definition asm-nseel-x86-gcc.c:408
void nseel_asm_stack_peek_top(void)
Definition asm-nseel-x86-gcc.c:1307
void nseel_asm_fptobool(void)
Definition asm-nseel-x86-gcc.c:911
void nseel_asm_and_op(void)
Definition asm-nseel-x86-gcc.c:681
#define NSEEL_RAM_ITEMSPERBLOCK_LOG2
Definition ns-eel.h:232
#define NSEEL_RAM_ITEMSPERBLOCK
Definition ns-eel.h:235
#define NSEEL_RAM_BLOCKS
Definition ns-eel.h:234
#define EEL_F_SUFFIX
Definition nseel-cfunc.c:139