VirtualBox

source: vbox/trunk/include/iprt/uint128.h@ 39684

Last change on this file since 39684 was 35492, checked in by vboxsync, 14 years ago

iprt/uint128.h: duh! copy & past bug.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.9 KB
Line 
1/** @file
2 * IPRT - RTUINT128U & uint128_t methods.
3 */
4
5/*
6 * Copyright (C) 2011 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_uint128_h
27#define ___iprt_uint128_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31#include <iprt/err.h>
32
33RT_C_DECLS_BEGIN
34
35/** @defgroup grp_rt_once RTUInt128 - 128-bit Unsigned Integer Methods
36 * @ingroup grp_rt
37 * @{
38 */
39
40
41/**
42 * Test if a 128-bit unsigned integer value is zero.
43 *
44 * @returns true if they are, false if they aren't.
45 * @param pValue The input and output value.
46 */
47DECLINLINE(bool) RTUInt128IsZero(PRTUINT128U pValue)
48{
49#if ARCH_BITS >= 64
50 return pValue->s.Hi == 0
51 && pValue->s.Lo == 0;
52#else
53 return pValue->DWords.dw0 == 0
54 && pValue->DWords.dw1 == 0
55 && pValue->DWords.dw2 == 0
56 && pValue->DWords.dw3 == 0;
57#endif
58}
59
60
61/**
62 * Set a 128-bit unsigned integer value to zero.
63 *
64 * @returns pResult
65 * @param pResult The result variable.
66 */
67DECLINLINE(PRTUINT128U) RTUInt128SetZero(PRTUINT128U pResult)
68{
69#if ARCH_BITS >= 64
70 pResult->s.Hi = 0;
71 pResult->s.Lo = 0;
72#else
73 pResult->DWords.dw0 = 0;
74 pResult->DWords.dw1 = 0;
75 pResult->DWords.dw2 = 0;
76 pResult->DWords.dw3 = 0;
77#endif
78 return pResult;
79}
80
81
82/**
83 * Set a 128-bit unsigned integer value to the maximum value.
84 *
85 * @returns pResult
86 * @param pResult The result variable.
87 */
88DECLINLINE(PRTUINT128U) RTUInt128SetMax(PRTUINT128U pResult)
89{
90#if ARCH_BITS >= 64
91 pResult->s.Hi = UINT64_MAX;
92 pResult->s.Lo = UINT64_MAX;
93#else
94 pResult->DWords.dw0 = UINT32_MAX;
95 pResult->DWords.dw1 = UINT32_MAX;
96 pResult->DWords.dw2 = UINT32_MAX;
97 pResult->DWords.dw3 = UINT32_MAX;
98#endif
99 return pResult;
100}
101
102
103RTDECL(PRTUINT128U) RTUInt128Add(PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
104RTDECL(PRTUINT128U) RTUInt128Sub(PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
105RTDECL(PRTUINT128U) RTUInt128Div(PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
106RTDECL(PRTUINT128U) RTUInt128Mod(PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
107RTDECL(PRTUINT128U) RTUInt128And(PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
108RTDECL(PRTUINT128U) RTUInt128Or( PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
109RTDECL(PRTUINT128U) RTUInt128Xor(PRTUINT128U pResult, PCRTUINT128U pValue1, PCRTUINT128U pValue2);
110RTDECL(PRTUINT128U) RTUInt128ShiftLeft( PRTUINT128U pResult, PCRTUINT128U pValue, int cBits);
111RTDECL(PRTUINT128U) RTUInt128ShiftRight(PRTUINT128U pResult, PCRTUINT128U pValue, int cBits);
112RTDECL(PRTUINT128U) RTUInt128BooleanNot(PRTUINT128U pResult, PCRTUINT128U pValue);
113RTDECL(PRTUINT128U) RTUInt128BitwiseNot(PRTUINT128U pResult, PCRTUINT128U pValue);
114
115
116/**
117 * Assigns one 128-bit unsigned integer value to another.
118 *
119 * @returns pResult
120 * @param pResult The result variable.
121 * @param pValue The value to assign.
122 */
123DECLINLINE(PRTUINT128U) RTUInt128Assign(PRTUINT128U pResult, PCRTUINT128U pValue)
124{
125#if ARCH_BITS >= 64
126 pResult->s.Hi = pValue->s.Hi;
127 pResult->s.Lo = pValue->s.Lo;
128#else
129 pResult->DWords.dw0 = pValue->DWords.dw0;
130 pResult->DWords.dw1 = pValue->DWords.dw1;
131 pResult->DWords.dw2 = pValue->DWords.dw2;
132 pResult->DWords.dw3 = pValue->DWords.dw3;
133#endif
134 return pResult;
135}
136
137
138/**
139 * Assigns a boolean value to 128-bit unsigned integer.
140 *
141 * @returns pResult
142 * @param pResult The result variable.
143 * @param fValue The boolean value.
144 */
145DECLINLINE(PRTUINT128U) RTUInt128AssignBoolean(PRTUINT128U pValueResult, bool fValue)
146{
147#if ARCH_BITS >= 64
148 pValueResult->s.Lo = fValue;
149 pValueResult->s.Hi = 0;
150#else
151 pValueResult->DWords.dw0 = fValue;
152 pValueResult->DWords.dw1 = 0;
153 pValueResult->DWords.dw2 = 0;
154 pValueResult->DWords.dw3 = 0;
155#endif
156 return pValueResult;
157}
158
159
160/**
161 * Assigns a 8-bit unsigned integer value to 128-bit unsigned integer.
162 *
163 * @returns pResult
164 * @param pResult The result variable.
165 * @param u8Value The 8-bit unsigned integer value.
166 */
167DECLINLINE(PRTUINT128U) RTUInt128AssignU8(PRTUINT128U pValueResult, uint8_t u8Value)
168{
169#if ARCH_BITS >= 64
170 pValueResult->s.Lo = u8Value;
171 pValueResult->s.Hi = 0;
172#else
173 pValueResult->DWords.dw0 = u8Value;
174 pValueResult->DWords.dw1 = 0;
175 pValueResult->DWords.dw2 = 0;
176 pValueResult->DWords.dw3 = 0;
177#endif
178 return pValueResult;
179}
180
181
182/**
183 * Assigns a 16-bit unsigned integer value to 128-bit unsigned integer.
184 *
185 * @returns pResult
186 * @param pResult The result variable.
187 * @param u16Value The 16-bit unsigned integer value.
188 */
189DECLINLINE(PRTUINT128U) RTUInt128AssignU16(PRTUINT128U pValueResult, uint16_t u16Value)
190{
191#if ARCH_BITS >= 64
192 pValueResult->s.Lo = u16Value;
193 pValueResult->s.Hi = 0;
194#else
195 pValueResult->DWords.dw0 = u16Value;
196 pValueResult->DWords.dw1 = 0;
197 pValueResult->DWords.dw2 = 0;
198 pValueResult->DWords.dw3 = 0;
199#endif
200 return pValueResult;
201}
202
203
204/**
205 * Assigns a 16-bit unsigned integer value to 128-bit unsigned integer.
206 *
207 * @returns pResult
208 * @param pResult The result variable.
209 * @param u32Value The 32-bit unsigned integer value.
210 */
211DECLINLINE(PRTUINT128U) RTUInt128AssignU32(PRTUINT128U pValueResult, uint32_t u32Value)
212{
213#if ARCH_BITS >= 64
214 pValueResult->s.Lo = u32Value;
215 pValueResult->s.Hi = 0;
216#else
217 pValueResult->DWords.dw0 = u32Value;
218 pValueResult->DWords.dw1 = 0;
219 pValueResult->DWords.dw2 = 0;
220 pValueResult->DWords.dw3 = 0;
221#endif
222 return pValueResult;
223}
224
225
226/**
227 * Assigns a 64-bit unsigned integer value to 128-bit unsigned integer.
228 *
229 * @returns pResult
230 * @param pResult The result variable.
231 * @param u32Value The 32-bit unsigned integer value.
232 */
233DECLINLINE(PRTUINT128U) RTUInt128AssignU64(PRTUINT128U pValueResult, uint64_t u64Value)
234{
235 pValueResult->s.Lo = u64Value;
236 pValueResult->s.Hi = 0;
237 return pValueResult;
238}
239
240
241RTDECL(PRTUINT128U) RTUInt128AssignAdd(PRTUINT128U pValue1Result, PCRTUINT128U pValue2);
242RTDECL(PRTUINT128U) RTUInt128AssignSub(PRTUINT128U pValue1Result, PCRTUINT128U pValue2);
243RTDECL(PRTUINT128U) RTUInt128AssignDiv(PRTUINT128U pValue1Result, PCRTUINT128U pValue2);
244RTDECL(PRTUINT128U) RTUInt128AssignMod(PRTUINT128U pValue1Result, PCRTUINT128U pValue2);
245
246
247/**
248 * Performs a bitwise AND of two 128-bit unsigned integer values and assigned
249 * the result to the first one.
250 *
251 * @returns pValue1Result.
252 * @param pValue1Result The first value and result.
253 * @param pValue2 The second value.
254 */
255DECLINLINE(PRTUINT128U) RTUInt128AssignAnd(PRTUINT128U pValue1Result, PCRTUINT128U pValue2)
256{
257#if ARCH_BITS >= 64
258 pValue1Result->s.Hi &= pValue2->s.Hi;
259 pValue1Result->s.Lo &= pValue2->s.Lo;
260#else
261 pValue1Result->DWords.dw0 &= pValue2->DWords.dw0;
262 pValue1Result->DWords.dw1 &= pValue2->DWords.dw1;
263 pValue1Result->DWords.dw2 &= pValue2->DWords.dw2;
264 pValue1Result->DWords.dw3 &= pValue2->DWords.dw3;
265#endif
266 return pValue1Result;
267}
268
269
270/**
271 * Performs a bitwise AND of a 128-bit unsigned integer value and a mask made
272 * up of the first N bits, assigning the result to the the 128-bit value.
273 *
274 * @returns pValueResult.
275 * @param pValueResult The value and result.
276 * @param cBits The number of bits to AND (counting from the first
277 * bit).
278 */
279DECLINLINE(PRTUINT128U) RTUInt128AssignAndNFirstBits(PRTUINT128U pValueResult, unsigned cBits)
280{
281 if (cBits <= 64)
282 {
283 if (cBits != 64)
284 pValueResult->s.Lo &= (RT_BIT_64(cBits) - 1);
285 pValueResult->s.Hi = 0;
286 }
287 else if (cBits < 128)
288 pValueResult->s.Hi &= (RT_BIT_64(cBits - 64) - 1);
289/** @todo #if ARCH_BITS >= 64 */
290 return pValueResult;
291}
292
293
294/**
295 * Performs a bitwise OR of two 128-bit unsigned integer values and assigned
296 * the result to the first one.
297 *
298 * @returns pValue1Result.
299 * @param pValue1Result The first value and result.
300 * @param pValue2 The second value.
301 */
302DECLINLINE(PRTUINT128U) RTUInt128AssignOr(PRTUINT128U pValue1Result, PCRTUINT128U pValue2)
303{
304#if ARCH_BITS >= 64
305 pValue1Result->s.Hi |= pValue2->s.Hi;
306 pValue1Result->s.Lo |= pValue2->s.Lo;
307#else
308 pValue1Result->DWords.dw0 |= pValue2->DWords.dw0;
309 pValue1Result->DWords.dw1 |= pValue2->DWords.dw1;
310 pValue1Result->DWords.dw2 |= pValue2->DWords.dw2;
311 pValue1Result->DWords.dw3 |= pValue2->DWords.dw3;
312#endif
313 return pValue1Result;
314}
315
316
317/**
318 * Performs a bitwise XOR of two 128-bit unsigned integer values and assigned
319 * the result to the first one.
320 *
321 * @returns pValue1Result.
322 * @param pValue1Result The first value and result.
323 * @param pValue2 The second value.
324 */
325DECLINLINE(PRTUINT128U) RTUInt128AssignXor(PRTUINT128U pValue1Result, PCRTUINT128U pValue2)
326{
327#if ARCH_BITS >= 64
328 pValue1Result->s.Hi ^= pValue2->s.Hi;
329 pValue1Result->s.Lo ^= pValue2->s.Lo;
330#else
331 pValue1Result->DWords.dw0 ^= pValue2->DWords.dw0;
332 pValue1Result->DWords.dw1 ^= pValue2->DWords.dw1;
333 pValue1Result->DWords.dw2 ^= pValue2->DWords.dw2;
334 pValue1Result->DWords.dw3 ^= pValue2->DWords.dw3;
335#endif
336 return pValue1Result;
337}
338
339
340/**
341 * Performs a bitwise left shift on a 128-bit unsigned integer value, assigning
342 * the result to it.
343 *
344 * @returns pValue1Result.
345 * @param pValue1Result The first value and result.
346 * @param cBits The number of bits to shift.
347 */
348DECLINLINE(PRTUINT128U) RTUInt128AssignShiftLeft(PRTUINT128U pValueResult, int cBits)
349{
350 RTUINT128U const InVal = *pValueResult;
351/** @todo #if ARCH_BITS >= 64 */
352 if (cBits > 0)
353 {
354 /* (left shift) */
355 if (cBits >= 128)
356 RTUInt128SetZero(pValueResult);
357 else if (cBits >= 64)
358 {
359 pValueResult->s.Lo = 0;
360 pValueResult->s.Hi = InVal.s.Lo << (cBits - 64);
361 }
362 else
363 {
364 pValueResult->s.Hi = InVal.s.Hi << cBits;
365 pValueResult->s.Hi |= InVal.s.Lo >> (64 - cBits);
366 pValueResult->s.Lo = InVal.s.Lo << cBits;
367 }
368 }
369 else if (cBits < 0)
370 {
371 /* (right shift) */
372 cBits = -cBits;
373 if (cBits >= 128)
374 RTUInt128SetZero(pValueResult);
375 else if (cBits >= 64)
376 {
377 pValueResult->s.Hi = 0;
378 pValueResult->s.Lo = InVal.s.Hi >> (cBits - 64);
379 }
380 else
381 {
382 pValueResult->s.Lo = InVal.s.Lo >> cBits;
383 pValueResult->s.Lo |= InVal.s.Hi << (64 - cBits);
384 pValueResult->s.Hi = InVal.s.Hi >> cBits;
385 }
386 }
387 return pValueResult;
388}
389
390
391/**
392 * Performs a bitwise left shift on a 128-bit unsigned integer value, assigning
393 * the result to it.
394 *
395 * @returns pValue1Result.
396 * @param pValue1Result The first value and result.
397 * @param cBits The number of bits to shift.
398 */
399DECLINLINE(PRTUINT128U) RTUInt128AssignShiftRight(PRTUINT128U pValueResult, int cBits)
400{
401 return RTUInt128AssignShiftLeft(pValueResult, -cBits);
402}
403
404
405/**
406 * Performs a bitwise NOT on a 128-bit unsigned integer value, assigning the
407 * result to it.
408 *
409 * @returns pValueResult
410 * @param pValueResult The value and result.
411 */
412DECLINLINE(PRTUINT128U) RTUInt128AssignBitwiseNot(PRTUINT128U pValueResult)
413{
414#if ARCH_BITS >= 64
415 pValueResult->s.Hi = ~pValueResult->s.Hi;
416 pValueResult->s.Lo = ~pValueResult->s.Lo;
417#else
418 pValueResult->DWords.dw0 = ~pValueResult->DWords.dw0;
419 pValueResult->DWords.dw1 = ~pValueResult->DWords.dw1;
420 pValueResult->DWords.dw2 = ~pValueResult->DWords.dw2;
421 pValueResult->DWords.dw3 = ~pValueResult->DWords.dw3;
422#endif
423 return pValueResult;
424}
425
426
427/**
428 * Performs a boolean NOT on a 128-bit unsigned integer value, assigning the
429 * result to it.
430 *
431 * @returns pValueResult
432 * @param pValueResult The value and result.
433 */
434DECLINLINE(PRTUINT128U) RTUInt128AssignBooleanNot(PRTUINT128U pValueResult)
435{
436 return RTUInt128AssignBoolean(pValueResult, RTUInt128IsZero(pValueResult));
437}
438
439
440/**
441 * Compares two 128-bit unsigned integer values.
442 *
443 * @retval 0 if equal.
444 * @retval -1 if the first value is smaller than the second.
445 * @retval 1 if the first value is larger than the second.
446 *
447 * @param pValue1 The first value.
448 * @param pValue2 The second value.
449 */
450DECLINLINE(int) RTUInt128Compare(PCRTUINT128U pValue1, PCRTUINT128U pValue2)
451{
452#if ARCH_BITS >= 64
453 if (pValue1->s.Hi != pValue2->s.Hi)
454 return pValue1->s.Hi > pValue2->s.Hi ? 1 : -1;
455 if (pValue1->s.Lo != pValue2->s.Lo)
456 return pValue1->s.Lo > pValue2->s.Lo ? 1 : -1;
457 return 0;
458#else
459 if (pValue1->DWords.dw0 != pValue2->DWords.dw0)
460 return pValue1->DWords.dw0 > pValue2->DWords.dw0 ? 1 : -1;
461 if (pValue1->DWords.dw1 != pValue2->DWords.dw1)
462 return pValue1->DWords.dw1 > pValue2->DWords.dw1 ? 1 : -1;
463 if (pValue1->DWords.dw2 != pValue2->DWords.dw2)
464 return pValue1->DWords.dw2 > pValue2->DWords.dw2 ? 1 : -1;
465 if (pValue1->DWords.dw3 != pValue2->DWords.dw3)
466 return pValue1->DWords.dw3 > pValue2->DWords.dw3 ? 1 : -1;
467 return 0;
468#endif
469}
470
471
472/**
473 * Tests if two 128-bit unsigned integer values not equal.
474 *
475 * @returns true if equal, false if not equal.
476 * @param pValue1 The first value.
477 * @param pValue2 The second value.
478 */
479DECLINLINE(bool) RTUInt128IsEqual(PCRTUINT128U pValue1, PCRTUINT128U pValue2)
480{
481#if ARCH_BITS >= 64
482 return pValue1->s.Hi == pValue2->s.Hi
483 && pValue1->s.Lo == pValue2->s.Lo;
484#else
485 return pValue1->DWords.dw0 == pValue2->DWords.dw0
486 && pValue1->DWords.dw1 == pValue2->DWords.dw1
487 && pValue1->DWords.dw2 == pValue2->DWords.dw2
488 && pValue1->DWords.dw3 == pValue2->DWords.dw3;
489#endif
490}
491
492
493/**
494 * Tests if two 128-bit unsigned integer values are not equal.
495 *
496 * @returns true if not equal, false if equal.
497 * @param pValue1 The first value.
498 * @param pValue2 The second value.
499 */
500DECLINLINE(bool) RTUInt128IsNotEqual(PCRTUINT128U pValue1, PCRTUINT128U pValue2)
501{
502 return !RTUInt128IsEqual(pValue1, pValue2);
503}
504
505
506/**
507 * Sets a bit in a 128-bit unsigned integer type.
508 *
509 * @returns pValueResult.
510 * @param pValueResult The input and output value.
511 * @param iBit The bit to set.
512 */
513DECLINLINE(PRTUINT128U) RTUInt128BitSet(PRTUINT128U pValueResult, unsigned iBit)
514{
515 if (iBit < 64)
516 {
517#if ARCH_BITS >= 64
518 pValueResult->s.Lo |= RT_BIT_64(iBit);
519#else
520 if (iBit < 32)
521 pValueResult->DWords.dw0 |= RT_BIT_32(iBit);
522 else
523 pValueResult->DWords.dw1 |= RT_BIT_32(iBit - 32);
524#endif
525 }
526 else if (iBit < 128)
527 {
528#if ARCH_BITS >= 64
529 pValueResult->s.Hi |= RT_BIT_64(iBit - 64);
530#else
531 if (iBit < 96)
532 pValueResult->DWords.dw2 |= RT_BIT_32(iBit - 64);
533 else
534 pValueResult->DWords.dw3 |= RT_BIT_32(iBit - 96);
535#endif
536 }
537 return pValueResult;
538}
539
540
541/**
542 * Sets a bit in a 128-bit unsigned integer type.
543 *
544 * @returns pValueResult.
545 * @param pValueResult The input and output value.
546 * @param iBit The bit to set.
547 */
548DECLINLINE(PRTUINT128U) RTUInt128BitClear(PRTUINT128U pValueResult, unsigned iBit)
549{
550 if (iBit < 64)
551 {
552#if ARCH_BITS >= 64
553 pValueResult->s.Lo &= ~RT_BIT_64(iBit);
554#else
555 if (iBit < 32)
556 pValueResult->DWords.dw0 &= ~RT_BIT_32(iBit);
557 else
558 pValueResult->DWords.dw1 &= ~RT_BIT_32(iBit - 32);
559#endif
560 }
561 else if (iBit < 128)
562 {
563#if ARCH_BITS >= 64
564 pValueResult->s.Hi &= ~RT_BIT_64(iBit - 64);
565#else
566 if (iBit < 96)
567 pValueResult->DWords.dw2 &= ~RT_BIT_32(iBit - 64);
568 else
569 pValueResult->DWords.dw3 &= ~RT_BIT_32(iBit - 96);
570#endif
571 }
572 return pValueResult;
573}
574
575
576/**
577 * Tests if a bit in a 128-bit unsigned integer value is set.
578 *
579 * @returns pValueResult.
580 * @param pValueResult The input and output value.
581 * @param iBit The bit to test.
582 */
583DECLINLINE(bool) RTUInt128BitTest(PRTUINT128U pValueResult, unsigned iBit)
584{
585 bool fRc;
586 if (iBit < 64)
587 {
588#if ARCH_BITS >= 64
589 fRc = RT_BOOL(pValueResult->s.Lo & RT_BIT_64(iBit));
590#else
591 if (iBit < 32)
592 fRc = RT_BOOL(pValueResult->DWords.dw0 & RT_BIT_32(iBit));
593 else
594 fRc = RT_BOOL(pValueResult->DWords.dw1 & RT_BIT_32(iBit - 32));
595#endif
596 }
597 else if (iBit < 128)
598 {
599#if ARCH_BITS >= 64
600 fRc = RT_BOOL(pValueResult->s.Hi & RT_BIT_64(iBit - 64));
601#else
602 if (iBit < 96)
603 fRc = RT_BOOL(pValueResult->DWords.dw2 & RT_BIT_32(iBit - 64));
604 else
605 fRc = RT_BOOL(pValueResult->DWords.dw3 & RT_BIT_32(iBit - 96));
606#endif
607 }
608 else
609 fRc = false;
610 return fRc;
611}
612
613
614/**
615 * Set a range of bits a 128-bit unsigned integer value.
616 *
617 * @returns pValueResult.
618 * @param pValueResult The input and output value.
619 * @param iFirstBit The first bit to test.
620 * @param cBits The number of bits to set.
621 */
622DECLINLINE(PRTUINT128U) RTUInt128BitSetRange(PRTUINT128U pValueResult, unsigned iFirstBit, unsigned cBits)
623{
624 /* bounds check & fix. */
625 if (iFirstBit < 128)
626 {
627 if (iFirstBit + cBits > 128)
628 cBits = 128 - iFirstBit;
629
630#if ARCH_BITS >= 64
631 if (iFirstBit + cBits < 64)
632 pValueResult->s.Lo |= (RT_BIT_64(cBits) - 1) << iFirstBit;
633 else if (iFirstBit + cBits < 128 && iFirstBit >= 64)
634 pValueResult->s.Hi |= (RT_BIT_64(cBits) - 1) << (iFirstBit - 64);
635 else
636#else
637 if (iFirstBit + cBits < 32)
638 pValueResult->DWords.dw0 |= (RT_BIT_32(cBits) - 1) << iFirstBit;
639 else if (iFirstBit + cBits < 64 && iFirstBit >= 32)
640 pValueResult->DWords.dw1 |= (RT_BIT_32(cBits) - 1) << (iFirstBit - 32);
641 else if (iFirstBit + cBits < 96 && iFirstBit >= 64)
642 pValueResult->DWords.dw2 |= (RT_BIT_32(cBits) - 1) << (iFirstBit - 64);
643 else if (iFirstBit + cBits < 128 && iFirstBit >= 96)
644 pValueResult->DWords.dw3 |= (RT_BIT_32(cBits) - 1) << (iFirstBit - 96);
645 else
646#endif
647 while (cBits-- > 0)
648 RTUInt128BitSet(pValueResult, iFirstBit++);
649 }
650 return pValueResult;
651}
652
653
654/**
655 * Test if all the bits of a 128-bit unsigned integer value are set.
656 *
657 * @returns true if they are, false if they aren't.
658 * @param pValue The input and output value.
659 */
660DECLINLINE(bool) RTUInt128BitAreAllSet(PRTUINT128U pValue)
661{
662#if ARCH_BITS >= 64
663 return pValue->s.Hi == UINT64_MAX
664 && pValue->s.Lo == UINT64_MAX;
665#else
666 return pValue->DWords.dw0 == UINT32_MAX
667 && pValue->DWords.dw1 == UINT32_MAX
668 && pValue->DWords.dw2 == UINT32_MAX
669 && pValue->DWords.dw3 == UINT32_MAX;
670#endif
671}
672
673
674/**
675 * Test if all the bits of a 128-bit unsigned integer value are clear.
676 *
677 * @returns true if they are, false if they aren't.
678 * @param pValue The input and output value.
679 */
680DECLINLINE(bool) RTUInt128BitAreAllClear(PRTUINT128U pValue)
681{
682#if ARCH_BITS >= 64
683 return pValue->s.Hi == 0
684 && pValue->s.Lo == 0;
685#else
686 return pValue->DWords.dw0 == 0
687 && pValue->DWords.dw1 == 0
688 && pValue->DWords.dw2 == 0
689 && pValue->DWords.dw3 == 0;
690#endif
691}
692
693/** @} */
694
695RT_C_DECLS_END
696
697#endif
698
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette