* Removed all Id tags.
[cacao.git] / src / vm / builtintable.inc
1 /* src/vm/builtintable.inc - tables of builtin functions
2
3    Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6    J. Wenninger, Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25 */
26
27
28 #include "config.h"
29
30 #include "arch.h"
31
32 #if defined(ENABLE_THREADS)
33 # include "threads/native/lock.h"
34 #endif
35
36 #include "vm/builtin.h"
37 #include "vm/jit/jit.h"
38
39
40 /* internal and not automatically replaced functions **************************/
41
42 static builtintable_entry builtintable_internal[] = {
43
44 #if defined(__ALPHA__) || defined(DISABLE_GC)
45         {
46                 ICMD_F2L,
47                 BUILTIN_f2l,
48                 NULL,
49                 "f2l",
50                 "(F)J",
51                 NULL,
52                 NULL,
53                 NULL,
54                 false,
55                 NULL
56         },
57         {
58                 ICMD_D2L,
59                 BUILTIN_d2l,
60                 NULL,
61                 "d2l",
62                 "(D)J",
63                 NULL,
64                 NULL,
65                 NULL,
66                 false,
67                 NULL
68         },
69         {
70                 ICMD_F2I,
71                 BUILTIN_f2i,
72                 NULL,
73                 "f2i",
74                 "(F)I",
75                 NULL,
76                 NULL,
77                 NULL,
78                 false,
79                 NULL
80         },
81         {
82                 ICMD_D2I,
83                 BUILTIN_d2i,
84                 NULL,
85                 "d2i",
86                 "(D)I",
87                 NULL,
88                 NULL,
89                 NULL,
90                 false,
91                 NULL
92         },
93 #endif
94
95 #if !SUPPORT_DIVISION || defined(DISABLE_GC)
96         {
97                 ICMD_IDIV,
98                 BUILTIN_idiv,
99                 NULL,
100                 "idiv",
101                 "(II)I",
102                 NULL,
103                 NULL,
104                 NULL,
105                 false,
106                 NULL
107         },
108         {
109                 ICMD_IREM,
110                 BUILTIN_irem,
111                 NULL,
112                 "irem",
113                 "(II)I",
114                 NULL,
115                 NULL,
116                 NULL,
117                 false,
118                 NULL
119         },
120 #endif
121
122 #if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV) || defined(DISABLE_GC)
123         {
124                 ICMD_LDIV,
125                 BUILTIN_ldiv,
126                 NULL,
127                 "ldiv",
128                 "(JJ)J",
129                 NULL,
130                 NULL,
131                 NULL,
132                 false,
133                 NULL
134         },
135         {
136                 ICMD_LREM,
137                 BUILTIN_lrem,
138                 NULL,
139                 "lrem",
140                 "(JJ)J",
141                 NULL,
142                 NULL,
143                 NULL,
144                 false,
145                 NULL
146         },
147 #endif
148
149         {
150                 ICMD_FREM,
151                 BUILTIN_frem,
152                 NULL,
153                 "frem",
154                 "(FF)F",
155                 NULL,
156                 NULL,
157                 NULL,
158                 false,
159                 NULL
160         },
161         {
162                 ICMD_DREM,
163                 BUILTIN_drem,
164                 NULL,
165                 "drem",
166                 "(DD)D",
167                 NULL,
168                 NULL,
169                 NULL,
170                 false,
171                 NULL
172         },
173
174
175         /* internal functions *****************************************************/
176
177         {
178                 ICMD_NEW,
179                 BUILTIN_new,
180                 NULL,
181                 "new",
182                 "(Ljava/lang/Class;)Ljava/lang/Object;",
183                 NULL,
184                 NULL,
185                 NULL,
186                 false,
187                 NULL
188         },
189         {
190                 ICMD_ANEWARRAY,
191                 BUILTIN_newarray,
192                 NULL,
193                 "newarray",
194         "(ILjava/lang/Class;)[Ljava/lang/Object;",
195                 NULL,
196                 NULL,
197                 NULL,
198                 false,
199                 NULL
200         },
201         {
202                 ICMD_NEWARRAY,
203                 BUILTIN_newarray_boolean,
204                 NULL,
205                 "newarray_boolean",
206                 "(I)[Z",
207                 NULL,
208                 NULL,
209                 NULL,
210                 false,
211                 NULL
212         },
213         {
214                 ICMD_NEWARRAY,
215                 BUILTIN_newarray_byte,
216                 NULL,
217                 "newarray_byte",
218                 "(I)[B",
219                 NULL,
220                 NULL,
221                 NULL,
222                 false,
223                 NULL
224         },
225         {
226                 ICMD_NEWARRAY,
227                 BUILTIN_newarray_char,
228                 NULL,
229                 "newarray_char",
230                 "(I)[C",
231                 NULL,
232                 NULL,
233                 NULL,
234                 false,
235                 NULL
236         },
237         {
238                 ICMD_NEWARRAY,
239                 BUILTIN_newarray_short,
240                 NULL,
241                 "newarray_short",
242                 "(I)[S",
243                 NULL,
244                 NULL,
245                 NULL,
246                 false,
247                 NULL
248         },
249         {
250                 ICMD_NEWARRAY,
251                 BUILTIN_newarray_int,
252                 NULL,
253                 "newarray_int",
254                 "(I)[I",
255                 NULL,
256                 NULL,
257                 NULL,
258                 false,
259                 NULL
260         },
261         {
262                 ICMD_NEWARRAY,
263                 BUILTIN_newarray_long,
264                 NULL,
265                 "newarray_long",
266                 "(I)[J",
267                 NULL,
268                 NULL,
269                 NULL,
270                 false,
271                 NULL
272         },
273         {
274                 ICMD_NEWARRAY,
275                 BUILTIN_newarray_float,
276                 NULL,
277                 "newarray_float",
278                 "(I)[F",
279                 NULL,
280                 NULL,
281                 NULL,
282                 false,
283                 NULL
284         },
285         {
286                 ICMD_NEWARRAY,
287                 BUILTIN_newarray_double,
288                 NULL,
289                 "newarray_double",
290                 "(I)[D",
291                 NULL,
292                 NULL,
293                 NULL,
294                 false,
295                 NULL
296         },
297         {
298                 ICMD_CHECKCAST,
299                 BUILTIN_arraycheckcast,
300                 NULL,
301                 "arraycheckcast",
302                 "([Ljava/lang/Object;[Ljava/lang/Object;)[Ljava/lang/Object;",
303                 NULL,
304                 NULL,
305                 NULL,
306                 false,
307                 NULL
308         },
309         {
310                 ICMD_INSTANCEOF,
311                 BUILTIN_arrayinstanceof,
312                 NULL,
313                 "arrayinstanceof",
314                 "([Ljava/lang/Object;[Ljava/lang/Object;)I",
315                 NULL,
316                 NULL,
317                 NULL,
318                 false,
319                 NULL
320         },
321         {
322                 ICMD_AASTORE,
323                 BUILTIN_canstore,
324                 NULL,
325                 "canstore",
326                 "([Ljava/lang/Object;Ljava/lang/Object;)I",
327                 NULL,
328                 NULL,
329                 NULL,
330                 false,
331                 NULL
332         },
333
334 #if defined(ENABLE_THREADS)
335         {
336                 ICMD_MONITORENTER,
337                 LOCK_monitor_enter,
338                 NULL,
339                 "monitorenter",
340                 "(Ljava/lang/Object;)V",
341                 NULL,
342                 NULL,
343                 NULL,
344                 false,
345                 NULL
346         },
347         {
348                 ICMD_MONITOREXIT,
349                 LOCK_monitor_exit,
350                 NULL,
351                 "monitorexit",
352                 "(Ljava/lang/Object;)V",
353                 NULL,
354                 NULL,
355                 NULL,
356                 false,
357                 NULL
358         },
359 #endif
360
361
362         /* stop entry */
363
364         {
365                 255,
366                 NULL,
367                 NULL,
368                 NULL,
369                 NULL,
370                 NULL,
371                 NULL,
372                 NULL,
373                 false,
374                 NULL
375         },
376 };
377
378
379 /* automatically replaced functions *******************************************/
380
381 static builtintable_entry builtintable_automatic[] = {
382
383 #if !(SUPPORT_LONG && SUPPORT_LONG_CMP)
384         {
385                 ICMD_LCMP,
386                 BUILTIN_lcmp,
387                 NULL,
388                 "lcmp",
389                 "(JJ)I",
390                 NULL,
391                 NULL,
392                 NULL,
393                 false,
394                 NULL
395         },
396 #endif
397
398 #if !(SUPPORT_LONG && SUPPORT_LONG_LOGICAL)
399         {
400                 ICMD_LAND,
401                 BUILTIN_land,
402                 NULL,
403                 "land",
404                 "(JJ)J",
405                 NULL,
406                 NULL,
407                 NULL,
408                 false,
409                 NULL
410         },
411         {
412                 ICMD_LOR,
413                 BUILTIN_lor,
414                 NULL,
415                 "lor",
416                 "(JJ)J",
417                 NULL,
418                 NULL,
419                 NULL,
420                 false,
421                 NULL
422         },
423         {
424                 ICMD_LXOR,
425                 BUILTIN_lxor,
426                 NULL,
427                 "lxor",
428                 "(JJ)J",
429                 NULL,
430                 NULL,
431                 NULL,
432                 false,
433                 NULL
434         },
435 #endif /* !(SUPPORT_LONG && SUPPORT_LONG_LOGICAL) */
436
437 #if !(SUPPORT_LONG && SUPPORT_LONG_SHIFT)
438         {
439                 ICMD_LSHL,
440                 BUILTIN_lshl,
441                 NULL,
442                 "lshl",
443                 "(JI)J",
444                 NULL,
445                 NULL,
446                 NULL,
447                 false,
448                 NULL
449         },
450         {
451                 ICMD_LSHR,
452                 BUILTIN_lshr,
453                 NULL,
454                 "lshr",
455                 "(JI)J",
456                 NULL,
457                 NULL,
458                 NULL,
459                 false,
460                 NULL
461         },
462         {
463                 ICMD_LUSHR,
464                 BUILTIN_lushr,
465                 NULL,
466                 "lushr",
467                 "(JI)J",
468                 NULL,
469                 NULL,
470                 NULL,
471                 false,
472                 NULL
473         },
474 #endif /* !(SUPPORT_LONG && SUPPORT_LONG_SHIFT) */
475
476 #if !(SUPPORT_LONG && SUPPORT_LONG_ADD)
477         {
478                 ICMD_LADD,
479                 BUILTIN_ladd,
480                 NULL,
481                 "ladd",
482                 "(JJ)J",
483                 NULL,
484                 NULL,
485                 NULL,
486                 false,
487                 NULL
488         },
489         {
490                 ICMD_LSUB,
491                 BUILTIN_lsub,
492                 NULL,
493                 "lsub",
494                 "(JJ)J",
495                 NULL,
496                 NULL,
497                 NULL,
498                 false,
499                 NULL
500         },
501         {
502                 ICMD_LNEG,
503                 BUILTIN_lneg,
504                 NULL,
505                 "lneg",
506                 "(J)J",
507                 NULL,
508                 NULL,
509                 NULL,
510                 false,
511                 NULL
512         },
513 #endif /* !(SUPPORT_LONG && SUPPORT_LONG_ADD) */
514
515 #if !(SUPPORT_LONG && SUPPORT_LONG_MUL)
516         {
517                 ICMD_LMUL,
518                 BUILTIN_lmul,
519                 NULL,
520                 "lmul",
521                 "(JJ)J",
522                 NULL,
523                 NULL,
524                 NULL,
525                 false,
526                 NULL
527         },
528 #endif
529
530 #if !(SUPPORT_FLOAT && SUPPORT_I2F)
531         {
532                 ICMD_I2F,
533                 BUILTIN_i2f,
534                 NULL,
535                 "i2f",
536                 "(I)F",
537                 NULL,
538                 NULL,
539                 NULL,
540                 false,
541                 NULL
542         },
543 #endif
544
545 #if !(SUPPORT_DOUBLE && SUPPORT_I2D)
546         {
547                 ICMD_I2D,
548                 BUILTIN_i2d,
549                 NULL,
550                 "i2d",
551                 "(I)D",
552                 NULL,
553                 NULL,
554                 NULL,
555                 false,
556                 NULL
557         },
558 #endif
559
560 #if !(SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_L2F)
561         {
562                 ICMD_L2F,
563                 BUILTIN_l2f,
564                 NULL,
565                 "l2f",
566                 "(J)F",
567                 NULL,
568                 NULL,
569                 NULL,
570                 false,
571                 NULL
572         },
573 #endif
574
575 #if !(SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_L2D)
576         {
577                 ICMD_L2D,
578                 BUILTIN_l2d,
579                 NULL,
580                 "l2d",
581                 "(J)D",
582                 NULL,
583                 NULL,
584                 NULL,
585                 false,
586                 NULL
587         },
588 #endif
589
590 #if !(SUPPORT_FLOAT && SUPPORT_F2I)
591         {
592                 ICMD_F2I,
593                 BUILTIN_f2i,
594                 NULL,
595                 "f2i",
596                 "(F)I",
597                 NULL,
598                 NULL,
599                 NULL,
600                 false,
601                 NULL
602         },
603 #endif
604
605 #if !(SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_F2L)
606         {
607                 ICMD_F2L,
608                 BUILTIN_f2l,
609                 NULL,
610                 "f2l",
611                 "(F)J",
612                 NULL,
613                 NULL,
614                 NULL,
615                 false,
616                 NULL
617         },
618 #endif
619
620 #if !(SUPPORT_DOUBLE && SUPPORT_D2I)
621         {
622                 ICMD_D2I,
623                 BUILTIN_d2i,
624                 NULL,
625                 "d2i",
626                 "(D)I",
627                 NULL,
628                 NULL,
629                 NULL,
630                 false,
631                 NULL
632         },
633 #endif
634
635 #if !(SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_D2L)
636         {
637                 ICMD_D2L,
638                 BUILTIN_d2l,
639                 NULL,
640                 "d2l",
641                 "(D)J",
642                 NULL,
643                 NULL,
644                 NULL,
645                 false,
646                 NULL
647         },
648 #endif
649
650
651         /* float functions ********************************************************/
652
653 #if !SUPPORT_FLOAT
654         {
655                 ICMD_FADD,
656                 BUILTIN_fadd,
657                 NULL,
658                 "fadd",
659                 "(FF)F",
660                 NULL,
661                 NULL,
662                 NULL,
663                 false,
664                 NULL
665         },
666         {
667                 ICMD_FSUB,
668                 BUILTIN_fsub,
669                 NULL,
670                 "fsub",
671                 "(FF)F",
672                 NULL,
673                 NULL,
674                 NULL,
675                 false,
676                 NULL
677         },
678         {
679                 ICMD_FMUL,
680                 BUILTIN_fmul,
681                 NULL,
682                 "fmul",
683                 "(FF)F",
684                 NULL,
685                 NULL,
686                 NULL,
687                 false,
688                 NULL
689         },
690         {
691                 ICMD_FDIV,
692                 BUILTIN_fdiv,
693                 NULL,
694                 "fdiv",
695                 "(FF)F",
696                 NULL,
697                 NULL,
698                 NULL,
699                 false,
700                 NULL
701         },
702         {
703                 ICMD_FNEG,
704                 BUILTIN_fneg,
705                 NULL,
706                 "fneg",
707                 "(F)F",
708                 NULL,
709                 NULL,
710                 NULL,
711                 false,
712                 NULL
713         },
714 #endif /* !SUPPORT_FLOAT */
715
716 #if !SUPPORT_FLOAT || !SUPPORT_FLOAT_CMP
717         {
718                 ICMD_FCMPL,
719                 BUILTIN_fcmpl,
720                 NULL,
721                 "fcmpl",
722                 "(FF)I",
723                 NULL,
724                 NULL,
725                 NULL,
726                 false,
727                 NULL
728         },
729         {
730                 ICMD_FCMPG,
731                 BUILTIN_fcmpg,
732                 NULL,
733                 "fcmpg",
734                 "(FF)I",
735                 NULL,
736                 NULL,
737                 NULL,
738                 false,
739                 NULL
740         },
741 #endif /* !SUPPORT_FLOAT || !SUPPORT_FLOAT_CMP */
742
743
744         /* double functions *******************************************************/
745
746 #if !SUPPORT_DOUBLE
747         {
748                 ICMD_DADD,
749                 BUILTIN_dadd,
750                 NULL,
751                 "dadd",
752                 "(DD)D",
753                 NULL,
754                 NULL,
755                 NULL,
756                 false,
757                 NULL
758         },
759         {
760                 ICMD_DSUB,
761                 BUILTIN_dsub,
762                 NULL,
763                 "dsub",
764                 "(DD)D",
765                 NULL,
766                 NULL,
767                 NULL,
768                 false,
769                 NULL
770         },
771         {
772                 ICMD_DMUL,
773                 BUILTIN_dmul,
774                 NULL,
775                 "dmul",
776                 "(DD)D",
777                 NULL,
778                 NULL,
779                 NULL,
780                 false,
781                 NULL
782         },
783         {
784                 ICMD_DDIV,
785                 BUILTIN_ddiv,
786                 NULL,
787                 "ddiv",
788                 "(DD)D",
789                 NULL,
790                 NULL,
791                 NULL,
792                 false,
793                 NULL
794         },
795         {
796                 ICMD_DNEG,
797                 BUILTIN_dneg,
798                 NULL,
799                 "dneg",
800                 "(D)D",
801                 NULL,
802                 NULL,
803                 NULL,
804                 false,
805                 NULL
806         },
807 #endif /* !SUPPORT_DOUBLE */
808
809 #if !SUPPORT_DOUBLE || !SUPPORT_DOUBLE_CMP
810         {
811                 ICMD_DCMPL,
812                 BUILTIN_dcmpl,
813                 NULL,
814                 "dcmpl",
815                 "(DD)I",
816                 NULL,
817                 NULL,
818                 NULL,
819                 false,
820                 NULL
821         },
822         {
823                 ICMD_DCMPG,
824                 BUILTIN_dcmpg,
825                 NULL,
826                 "dcmpg",
827                 "(DD)I",
828                 NULL,
829                 NULL,
830                 NULL,
831                 false,
832                 NULL
833         },
834 #endif /* !SUPPORT_DOUBLE || !SUPPORT_DOUBLE_CMP */
835
836
837         /* float/double functions *************************************************/
838
839 #if !(SUPPORT_FLOAT && SUPPORT_DOUBLE)
840         {
841                 ICMD_F2D,
842                 BUILTIN_f2d,
843                 NULL,
844                 "f2d",
845                 "(F)D",
846                 NULL,
847                 NULL,
848                 NULL,
849                 false,
850                 NULL
851         },
852         {
853                 ICMD_D2F,
854                 BUILTIN_d2f,
855                 NULL,
856                 "d2f",
857                 "(D)F",
858                 NULL,
859                 NULL,
860                 NULL,
861                 false,
862                 NULL
863         },
864 #endif /* !(SUPPORT_FLOAT && SUPPORT_DOUBLE) */
865
866
867         /* prevent a compiler warning if everything is supported (e.g. i386) */
868
869         {
870                 255,
871                 NULL,
872                 NULL,
873                 NULL,
874                 NULL,
875                 NULL,
876                 NULL,
877                 NULL,
878                 false,
879                 NULL
880         },
881 };
882
883
884 /* automatically replaced functions *******************************************/
885
886 static builtintable_entry builtintable_function[] = {
887 #if defined(ENABLE_JIT)
888
889         /* java.lang.VMSystem.arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V STATIC NATIVE */
890
891         {
892                 ICMD_BUILTIN,
893                 BUILTIN_arraycopy,
894                 "java/lang/VMSystem",
895                 "arraycopy",
896                 "(Ljava/lang/Object;ILjava/lang/Object;II)V",
897                 NULL,
898                 NULL,
899                 NULL,
900                 true,
901                 NULL
902         },
903
904         /* java.lang.System.arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V PUBLIC STATIC */
905
906 #if 0
907         /* We disable this one until we have a fix for the stacktrace
908            issue. */
909
910         {
911                 ICMD_BUILTIN,
912                 BUILTIN_arraycopy,
913                 "java/lang/System",
914                 "arraycopy",
915                 "(Ljava/lang/Object;ILjava/lang/Object;II)V",
916                 NULL,
917                 NULL,
918                 NULL,
919                 true,
920                 NULL
921         },
922 #endif
923
924         /* java.lang.VMSystem.currentTimeMillis()J PUBLIC STATIC */
925
926         {
927                 ICMD_BUILTIN,
928                 BUILTIN_currenttimemillis,
929                 "java/lang/VMSystem",
930                 "currentTimeMillis",
931                 "()J",
932                 NULL,
933                 NULL,
934                 NULL,
935                 false,
936                 NULL
937         },
938
939         /* java.lang.System.currentTimeMillis()J PUBLIC STATIC */
940
941         {
942                 ICMD_BUILTIN,
943                 BUILTIN_currenttimemillis,
944                 "java/lang/System",
945                 "currentTimeMillis",
946                 "()J",
947                 NULL,
948                 NULL,
949                 NULL,
950                 false,
951                 NULL
952         },
953
954 #endif /* defined(ENABLE_JIT) */
955
956         /* stop entry */
957
958         {
959                 255,
960                 NULL,
961                 NULL,
962                 NULL,
963                 NULL,
964                 NULL,
965                 NULL,
966                 NULL,
967                 false,
968                 NULL
969         },
970 };
971
972
973 /*
974  * These are local overrides for various environment variables in Emacs.
975  * Please do not remove this and leave it at the end of the file, where
976  * Emacs will automagically detect them.
977  * ---------------------------------------------------------------------
978  * Local variables:
979  * mode: c
980  * indent-tabs-mode: t
981  * c-basic-offset: 4
982  * tab-width: 4
983  * End:
984  */