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