439 { |
439 { |
440 // On entry r0=return store ptr, r1=this, r2=aLength |
440 // On entry r0=return store ptr, r1=this, r2=aLength |
441 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
441 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
442 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
442 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
443 asm("cmp r2, #0 "); // check aLength>=0 |
443 asm("cmp r2, #0 "); // check aLength>=0 |
444 asm("blt Des8PanicPosOutOfRange__Fv "); // if not panic |
444 asm("blt " CSM_Z27Des8PanicDesIndexOutOfRangev); // if not panic |
445 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
445 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
446 asm("cmp r2, r12 "); // limit aLength to Length() |
446 asm("cmp r2, r12 "); // limit aLength to Length() |
447 asm("movgt r2, r12 "); |
447 asm("movgt r2, r12 "); |
448 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
448 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
449 asm("bcs Des8PanicBadDesType__Fv "); // if not, panic |
449 asm("bcs " CSM_Z19Des8PanicBadDesTypev); // if not, panic |
450 asm("eor r3, r3, r3, lsr #1 "); |
450 asm("eor r3, r3, r3, lsr #1 "); |
451 asm("msr cpsr_flg, r3 "); |
451 asm("msr cpsr_flg, r3 "); |
452 asm("addcs r1, r1, #4 "); |
452 asm("addcs r1, r1, #4 "); |
453 asm("ldrle r1, [r1] "); |
453 asm("ldrle r1, [r1] "); |
454 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
454 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
465 { |
465 { |
466 // On entry r0=return store ptr, r1=this, r2=aLength |
466 // On entry r0=return store ptr, r1=this, r2=aLength |
467 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
467 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
468 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
468 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
469 asm("cmp r2, #0 "); // check aLength>=0 |
469 asm("cmp r2, #0 "); // check aLength>=0 |
470 asm("blt Des8PanicPosOutOfRange__Fv "); // if not, panic |
470 asm("blt " CSM_Z27Des8PanicDesIndexOutOfRangev); // if not, panic |
471 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
471 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
472 asm("cmp r2, r12 "); // limit aLength to Length() |
472 asm("cmp r2, r12 "); // limit aLength to Length() |
473 asm("movgt r2, r12 "); |
473 asm("movgt r2, r12 "); |
474 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
474 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
475 asm("bcs Des8PanicBadDesType__Fv "); |
475 asm("bcs " CSM_Z19Des8PanicBadDesTypev); |
476 asm("eor r3, r3, r3, lsr #1 "); |
476 asm("eor r3, r3, r3, lsr #1 "); |
477 asm("msr cpsr_flg, r3 "); |
477 asm("msr cpsr_flg, r3 "); |
478 asm("addcs r1, r1, #4 "); |
478 asm("addcs r1, r1, #4 "); |
479 asm("ldrle r1, [r1] "); |
479 asm("ldrle r1, [r1] "); |
480 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
480 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
494 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
494 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
495 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
495 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
496 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
496 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
497 asm("cmp r2, #0 "); // check aPos>=0 |
497 asm("cmp r2, #0 "); // check aPos>=0 |
498 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
498 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
499 asm("blt Des8PanicPosOutOfRange__Fv "); |
499 asm("blt " CSM_Z27Des8PanicDesIndexOutOfRangev); |
500 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
500 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
501 asm("bcs Des8PanicBadDesType__Fv "); |
501 asm("bcs " CSM_Z19Des8PanicBadDesTypev); |
502 asm("eor r3, r3, r3, lsr #1 "); |
502 asm("eor r3, r3, r3, lsr #1 "); |
503 asm("msr cpsr_flg, r3 "); |
503 asm("msr cpsr_flg, r3 "); |
504 asm("addcs r1, r1, #4 "); |
504 asm("addcs r1, r1, #4 "); |
505 asm("ldrle r1, [r1] "); |
505 asm("ldrle r1, [r1] "); |
506 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
506 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
520 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
520 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
521 asm("str r4, [sp, #-4]! "); // save r4 |
521 asm("str r4, [sp, #-4]! "); // save r4 |
522 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
522 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
523 asm("mov r4, r1 "); |
523 asm("mov r4, r1 "); |
524 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
524 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
525 asm("bcs Des8PanicBadDesType__Fv "); |
525 asm("bcs " CSM_Z19Des8PanicBadDesTypev); |
526 asm("eor r12, r12, r12, lsr #1 "); |
526 asm("eor r12, r12, r12, lsr #1 "); |
527 asm("msr cpsr_flg, r12 "); |
527 asm("msr cpsr_flg, r12 "); |
528 asm("ldr r12, [r1, #-4] "); |
528 asm("ldr r12, [r1, #-4] "); |
529 asm("addcs r4, r4, #4 "); |
529 asm("addcs r4, r4, #4 "); |
530 asm("ldrle r4, [r4] "); |
530 asm("ldrle r4, [r4] "); |
537 asm("addge r3, r4, r2 "); // and r3=this.Ptr()+aPos |
537 asm("addge r3, r4, r2 "); // and r3=this.Ptr()+aPos |
538 asm("bicge r2, r1, #0xF0000000 "); // and r2=aLength |
538 asm("bicge r2, r1, #0xF0000000 "); // and r2=aLength |
539 asm("stmgeia r0, {r1-r3} "); |
539 asm("stmgeia r0, {r1-r3} "); |
540 asm("ldrge r4, [sp], #4 "); |
540 asm("ldrge r4, [sp], #4 "); |
541 __JUMP(ge,lr); |
541 __JUMP(ge,lr); |
542 asm("b Des8PanicPosOutOfRange__Fv "); |
542 asm("b " CSM_Z27Des8PanicDesIndexOutOfRangev); |
543 } |
543 } |
544 #endif |
544 #endif |
545 |
545 |
546 __NAKED__ EXPORT_C const TUint8 &TDesC8::AtC(TInt /*anIndex*/) const |
546 __NAKED__ EXPORT_C const TUint8 &TDesC8::AtC(TInt /*anIndex*/) const |
547 // |
547 // |
628 // |
628 // |
629 { |
629 { |
630 asm("ldr r12, 1f "); |
630 asm("ldr r12, 1f "); |
631 asm("b comparebody "); |
631 asm("b comparebody "); |
632 asm("1: "); |
632 asm("1: "); |
633 asm(".word " CSM_ZN3Mem8CompareFEPKhiS0_i); |
633 asm(".word " CSM_ZN3Mem8CompareFEPKhiS1_i); |
634 } |
634 } |
635 |
635 |
636 __NAKED__ EXPORT_C TInt TDesC8::CompareC(const TDesC8& /*aDes*/) const |
636 __NAKED__ EXPORT_C TInt TDesC8::CompareC(const TDesC8& /*aDes*/) const |
637 // |
637 // |
638 // Compare a descriptor to this descriptor collated. |
638 // Compare a descriptor to this descriptor collated. |
639 // |
639 // |
640 { |
640 { |
641 asm("ldr r12, 1f "); |
641 asm("ldr r12, 1f "); |
642 asm("b comparebody "); |
642 asm("b comparebody "); |
643 asm("1: "); |
643 asm("1: "); |
644 asm(".word " CSM_ZN3Mem8CompareCEPKhiS0_i); |
644 asm(".word " CSM_ZN3Mem8CompareCEPKhiS1_i); |
645 } |
645 } |
646 #endif |
646 #endif |
647 |
647 |
648 __NAKED__ EXPORT_C TInt TDesC8::Compare(const TDesC8& /*aDes*/) const |
648 __NAKED__ EXPORT_C TInt TDesC8::Compare(const TDesC8& /*aDes*/) const |
649 // |
649 // |
796 { |
796 { |
797 // On entry r0=return store ptr, r1=this, r2=aLength |
797 // On entry r0=return store ptr, r1=this, r2=aLength |
798 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
798 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
799 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
799 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
800 asm("cmp r2, #0 "); // check aLength>=0 |
800 asm("cmp r2, #0 "); // check aLength>=0 |
801 asm("blt Des8PanicPosOutOfRange__Fv "); // if not panic |
801 asm("blt " CSM_Z27Des8PanicDesIndexOutOfRangev); // if not panic |
802 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
802 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
803 asm("cmp r2, r12 "); // limit aLength to Length() |
803 asm("cmp r2, r12 "); // limit aLength to Length() |
804 asm("movgt r2, r12 "); |
804 asm("movgt r2, r12 "); |
805 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
805 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
806 asm("bcs Des8PanicBadDesType__Fv "); // if not, panic |
806 asm("bcs " CSM_Z19Des8PanicBadDesTypev); // if not, panic |
807 asm("eor r3, r3, r3, lsr #1 "); |
807 asm("eor r3, r3, r3, lsr #1 "); |
808 asm("msr cpsr_flg, r3 "); |
808 asm("msr cpsr_flg, r3 "); |
809 asm("addcs r1, r1, #4 "); |
809 asm("addcs r1, r1, #4 "); |
810 asm("ldrle r1, [r1] "); |
810 asm("ldrle r1, [r1] "); |
811 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
811 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
822 { |
822 { |
823 // On entry r0=return store ptr, r1=this, r2=aLength |
823 // On entry r0=return store ptr, r1=this, r2=aLength |
824 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
824 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
825 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
825 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
826 asm("cmp r2, #0 "); // check aLength>=0 |
826 asm("cmp r2, #0 "); // check aLength>=0 |
827 asm("blt Des8PanicPosOutOfRange__Fv "); // if not, panic |
827 asm("blt " CSM_Z27Des8PanicDesIndexOutOfRangev); // if not, panic |
828 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
828 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
829 asm("cmp r2, r12 "); // limit aLength to Length() |
829 asm("cmp r2, r12 "); // limit aLength to Length() |
830 asm("movgt r2, r12 "); |
830 asm("movgt r2, r12 "); |
831 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
831 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
832 asm("bcs Des8PanicBadDesType__Fv "); |
832 asm("bcs " CSM_Z19Des8PanicBadDesTypev); |
833 asm("eor r3, r3, r3, lsr #1 "); |
833 asm("eor r3, r3, r3, lsr #1 "); |
834 asm("msr cpsr_flg, r3 "); |
834 asm("msr cpsr_flg, r3 "); |
835 asm("addcs r1, r1, #4 "); |
835 asm("addcs r1, r1, #4 "); |
836 asm("ldrle r1, [r1] "); |
836 asm("ldrle r1, [r1] "); |
837 asm("addeq r1, r1, #4 "); // r3=this.Ptr() |
837 asm("addeq r1, r1, #4 "); // r3=this.Ptr() |
851 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
851 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
852 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
852 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
853 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
853 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
854 asm("cmp r2, #0 "); // check aPos>=0 |
854 asm("cmp r2, #0 "); // check aPos>=0 |
855 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
855 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
856 asm("blt Des8PanicPosOutOfRange__Fv "); |
856 asm("blt " CSM_Z27Des8PanicDesIndexOutOfRangev); |
857 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
857 asm("cmp r3, #0x50000000 "); // check type() <= 4 |
858 asm("bcs Des8PanicBadDesType__Fv "); |
858 asm("bcs " CSM_Z19Des8PanicBadDesTypev); |
859 asm("eor r3, r3, r3, lsr #1 "); |
859 asm("eor r3, r3, r3, lsr #1 "); |
860 asm("msr cpsr_flg, r3 "); |
860 asm("msr cpsr_flg, r3 "); |
861 asm("addcs r1, r1, #4 "); |
861 asm("addcs r1, r1, #4 "); |
862 asm("ldrle r1, [r1] "); |
862 asm("ldrle r1, [r1] "); |
863 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
863 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
875 { |
875 { |
876 // On entry r0=return store ptr, r1=this, r2=aPos, r3=aLength |
876 // On entry r0=return store ptr, r1=this, r2=aPos, r3=aLength |
877 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
877 // Return TPtrC8 ([r0]=length/type,[r0,#4]=Ptr) |
878 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
878 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
879 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
879 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
880 asm("bcs Des8PanicBadDesType__Fv "); |
880 asm("bcs " CSM_Z19Des8PanicBadDesTypev); |
881 asm("eor r12, r12, r12, lsr #1 "); |
881 asm("eor r12, r12, r12, lsr #1 "); |
882 asm("msr cpsr_flg, r12 "); |
882 asm("msr cpsr_flg, r12 "); |
883 asm("ldr r12, [r1, #-4] "); |
883 asm("ldr r12, [r1, #-4] "); |
884 asm("addcs r1, r1, #4 "); |
884 asm("addcs r1, r1, #4 "); |
885 asm("ldrle r1, [r1] "); |
885 asm("ldrle r1, [r1] "); |
890 asm("cmpge r12, r3 "); // and check Length()-aPos>=aLength |
890 asm("cmpge r12, r3 "); // and check Length()-aPos>=aLength |
891 asm("addge r2, r1, r2 "); // if so r2=this.Ptr()+aPos |
891 asm("addge r2, r1, r2 "); // if so r2=this.Ptr()+aPos |
892 asm("orrge r1, r3, #0x10000000 "); // and r1=aLength + EPtrC |
892 asm("orrge r1, r3, #0x10000000 "); // and r1=aLength + EPtrC |
893 asm("stmgeia r0, {r1,r2} "); |
893 asm("stmgeia r0, {r1,r2} "); |
894 __JUMP(ge,lr); |
894 __JUMP(ge,lr); |
895 asm("b Des8PanicPosOutOfRange__Fv "); |
895 asm("b " CSM_Z27Des8PanicDesIndexOutOfRangev); |
896 } |
896 } |
897 #endif |
897 #endif |
898 |
898 |
899 __NAKED__ EXPORT_C void TDes8::Zero() |
899 __NAKED__ EXPORT_C void TDes8::Zero() |
900 // |
900 // |