Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ DecAddSub()

static unsafe void System.Decimal.DecCalc.DecAddSub ( ref DecCalc d1,
ref DecCalc d2,
bool sign )
inlinestaticpackage

Definition at line 713 of file Decimal.cs.

714 {
715 ulong num = d1.Low64;
716 uint num2 = d1.High;
717 uint num3 = d1.uflags;
718 uint num4 = d2.uflags;
719 uint num5 = num4 ^ num3;
720 sign ^= (num5 & 0x80000000u) != 0;
721 int num7;
722 if ((num5 & 0xFF0000u) != 0)
723 {
724 uint num6 = num3;
725 num3 = (num4 & 0xFF0000u) | (num3 & 0x80000000u);
726 num7 = (int)(num3 - num6) >> 16;
727 if (num7 < 0)
728 {
729 num7 = -num7;
730 num3 = num6;
731 if (sign)
732 {
733 num3 ^= 0x80000000u;
734 }
735 num = d2.Low64;
736 num2 = d2.High;
737 d2 = d1;
738 }
739 if (num2 != 0)
740 {
741 goto IL_015f;
742 }
743 if (num > uint.MaxValue)
744 {
745 goto IL_0106;
746 }
747 if ((int)num == 0)
748 {
749 uint num8 = num3 & 0x80000000u;
750 if (sign)
751 {
752 num8 ^= 0x80000000u;
753 }
754 d1 = d2;
755 d1.uflags = (d2.uflags & 0xFF0000u) | num8;
756 return;
757 }
758 while (num7 > 9)
759 {
760 num7 -= 9;
761 num = UInt32x32To64((uint)num, 1000000000u);
762 if (num <= uint.MaxValue)
763 {
764 continue;
765 }
766 goto IL_0106;
767 }
768 num = UInt32x32To64((uint)num, s_powers10[num7]);
769 }
770 goto IL_0450;
771 IL_0106:
772 ulong num10;
773 while (true)
774 {
775 uint b = 1000000000u;
776 if (num7 < 9)
777 {
778 b = s_powers10[num7];
779 }
780 ulong num9 = UInt32x32To64((uint)num, b);
781 num10 = UInt32x32To64((uint)(num >> 32), b) + (num9 >> 32);
782 num = (uint)num9 + (num10 << 32);
783 num2 = (uint)(num10 >> 32);
784 if ((num7 -= 9) <= 0)
785 {
786 break;
787 }
788 if (num2 == 0)
789 {
790 continue;
791 }
792 goto IL_015f;
793 }
794 goto IL_0450;
795 IL_0350:
796 Buf24 value;
797 value.Low64 = num;
798 value.U2 = num2;
799 uint num11;
800 num7 = ScaleResult(&value, num11, (byte)(num3 >> 16));
801 num3 = (num3 & 0xFF00FFFFu) | (uint)(num7 << 16);
802 num = value.Low64;
803 num2 = value.U2;
804 goto IL_04b9;
805 IL_015f:
806 while (true)
807 {
808 uint b = 1000000000u;
809 if (num7 < 9)
810 {
811 b = s_powers10[num7];
812 }
813 ulong num9 = UInt32x32To64((uint)num, b);
814 num10 = UInt32x32To64((uint)(num >> 32), b) + (num9 >> 32);
815 num = (uint)num9 + (num10 << 32);
816 num10 >>= 32;
818 num7 -= 9;
819 if (num10 > uint.MaxValue)
820 {
821 break;
822 }
823 num2 = (uint)num10;
824 if (num7 > 0)
825 {
826 continue;
827 }
828 goto IL_0450;
829 }
830 Unsafe.SkipInit<Buf24>(out value);
831 value.Low64 = num;
833 num11 = 3u;
834 while (num7 > 0)
835 {
836 uint b = 1000000000u;
837 if (num7 < 9)
838 {
839 b = s_powers10[num7];
840 }
841 num10 = 0uL;
842 uint* ptr = (uint*)(&value);
843 uint num12 = 0u;
844 do
845 {
847 ptr[num12] = (uint)num10;
848 num12++;
849 num10 >>= 32;
850 }
851 while (num12 <= num11);
852 if ((uint)num10 != 0)
853 {
854 ptr[++num11] = (uint)num10;
855 }
856 num7 -= 9;
857 }
858 num10 = value.Low64;
859 num = d2.Low64;
860 uint u = value.U2;
861 num2 = d2.High;
862 if (sign)
863 {
864 num = num10 - num;
865 num2 = u - num2;
866 if (num > num10)
867 {
868 num2--;
869 if (num2 >= u)
870 {
871 goto IL_02b3;
872 }
873 }
874 else if (num2 > u)
875 {
876 goto IL_02b3;
877 }
878 }
879 else
880 {
881 num += num10;
882 num2 += u;
883 if (num < num10)
884 {
885 num2++;
886 if (num2 <= u)
887 {
888 goto IL_0312;
889 }
890 }
891 else if (num2 < u)
892 {
893 goto IL_0312;
894 }
895 }
896 goto IL_0350;
897 IL_0312:
898 uint* ptr2 = (uint*)(&value);
899 uint num13 = 3u;
900 while (++ptr2[num13++] == 0)
901 {
902 if (num11 < num13)
903 {
904 ptr2[num13] = 1u;
905 num11 = num13;
906 break;
907 }
908 }
909 goto IL_0350;
910 IL_0450:
911 ulong num14 = num;
912 uint num15 = num2;
913 if (sign)
914 {
915 num = num14 - d2.Low64;
916 num2 = num15 - d2.High;
917 if (num > num14)
918 {
919 num2--;
920 if (num2 >= num15)
921 {
922 goto IL_0394;
923 }
924 }
925 else if (num2 > num15)
926 {
927 goto IL_0394;
928 }
929 }
930 else
931 {
932 num = num14 + d2.Low64;
933 num2 = num15 + d2.High;
934 if (num < num14)
935 {
936 num2++;
937 if (num2 <= num15)
938 {
939 goto IL_03b1;
940 }
941 }
942 else if (num2 < num15)
943 {
944 goto IL_03b1;
945 }
946 }
947 goto IL_04b9;
948 IL_04b9:
949 d1.uflags = num3;
950 d1.High = num2;
951 d1.Low64 = num;
952 return;
953 IL_0394:
954 num3 ^= 0x80000000u;
955 num2 = ~num2;
956 num = 0L - num;
957 if (num == 0L)
958 {
959 num2++;
960 }
961 goto IL_04b9;
962 IL_02b3:
963 uint* ptr3 = (uint*)(&value);
964 uint num16 = 3u;
965 while (ptr3[num16++]-- == 0)
966 {
967 }
968 if (ptr3[num11] != 0 || --num11 > 2)
969 {
970 goto IL_0350;
971 }
972 goto IL_04b9;
973 IL_03b1:
974 if ((num3 & 0xFF0000) == 0)
975 {
976 Number.ThrowOverflowException(TypeCode.Decimal);
977 }
978 num3 -= 65536;
979 ulong num17 = (ulong)num2 + 4294967296uL;
980 num2 = (uint)(num17 / 10);
981 num17 = (num17 - num2 * 10 << 32) + (num >> 32);
982 uint num18 = (uint)(num17 / 10);
983 num17 = (num17 - num18 * 10 << 32) + (uint)num;
984 num = num18;
985 num <<= 32;
986 num18 = (uint)(num17 / 10);
987 num += num18;
988 num18 = (uint)(int)num17 - num18 * 10;
989 if (num18 >= 5 && (num18 > 5 || (num & 1) != 0L) && ++num == 0L)
990 {
991 num2++;
992 }
993 goto IL_04b9;
994 }
static unsafe int ScaleResult(Buf24 *bufRes, uint hiRes, int scale)
Definition Decimal.cs:513
static readonly uint[] s_powers10
Definition Decimal.cs:205
static ulong UInt32x32To64(uint a, uint b)
Definition Decimal.cs:300

References System.Runtime.Serialization.Dictionary, System.L, System.Decimal.DecCalc.s_powers10, System.Decimal.DecCalc.ScaleResult(), System.Number.ThrowOverflowException(), System.Decimal.DecCalc.UInt32x32To64(), and System.value.

Referenced by System.Decimal.Add(), System.Decimal.operator+(), System.Decimal.operator-(), and System.Decimal.Subtract().