@@ -72,6 +72,8 @@ extern "C" {
72
72
SLJIT_NUMBER_OF_FLOAT_REGISTERS : number of available floating point registers
73
73
SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers
74
74
SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers
75
+ SLJIT_NUMBER_OF_TEMPORARY_REGISTERS : number of available temporary registers
76
+ SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS : number of available temporary floating point registers
75
77
SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index
76
78
SLJIT_F32_SHIFT : the shift required to apply when accessing
77
79
a single precision floating point array by index
@@ -81,8 +83,21 @@ extern "C" {
81
83
the scratch register index of ecx is stored in this variable
82
84
SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)
83
85
SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address
86
+ SLJIT_CONV_MAX_FLOAT : result when a floating point value is converted to integer
87
+ and the floating point value is higher than the maximum integer value
88
+ (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT)
89
+ SLJIT_CONV_MIN_FLOAT : result when a floating point value is converted to integer
90
+ and the floating point value is lower than the minimum integer value
91
+ (possible values: SLJIT_CONV_RESULT_MAX_INT or SLJIT_CONV_RESULT_MIN_INT)
92
+ SLJIT_CONV_NAN_FLOAT : result when a NaN floating point value is converted to integer
93
+ (possible values: SLJIT_CONV_RESULT_MAX_INT, SLJIT_CONV_RESULT_MIN_INT,
94
+ or SLJIT_CONV_RESULT_ZERO)
84
95
85
96
Other macros:
97
+ SLJIT_TMP_R0 .. R9 : accessing temporary registers
98
+ SLJIT_TMP_R(i) : accessing temporary registers
99
+ SLJIT_TMP_FR0 .. FR9 : accessing temporary floating point registers
100
+ SLJIT_TMP_FR(i) : accessing temporary floating point registers
86
101
SLJIT_FUNC : calling convention attribute for both calling JIT from C and C calling back from JIT
87
102
SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (platform independent helper)
88
103
SLJIT_F64_SECOND(reg) : provides the register index of the second 32 bit part of a 64 bit
@@ -356,6 +371,38 @@ typedef double sljit_f64;
356
371
#define SLJIT_F32_SHIFT 2
357
372
#define SLJIT_F64_SHIFT 3
358
373
374
+ #define SLJIT_CONV_RESULT_MAX_INT 0
375
+ #define SLJIT_CONV_RESULT_MIN_INT 1
376
+ #define SLJIT_CONV_RESULT_ZERO 2
377
+
378
+ #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86 )
379
+ #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MIN_INT
380
+ #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
381
+ #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT
382
+ #elif (defined SLJIT_CONFIG_ARM && SLJIT_CONFIG_ARM )
383
+ #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
384
+ #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
385
+ #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_ZERO
386
+ #elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS )
387
+ #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
388
+ #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MAX_INT
389
+ #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT
390
+ #elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC )
391
+ #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
392
+ #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
393
+ #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT
394
+ #elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV )
395
+ #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
396
+ #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
397
+ #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MAX_INT
398
+ #elif (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X )
399
+ #define SLJIT_CONV_MAX_FLOAT SLJIT_CONV_RESULT_MAX_INT
400
+ #define SLJIT_CONV_MIN_FLOAT SLJIT_CONV_RESULT_MIN_INT
401
+ #define SLJIT_CONV_NAN_FLOAT SLJIT_CONV_RESULT_MIN_INT
402
+ #else
403
+ #error "Result for float to integer conversion is not defined"
404
+ #endif
405
+
359
406
#ifndef SLJIT_W
360
407
361
408
/* Defining long constants. */
@@ -528,8 +575,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
528
575
529
576
#define SLJIT_NUMBER_OF_REGISTERS 12
530
577
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
578
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 1
531
579
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 7
532
580
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
581
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1
533
582
#define SLJIT_LOCALS_OFFSET_BASE (8 * SSIZE_OF(sw))
534
583
#define SLJIT_PREF_SHIFT_REG SLJIT_R2
535
584
#define SLJIT_MASKED_SHIFT 1
@@ -538,7 +587,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
538
587
#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64 )
539
588
540
589
#define SLJIT_NUMBER_OF_REGISTERS 13
590
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2
541
591
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15
592
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1
542
593
#ifndef _WIN64
543
594
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
544
595
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
@@ -556,16 +607,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
556
607
557
608
#define SLJIT_NUMBER_OF_REGISTERS 12
558
609
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
610
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 2
559
611
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 14
560
612
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
613
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
561
614
#define SLJIT_LOCALS_OFFSET_BASE 0
562
615
563
616
#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64 )
564
617
565
618
#define SLJIT_NUMBER_OF_REGISTERS 26
566
619
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
620
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3
567
621
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
568
622
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
623
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
569
624
#define SLJIT_LOCALS_OFFSET_BASE (2 * (sljit_s32)sizeof(sljit_sw))
570
625
#define SLJIT_MASKED_SHIFT 1
571
626
#define SLJIT_MASKED_SHIFT32 1
@@ -574,8 +629,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
574
629
575
630
#define SLJIT_NUMBER_OF_REGISTERS 23
576
631
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
632
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3
577
633
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
578
634
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 18
635
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
579
636
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64 ) || (defined _AIX )
580
637
#define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * (sljit_s32)sizeof(sljit_sw))
581
638
#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32 )
@@ -598,16 +655,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
598
655
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 29
599
656
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
600
657
#endif
658
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5
659
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 3
601
660
#define SLJIT_MASKED_SHIFT 1
602
661
#define SLJIT_MASKED_SHIFT32 1
603
662
604
663
#elif (defined SLJIT_CONFIG_RISCV && SLJIT_CONFIG_RISCV )
605
664
606
665
#define SLJIT_NUMBER_OF_REGISTERS 23
607
666
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 12
608
- #define SLJIT_LOCALS_OFFSET_BASE 0
667
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5
609
668
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
610
669
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12
670
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
671
+ #define SLJIT_LOCALS_OFFSET_BASE 0
611
672
#define SLJIT_MASKED_SHIFT 1
612
673
#define SLJIT_MASKED_SHIFT32 1
613
674
@@ -636,18 +697,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
636
697
637
698
#define SLJIT_NUMBER_OF_REGISTERS 12
638
699
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
700
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 3
639
701
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 15
640
702
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 8
703
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 1
641
704
#define SLJIT_LOCALS_OFFSET_BASE SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE
642
705
#define SLJIT_MASKED_SHIFT 1
643
706
644
707
#elif (defined SLJIT_CONFIG_LOONGARCH && SLJIT_CONFIG_LOONGARCH )
645
708
646
709
#define SLJIT_NUMBER_OF_REGISTERS 23
647
710
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
648
- #define SLJIT_LOCALS_OFFSET_BASE 0
711
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 5
649
712
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 30
650
713
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 12
714
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 2
715
+ #define SLJIT_LOCALS_OFFSET_BASE 0
651
716
#define SLJIT_MASKED_SHIFT 1
652
717
#define SLJIT_MASKED_SHIFT32 1
653
718
@@ -656,8 +721,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
656
721
/* Just to have something. */
657
722
#define SLJIT_NUMBER_OF_REGISTERS 0
658
723
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
724
+ #define SLJIT_NUMBER_OF_TEMPORARY_REGISTERS 0
659
725
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 0
660
726
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
727
+ #define SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS 0
661
728
#define SLJIT_LOCALS_OFFSET_BASE 0
662
729
663
730
#endif
@@ -670,6 +737,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
670
737
#define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
671
738
(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
672
739
740
+ /**********************************/
741
+ /* Temporary register management. */
742
+ /**********************************/
743
+
744
+ #define SLJIT_TMP_REGISTER_BASE (SLJIT_NUMBER_OF_REGISTERS + 2)
745
+ #define SLJIT_TMP_FREGISTER_BASE (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
746
+
747
+ /* WARNING: Accessing temporary registers is not recommended, because they
748
+ are also used by the JIT compiler for various computations. Using them
749
+ might have any side effects including incorrect operations and crashes,
750
+ so use them at your own risk. The machine registers themselves might have
751
+ limitations, e.g. the r0 register on s390x / ppc cannot be used as
752
+ base address for memory operations. */
753
+
754
+ /* Temporary registers */
755
+ #define SLJIT_TMP_R0 (SLJIT_TMP_REGISTER_BASE + 0)
756
+ #define SLJIT_TMP_R1 (SLJIT_TMP_REGISTER_BASE + 1)
757
+ #define SLJIT_TMP_R2 (SLJIT_TMP_REGISTER_BASE + 2)
758
+ #define SLJIT_TMP_R3 (SLJIT_TMP_REGISTER_BASE + 3)
759
+ #define SLJIT_TMP_R4 (SLJIT_TMP_REGISTER_BASE + 4)
760
+ #define SLJIT_TMP_R5 (SLJIT_TMP_REGISTER_BASE + 5)
761
+ #define SLJIT_TMP_R6 (SLJIT_TMP_REGISTER_BASE + 6)
762
+ #define SLJIT_TMP_R7 (SLJIT_TMP_REGISTER_BASE + 7)
763
+ #define SLJIT_TMP_R8 (SLJIT_TMP_REGISTER_BASE + 8)
764
+ #define SLJIT_TMP_R9 (SLJIT_TMP_REGISTER_BASE + 9)
765
+ #define SLJIT_TMP_R (i ) (SLJIT_TMP_REGISTER_BASE + (i))
766
+
767
+ #define SLJIT_TMP_FR0 (SLJIT_TMP_FREGISTER_BASE + 0)
768
+ #define SLJIT_TMP_FR1 (SLJIT_TMP_FREGISTER_BASE + 1)
769
+ #define SLJIT_TMP_FR2 (SLJIT_TMP_FREGISTER_BASE + 2)
770
+ #define SLJIT_TMP_FR3 (SLJIT_TMP_FREGISTER_BASE + 3)
771
+ #define SLJIT_TMP_FR4 (SLJIT_TMP_FREGISTER_BASE + 4)
772
+ #define SLJIT_TMP_FR5 (SLJIT_TMP_FREGISTER_BASE + 5)
773
+ #define SLJIT_TMP_FR6 (SLJIT_TMP_FREGISTER_BASE + 6)
774
+ #define SLJIT_TMP_FR7 (SLJIT_TMP_FREGISTER_BASE + 7)
775
+ #define SLJIT_TMP_FR8 (SLJIT_TMP_FREGISTER_BASE + 8)
776
+ #define SLJIT_TMP_FR9 (SLJIT_TMP_FREGISTER_BASE + 9)
777
+ #define SLJIT_TMP_FR (i ) (SLJIT_TMP_FREGISTER_BASE + (i))
778
+
673
779
/********************************/
674
780
/* CPU status flags management. */
675
781
/********************************/
@@ -690,7 +796,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_sw sljit_exec_offset(void* ptr);
690
796
#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32 ) \
691
797
|| (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32 )
692
798
#define SLJIT_F64_SECOND (reg ) \
693
- ((reg) + SLJIT_FS0)
799
+ ((reg) + SLJIT_FS0 + SLJIT_NUMBER_OF_TEMPORARY_FLOAT_REGISTERS )
694
800
#else /* !SLJIT_CONFIG_ARM_32 && !SLJIT_CONFIG_MIPS_32 */
695
801
#define SLJIT_F64_SECOND (reg ) \
696
802
(reg)
0 commit comments