@@ -33,6 +33,19 @@ struct FCQWORD
33
33
var int B ; // Low.
34
34
};
35
35
36
+ // 64-bit unsigned integer simulated as four 16-bit signed words.
37
+ struct FCQWORD16
38
+ {
39
+ var int A ; // High.
40
+ var int B ;
41
+ var int C ;
42
+ var int D ; // Low.
43
+ };
44
+
45
+ // TODO: need conversion functions between FCQWORD <-> FCQWORD16!
46
+ // TODO: need variants of all comparison functions also for FCQWORD16?
47
+ // TODO: make FCQWORD_Mul with the help of FCQWORD16_Mul?
48
+
36
49
// Return A > B.
37
50
final static function bool IsGt (const out FCQWORD A , const out FCQWORD B )
38
51
{
@@ -127,3 +140,53 @@ final static function bool IsLte_AsUInt32(int A, int B)
127
140
Msb = Msb - (Msb >>> 1 );
128
141
return !bool ((B & Msb ) ^ Msb );
129
142
}
143
+
144
+ // Calculate QW *= Mul, return carry.
145
+ final static function FCQWORD16_Mul (out FCQWORD16 QW , FCQWORD16 Mul )
146
+ {
147
+ local FCQWORD16 Res ;
148
+ local int Tmp ;
149
+ local int Carry ;
150
+ local int Carry_Hi16 ;
151
+
152
+ Tmp = QW .D * Mul .D ;
153
+ Carry = (Tmp >>> 16 ) & 0xffff ;
154
+ Res .D = Tmp & 0xffff ;
155
+
156
+ Tmp = Carry + (QW .D * Mul .C ) + (QW .C * Mul .D );
157
+ Carry = (Tmp >>> 16 ) & 0xffff ;
158
+ Res .C = Tmp & 0xffff ;
159
+
160
+ Tmp = Carry + (QW .D * Mul .B ) + (QW .C * Mul .C ) + (QW .B * Mul .D );
161
+ Carry = (Tmp >>> 16 ) & 0xffff ;
162
+ Res .B = Tmp & 0xffff ;
163
+
164
+ Tmp = Carry + (QW .D * Mul .A ) + (QW .C * Mul .B ) + (QW .B * Mul .C ) + (QW .A * Mul .D );
165
+ Carry_Hi16 = ((QW .A * Mul .B ) + (QW .B * Mul .A )) << 16 ;
166
+ Carry = Carry_Hi16 | (((Tmp >>> 16 ) & 0xffff ) + ((QW .A * Mul .C ) + (QW .B * Mul .B ) + (QW .C * Mul .A )));
167
+ Res .A = Tmp & 0xffff ;
168
+
169
+ QW = Res ;
170
+ return Carry ;
171
+ }
172
+
173
+ // Calculate QW += X, return carry.
174
+ final static function int FCQWORD16_AddInt (out FCQWORD16 Qw , int X )
175
+ {
176
+ local int Carry ;
177
+
178
+ QW .D += X ;
179
+
180
+ QW .C += (QW .D >>> 16 ) & 0xffff ;
181
+ QW .D = QW .D & 0xffff ;
182
+
183
+ QW .B += (QW .C >>> 16 ) & 0xffff ;
184
+ QW .C = QW .C & 0xffff ;
185
+
186
+ QW .A += (QW .B >>> 16 ) & 0xffff ;
187
+ QW .B = QW .B & 0xffff ;
188
+ Carry = (QW .A >>> 16 ) & 0xffff ;
189
+ QW .A = QW .A & 0xffff ;
190
+
191
+ return Carry ;
192
+ }
0 commit comments