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