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

◆ VarDecMul()

static unsafe void System.Decimal.DecCalc.VarDecMul ( ref DecCalc d1,
ref DecCalc d2 )
inlinestaticpackage

Definition at line 1127 of file Decimal.cs.

1128 {
1129 int num = (byte)(d1.uflags + d2.uflags >> 16);
1130 Unsafe.SkipInit<Buf24>(out var value);
1131 uint num6;
1132 if ((d1.High | d1.Mid) == 0)
1133 {
1134 ulong num4;
1135 if ((d2.High | d2.Mid) == 0)
1136 {
1137 ulong num2 = UInt32x32To64(d1.Low, d2.Low);
1138 if (num > 28)
1139 {
1140 if (num > 47)
1141 {
1142 goto IL_03b4;
1143 }
1144 num -= 29;
1145 ulong num3 = s_ulongPowers10[num];
1146 num4 = num2 / num3;
1147 ulong num5 = num2 - num4 * num3;
1148 num2 = num4;
1149 num3 >>= 1;
1150 if (num5 >= num3 && (num5 > num3 || ((uint)(int)num2 & (true ? 1u : 0u)) != 0))
1151 {
1152 num2++;
1153 }
1154 num = 28;
1155 }
1156 d1.Low64 = num2;
1157 d1.uflags = ((d2.uflags ^ d1.uflags) & 0x80000000u) | (uint)(num << 16);
1158 return;
1159 }
1160 num4 = UInt32x32To64(d1.Low, d2.Low);
1161 value.U0 = (uint)num4;
1162 num4 = UInt32x32To64(d1.Low, d2.Mid) + (num4 >> 32);
1163 value.U1 = (uint)num4;
1164 num4 >>= 32;
1165 if (d2.High != 0)
1166 {
1167 num4 += UInt32x32To64(d1.Low, d2.High);
1168 if (num4 > uint.MaxValue)
1169 {
1170 value.Mid64 = num4;
1171 num6 = 3u;
1172 goto IL_0368;
1173 }
1174 }
1175 value.U2 = (uint)num4;
1176 num6 = 2u;
1177 }
1178 else if ((d2.High | d2.Mid) == 0)
1179 {
1180 ulong num4 = UInt32x32To64(d2.Low, d1.Low);
1181 value.U0 = (uint)num4;
1182 num4 = UInt32x32To64(d2.Low, d1.Mid) + (num4 >> 32);
1183 value.U1 = (uint)num4;
1184 num4 >>= 32;
1185 if (d1.High != 0)
1186 {
1187 num4 += UInt32x32To64(d2.Low, d1.High);
1188 if (num4 > uint.MaxValue)
1189 {
1190 value.Mid64 = num4;
1191 num6 = 3u;
1192 goto IL_0368;
1193 }
1194 }
1195 value.U2 = (uint)num4;
1196 num6 = 2u;
1197 }
1198 else
1199 {
1200 ulong num4 = UInt32x32To64(d1.Low, d2.Low);
1201 value.U0 = (uint)num4;
1202 ulong num7 = UInt32x32To64(d1.Low, d2.Mid) + (num4 >> 32);
1203 num4 = UInt32x32To64(d1.Mid, d2.Low);
1204 num4 += num7;
1205 value.U1 = (uint)num4;
1206 num7 = ((num4 >= num7) ? (num4 >> 32) : ((num4 >> 32) | 0x100000000uL));
1207 num4 = UInt32x32To64(d1.Mid, d2.Mid) + num7;
1208 if ((d1.High | d2.High) != 0)
1209 {
1210 num7 = UInt32x32To64(d1.Low, d2.High);
1211 num4 += num7;
1212 uint num8 = 0u;
1213 if (num4 < num7)
1214 {
1215 num8 = 1u;
1216 }
1217 num7 = UInt32x32To64(d1.High, d2.Low);
1218 num4 += num7;
1219 value.U2 = (uint)num4;
1220 if (num4 < num7)
1221 {
1222 num8++;
1223 }
1224 num7 = ((ulong)num8 << 32) | (num4 >> 32);
1225 num4 = UInt32x32To64(d1.Mid, d2.High);
1226 num4 += num7;
1227 num8 = 0u;
1228 if (num4 < num7)
1229 {
1230 num8 = 1u;
1231 }
1232 num7 = UInt32x32To64(d1.High, d2.Mid);
1233 num4 += num7;
1234 value.U3 = (uint)num4;
1235 if (num4 < num7)
1236 {
1237 num8++;
1238 }
1239 num4 = ((ulong)num8 << 32) | (num4 >> 32);
1240 value.High64 = UInt32x32To64(d1.High, d2.High) + num4;
1241 num6 = 5u;
1242 }
1243 else
1244 {
1245 value.Mid64 = num4;
1246 num6 = 3u;
1247 }
1248 }
1249 uint* ptr = (uint*)(&value);
1250 while (ptr[(int)num6] == 0)
1251 {
1252 if (num6 != 0)
1253 {
1254 num6--;
1255 continue;
1256 }
1257 goto IL_03b4;
1258 }
1259 goto IL_0368;
1260 IL_0368:
1261 if (num6 > 2 || num > 28)
1262 {
1263 num = ScaleResult(&value, num6, num);
1264 }
1265 d1.Low64 = value.Low64;
1266 d1.High = value.U2;
1267 d1.uflags = ((d2.uflags ^ d1.uflags) & 0x80000000u) | (uint)(num << 16);
1268 return;
1269 IL_03b4:
1270 d1 = default(DecCalc);
1271 }
static unsafe int ScaleResult(Buf24 *bufRes, uint hiRes, int scale)
Definition Decimal.cs:513
static ulong UInt32x32To64(uint a, uint b)
Definition Decimal.cs:300
static readonly ulong[] s_ulongPowers10
Definition Decimal.cs:207

References System.Runtime.Serialization.Dictionary, System.Decimal.DecCalc.s_ulongPowers10, System.Decimal.DecCalc.ScaleResult(), System.Decimal.DecCalc.UInt32x32To64(), and System.value.

Referenced by System.Decimal.Multiply(), and System.Decimal.operator*().