equal
deleted
inserted
replaced
544 } |
544 } |
545 return sqlite3PutVarint(p, v); |
545 return sqlite3PutVarint(p, v); |
546 } |
546 } |
547 |
547 |
548 /* |
548 /* |
|
549 ** Bitmasks used by sqlite3GetVarint(). These precomputed constants |
|
550 ** are defined here rather than simply putting the constant expressions |
|
551 ** inline in order to work around bugs in the RVT compiler. |
|
552 ** |
|
553 ** SLOT_2_0 A mask for (0x7f<<14) | 0x7f |
|
554 ** |
|
555 ** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 |
|
556 */ |
|
557 #define SLOT_2_0 0x001fc07f |
|
558 #define SLOT_4_2_0 0xf01fc07f |
|
559 |
|
560 |
|
561 /* |
549 ** Read a 64-bit variable-length integer from memory starting at p[0]. |
562 ** Read a 64-bit variable-length integer from memory starting at p[0]. |
550 ** Return the number of bytes read. The value is stored in *v. |
563 ** Return the number of bytes read. The value is stored in *v. |
551 */ |
564 */ |
552 int sqlite3GetVarint(const unsigned char *p, u64 *v){ |
565 int sqlite3GetVarint(const unsigned char *p, u64 *v){ |
553 u32 a,b,s; |
566 u32 a,b,s; |
570 a |= b; |
583 a |= b; |
571 *v = a; |
584 *v = a; |
572 return 2; |
585 return 2; |
573 } |
586 } |
574 |
587 |
|
588 /* Verify that constants are precomputed correctly */ |
|
589 assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); |
|
590 assert( SLOT_4_2_0 == ((0xf<<28) | (0x7f<<14) | (0x7f)) ); |
|
591 |
575 p++; |
592 p++; |
576 a = a<<14; |
593 a = a<<14; |
577 a |= *p; |
594 a |= *p; |
578 /* a: p0<<14 | p2 (unmasked) */ |
595 /* a: p0<<14 | p2 (unmasked) */ |
579 if (!(a&0x80)) |
596 if (!(a&0x80)) |
580 { |
597 { |
581 a &= (0x7f<<14)|(0x7f); |
598 a &= SLOT_2_0; |
582 b &= 0x7f; |
599 b &= 0x7f; |
583 b = b<<7; |
600 b = b<<7; |
584 a |= b; |
601 a |= b; |
585 *v = a; |
602 *v = a; |
586 return 3; |
603 return 3; |
587 } |
604 } |
588 |
605 |
589 /* CSE1 from below */ |
606 /* CSE1 from below */ |
590 a &= (0x7f<<14)|(0x7f); |
607 a &= SLOT_2_0; |
591 p++; |
608 p++; |
592 b = b<<14; |
609 b = b<<14; |
593 b |= *p; |
610 b |= *p; |
594 /* b: p1<<14 | p3 (unmasked) */ |
611 /* b: p1<<14 | p3 (unmasked) */ |
595 if (!(b&0x80)) |
612 if (!(b&0x80)) |
596 { |
613 { |
597 b &= (0x7f<<14)|(0x7f); |
614 b &= SLOT_2_0; |
598 /* moved CSE1 up */ |
615 /* moved CSE1 up */ |
599 /* a &= (0x7f<<14)|(0x7f); */ |
616 /* a &= (0x7f<<14)|(0x7f); */ |
600 a = a<<7; |
617 a = a<<7; |
601 a |= b; |
618 a |= b; |
602 *v = a; |
619 *v = a; |
606 /* a: p0<<14 | p2 (masked) */ |
623 /* a: p0<<14 | p2 (masked) */ |
607 /* b: p1<<14 | p3 (unmasked) */ |
624 /* b: p1<<14 | p3 (unmasked) */ |
608 /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ |
625 /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ |
609 /* moved CSE1 up */ |
626 /* moved CSE1 up */ |
610 /* a &= (0x7f<<14)|(0x7f); */ |
627 /* a &= (0x7f<<14)|(0x7f); */ |
611 b &= (0x7f<<14)|(0x7f); |
628 b &= SLOT_2_0; |
612 s = a; |
629 s = a; |
613 /* s: p0<<14 | p2 (masked) */ |
630 /* s: p0<<14 | p2 (masked) */ |
614 |
631 |
615 p++; |
632 p++; |
616 a = a<<14; |
633 a = a<<14; |
639 /* b: p1<<28 | p3<<14 | p5 (unmasked) */ |
656 /* b: p1<<28 | p3<<14 | p5 (unmasked) */ |
640 if (!(b&0x80)) |
657 if (!(b&0x80)) |
641 { |
658 { |
642 /* we can skip this cause it was (effectively) done above in calc'ing s */ |
659 /* we can skip this cause it was (effectively) done above in calc'ing s */ |
643 /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ |
660 /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ |
644 a &= (0x7f<<14)|(0x7f); |
661 a &= SLOT_2_0; |
645 a = a<<7; |
662 a = a<<7; |
646 a |= b; |
663 a |= b; |
647 s = s>>18; |
664 s = s>>18; |
648 *v = ((u64)s)<<32 | a; |
665 *v = ((u64)s)<<32 | a; |
649 return 6; |
666 return 6; |
653 a = a<<14; |
670 a = a<<14; |
654 a |= *p; |
671 a |= *p; |
655 /* a: p2<<28 | p4<<14 | p6 (unmasked) */ |
672 /* a: p2<<28 | p4<<14 | p6 (unmasked) */ |
656 if (!(a&0x80)) |
673 if (!(a&0x80)) |
657 { |
674 { |
658 a &= (0x7f<<28)|(0x7f<<14)|(0x7f); |
675 a &= SLOT_4_2_0; |
659 b &= (0x7f<<14)|(0x7f); |
676 b &= SLOT_2_0; |
660 b = b<<7; |
677 b = b<<7; |
661 a |= b; |
678 a |= b; |
662 s = s>>11; |
679 s = s>>11; |
663 *v = ((u64)s)<<32 | a; |
680 *v = ((u64)s)<<32 | a; |
664 return 7; |
681 return 7; |
665 } |
682 } |
666 |
683 |
667 /* CSE2 from below */ |
684 /* CSE2 from below */ |
668 a &= (0x7f<<14)|(0x7f); |
685 a &= SLOT_2_0; |
669 p++; |
686 p++; |
670 b = b<<14; |
687 b = b<<14; |
671 b |= *p; |
688 b |= *p; |
672 /* b: p3<<28 | p5<<14 | p7 (unmasked) */ |
689 /* b: p3<<28 | p5<<14 | p7 (unmasked) */ |
673 if (!(b&0x80)) |
690 if (!(b&0x80)) |
674 { |
691 { |
675 b &= (0x7f<<28)|(0x7f<<14)|(0x7f); |
692 b &= SLOT_4_2_0; |
676 /* moved CSE2 up */ |
693 /* moved CSE2 up */ |
677 /* a &= (0x7f<<14)|(0x7f); */ |
694 /* a &= (0x7f<<14)|(0x7f); */ |
678 a = a<<7; |
695 a = a<<7; |
679 a |= b; |
696 a |= b; |
680 s = s>>4; |
697 s = s>>4; |
687 a |= *p; |
704 a |= *p; |
688 /* a: p4<<29 | p6<<15 | p8 (unmasked) */ |
705 /* a: p4<<29 | p6<<15 | p8 (unmasked) */ |
689 |
706 |
690 /* moved CSE2 up */ |
707 /* moved CSE2 up */ |
691 /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ |
708 /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ |
692 b &= (0x7f<<14)|(0x7f); |
709 b &= SLOT_2_0; |
693 b = b<<8; |
710 b = b<<8; |
694 a |= b; |
711 a |= b; |
695 |
712 |
696 s = s<<4; |
713 s = s<<4; |
697 b = p[-4]; |
714 b = p[-4]; |
765 a = a<<14; |
782 a = a<<14; |
766 a |= *p; |
783 a |= *p; |
767 /* a: p0<<28 | p2<<14 | p4 (unmasked) */ |
784 /* a: p0<<28 | p2<<14 | p4 (unmasked) */ |
768 if (!(a&0x80)) |
785 if (!(a&0x80)) |
769 { |
786 { |
770 a &= (0x7f<<28)|(0x7f<<14)|(0x7f); |
787 a &= SLOT_4_2_0; |
771 b &= (0x7f<<28)|(0x7f<<14)|(0x7f); |
788 b &= SLOT_4_2_0; |
772 b = b<<7; |
789 b = b<<7; |
773 *v = a | b; |
790 *v = a | b; |
774 return 5; |
791 return 5; |
775 } |
792 } |
776 |
793 |