181 asm("cmp r12, #0 "); |
181 asm("cmp r12, #0 "); |
182 asm("bne 1b "); // loop until we reach zero terminator |
182 asm("bne 1b "); // loop until we reach zero terminator |
183 asm("sub r3, r3, r1 "); // r3 = 2*length |
183 asm("sub r3, r3, r1 "); // r3 = 2*length |
184 asm("mov r3, r3, lsr #1 "); // r3 = length (+EBufC) |
184 asm("mov r3, r3, lsr #1 "); // r3 = length (+EBufC) |
185 asm("cmp r3, r2 "); // check against max length |
185 asm("cmp r3, r2 "); // check against max length |
186 asm("bgt Des16PanicLengthOutOfRange__Fv "); |
186 asm("bgt " CSM_Z26Des16PanicLengthOutOfRangev); |
187 asm("stmfd sp!, {r0,lr} "); // save registers for function call |
187 asm("stmfd sp!, {r0,lr} "); // save registers for function call |
188 asm("str r3, [r0], #4 "); // save length/type field, r0->buffer |
188 asm("str r3, [r0], #4 "); // save length/type field, r0->buffer |
189 asm("add r2, r3, r3 "); // size=2*length into r2 for function call |
189 asm("add r2, r3, r3 "); // size=2*length into r2 for function call |
190 asm("bl memmove "); // call memmove |
190 asm("bl memmove "); // call memmove |
191 __POPRET("r0,"); |
191 __POPRET("r0,"); |
228 asm("cmp r12, #0 "); |
228 asm("cmp r12, #0 "); |
229 asm("bne 1b "); // loop until we reach zero terminator |
229 asm("bne 1b "); // loop until we reach zero terminator |
230 asm("sub r3, r3, r1 "); // r3 = 2*length |
230 asm("sub r3, r3, r1 "); // r3 = 2*length |
231 asm("mov r3, r3, lsr #1 "); // r3 = length (+EBufC) |
231 asm("mov r3, r3, lsr #1 "); // r3 = length (+EBufC) |
232 asm("cmp r3, r2 "); // check against max length |
232 asm("cmp r3, r2 "); // check against max length |
233 asm("bgt Des16PanicLengthOutOfRange__Fv "); |
233 asm("bgt " CSM_Z26Des16PanicLengthOutOfRangev); |
234 asm("str r3, [r0], #4 "); // save length/type field, r0->buffer |
234 asm("str r3, [r0], #4 "); // save length/type field, r0->buffer |
235 asm("add r2, r3, r3 "); // size=2*length into r2 for function call |
235 asm("add r2, r3, r3 "); // size=2*length into r2 for function call |
236 asm("b memmove "); // call memmove |
236 asm("b memmove "); // call memmove |
237 } |
237 } |
238 #endif |
238 #endif |
288 asm("cmp r3, #0 "); |
288 asm("cmp r3, #0 "); |
289 asm("bne 1b "); // loop until we reach zero terminator |
289 asm("bne 1b "); // loop until we reach zero terminator |
290 asm("rsb r3, r12, r1, lsr #1 "); // r3 = length + 1 |
290 asm("rsb r3, r12, r1, lsr #1 "); // r3 = length + 1 |
291 asm("sub r3, r3, #1 "); // r3 = length |
291 asm("sub r3, r3, #1 "); // r3 = length |
292 asm("cmp r3, r2 "); // compare to max length |
292 asm("cmp r3, r2 "); // compare to max length |
293 asm("bgt Des16PanicLengthOutOfRange__Fv "); // length too big, so panic |
293 asm("bgt " CSM_Z26Des16PanicLengthOutOfRangev); // length too big, so panic |
294 asm("orr r1, r3, #0x30000000 "); // if length<=max, r1=EBuf + length |
294 asm("orr r1, r3, #0x30000000 "); // if length<=max, r1=EBuf + length |
295 asm("stmfd sp!, {r0, lr} "); // save registers for function call |
295 asm("stmfd sp!, {r0, lr} "); // save registers for function call |
296 asm("stmia r0!, {r1, r2} "); // store type/length and max length fields, r0->buffer |
296 asm("stmia r0!, {r1, r2} "); // store type/length and max length fields, r0->buffer |
297 asm("mov r2, r3, lsl #1 "); // r2=Size() |
297 asm("mov r2, r3, lsl #1 "); // r2=Size() |
298 asm("mov r1, r12, lsl #1 "); // r1=aString |
298 asm("mov r1, r12, lsl #1 "); // r1=aString |
371 asm("bne 1b "); // loop until zero terminator reached |
371 asm("bne 1b "); // loop until zero terminator reached |
372 asm("sub r2, r2, r1 "); // r2=2*length of string |
372 asm("sub r2, r2, r1 "); // r2=2*length of string |
373 asm("mov r2, r2, lsr #1 "); // r2=length of string |
373 asm("mov r2, r2, lsr #1 "); // r2=length of string |
374 asm("ldmia r0, {r3,r12} "); // r3=type/length of this, r12=maxlength |
374 asm("ldmia r0, {r3,r12} "); // r3=type/length of this, r12=maxlength |
375 asm("cmp r2, r12 "); // compare new length against maxlength |
375 asm("cmp r2, r12 "); // compare new length against maxlength |
376 asm("bgt Des16PanicDesOverflow__Fv "); |
376 asm("bgt " CSM_Z21Des16PanicDesOverflowv); |
377 asm("cmp r3, #0x50000000 "); |
377 asm("cmp r3, #0x50000000 "); |
378 asm("bcs Des16PanicBadDesType__Fv "); |
378 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
379 asm("and r3, r3, #0xF0000000 "); // r3=type of this |
379 asm("and r3, r3, #0xF0000000 "); // r3=type of this |
380 asm("orr r3, r3, r2 "); // r3=new type/length |
380 asm("orr r3, r3, r2 "); // r3=new type/length |
381 asm("str r3, [r0], #4 "); // store it |
381 asm("str r3, [r0], #4 "); // store it |
382 asm("eor r3, r3, r3, lsr #1 "); |
382 asm("eor r3, r3, r3, lsr #1 "); |
383 asm("msr cpsr_flg, r3 "); |
383 asm("msr cpsr_flg, r3 "); |
449 { |
449 { |
450 // On entry r0=return store ptr, r1=this, r2=aLength |
450 // On entry r0=return store ptr, r1=this, r2=aLength |
451 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
451 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
452 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
452 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
453 asm("cmp r2, #0 "); // check aLength>=0 |
453 asm("cmp r2, #0 "); // check aLength>=0 |
454 asm("blt Des16PanicPosOutOfRange__Fv "); // if not, panic |
454 asm("blt " CSM_Z23Des16PanicPosOutOfRangev); // if not, panic |
455 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
455 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
456 asm("cmp r2, r12 "); // else limit aLength to Length() |
456 asm("cmp r2, r12 "); // else limit aLength to Length() |
457 asm("movgt r2, r12 "); |
457 asm("movgt r2, r12 "); |
458 asm("cmp r3, #0x50000000 "); |
458 asm("cmp r3, #0x50000000 "); |
459 asm("bcs Des16PanicBadDesType__Fv "); |
459 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
460 asm("eor r3, r3, r3, lsr #1 "); |
460 asm("eor r3, r3, r3, lsr #1 "); |
461 asm("msr cpsr_flg, r3 "); |
461 asm("msr cpsr_flg, r3 "); |
462 asm("addcs r1, r1, #4 "); |
462 asm("addcs r1, r1, #4 "); |
463 asm("ldrle r1, [r1] "); |
463 asm("ldrle r1, [r1] "); |
464 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
464 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
475 { |
475 { |
476 // On entry r0=return store ptr, r1=this, r2=aLength |
476 // On entry r0=return store ptr, r1=this, r2=aLength |
477 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
477 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
478 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
478 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
479 asm("cmp r2, #0 "); // check aLength>=0 |
479 asm("cmp r2, #0 "); // check aLength>=0 |
480 asm("blt Des16PanicPosOutOfRange__Fv "); // if not, panic |
480 asm("blt " CSM_Z23Des16PanicPosOutOfRangev); // if not, panic |
481 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
481 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
482 asm("cmp r2, r12 "); // else limit aLength to Length() |
482 asm("cmp r2, r12 "); // else limit aLength to Length() |
483 asm("movgt r2, r12 "); |
483 asm("movgt r2, r12 "); |
484 asm("cmp r3, #0x50000000 "); |
484 asm("cmp r3, #0x50000000 "); |
485 asm("bcs Des16PanicBadDesType__Fv "); |
485 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
486 asm("eor r3, r3, r3, lsr #1 "); |
486 asm("eor r3, r3, r3, lsr #1 "); |
487 asm("msr cpsr_flg, r3 "); |
487 asm("msr cpsr_flg, r3 "); |
488 asm("addcs r1, r1, #4 "); |
488 asm("addcs r1, r1, #4 "); |
489 asm("ldrle r1, [r1] "); |
489 asm("ldrle r1, [r1] "); |
490 asm("addeq r1, r1, #4 "); // r0=this.Ptr() |
490 asm("addeq r1, r1, #4 "); // r0=this.Ptr() |
504 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
504 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
505 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
505 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
506 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
506 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
507 asm("cmp r2, #0 "); // check aPos>=0 |
507 asm("cmp r2, #0 "); // check aPos>=0 |
508 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
508 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
509 asm("blt Des16PanicPosOutOfRange__Fv "); |
509 asm("blt " CSM_Z23Des16PanicPosOutOfRangev); |
510 asm("cmp r3, #0x50000000 "); |
510 asm("cmp r3, #0x50000000 "); |
511 asm("bcs Des16PanicBadDesType__Fv "); |
511 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
512 asm("eor r3, r3, r3, lsr #1 "); |
512 asm("eor r3, r3, r3, lsr #1 "); |
513 asm("msr cpsr_flg, r3 "); |
513 asm("msr cpsr_flg, r3 "); |
514 asm("addcs r1, r1, #4 "); |
514 asm("addcs r1, r1, #4 "); |
515 asm("ldrle r1, [r1] "); |
515 asm("ldrle r1, [r1] "); |
516 asm("addeq r1, r1, #4 "); // r0=this.Ptr() |
516 asm("addeq r1, r1, #4 "); // r0=this.Ptr() |
530 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
530 // Return TPtr8 ([r0]=length/type,[r0,#4]=maxLength,[r0,#8]=Ptr) |
531 asm("str r4, [sp, #-4]! "); // save r4 |
531 asm("str r4, [sp, #-4]! "); // save r4 |
532 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
532 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
533 asm("mov r4, r1 "); |
533 asm("mov r4, r1 "); |
534 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
534 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
535 asm("bcs Des16PanicBadDesType__Fv "); |
535 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
536 asm("eor r12, r12, r12, lsr #1 "); |
536 asm("eor r12, r12, r12, lsr #1 "); |
537 asm("msr cpsr_flg, r12 "); |
537 asm("msr cpsr_flg, r12 "); |
538 asm("ldr r12, [r1, #-4] "); |
538 asm("ldr r12, [r1, #-4] "); |
539 asm("addcs r4, r4, #4 "); |
539 asm("addcs r4, r4, #4 "); |
540 asm("ldrle r4, [r4] "); |
540 asm("ldrle r4, [r4] "); |
547 asm("addge r3, r4, r2, lsl #1 "); // and r2=this.Ptr()+aPos*2 |
547 asm("addge r3, r4, r2, lsl #1 "); // and r2=this.Ptr()+aPos*2 |
548 asm("bicge r2, r1, #0xF0000000 "); // and r1=aLength |
548 asm("bicge r2, r1, #0xF0000000 "); // and r1=aLength |
549 asm("stmgeia r0, {r1-r3} "); |
549 asm("stmgeia r0, {r1-r3} "); |
550 asm("ldrge r4, [sp], #4 "); |
550 asm("ldrge r4, [sp], #4 "); |
551 __JUMP(ge,lr); |
551 __JUMP(ge,lr); |
552 asm("b Des16PanicPosOutOfRange__Fv "); |
552 asm("b " CSM_Z23Des16PanicPosOutOfRangev); |
553 } |
553 } |
554 |
554 |
555 __NAKED__ EXPORT_C const TUint16& TDesC16::AtC(TInt /*anIndex*/) const |
555 __NAKED__ EXPORT_C const TUint16& TDesC16::AtC(TInt /*anIndex*/) const |
556 // |
556 // |
557 // Return a reference to the character in the buffer. |
557 // Return a reference to the character in the buffer. |
579 // Locate character aChar in the descriptor. |
579 // Locate character aChar in the descriptor. |
580 // |
580 // |
581 { |
581 { |
582 asm("ldr r2, [r0], #4 "); // r2=length/type |
582 asm("ldr r2, [r0], #4 "); // r2=length/type |
583 asm("cmp r2, #0x50000000 "); |
583 asm("cmp r2, #0x50000000 "); |
584 asm("bcs Des16PanicBadDesType__Fv "); |
584 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
585 asm("bics r3, r2, #0xF0000000 "); // r3=length |
585 asm("bics r3, r2, #0xF0000000 "); // r3=length |
586 asm("mvneq r0, #0 "); // if length=0, not found |
586 asm("mvneq r0, #0 "); // if length=0, not found |
587 __JUMP(eq,lr); |
587 __JUMP(eq,lr); |
588 asm("eor r2, r2, r2, lsr #1 "); |
588 asm("eor r2, r2, r2, lsr #1 "); |
589 asm("msr cpsr_flg, r2 "); |
589 asm("msr cpsr_flg, r2 "); |
609 // Locate character aChar in the descriptor in reverse. |
609 // Locate character aChar in the descriptor in reverse. |
610 // |
610 // |
611 { |
611 { |
612 asm("ldr r2, [r0], #4 "); // r2=length/type |
612 asm("ldr r2, [r0], #4 "); // r2=length/type |
613 asm("cmp r2, #0x50000000 "); |
613 asm("cmp r2, #0x50000000 "); |
614 asm("bcs Des16PanicBadDesType__Fv "); |
614 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
615 asm("bics r3, r2, #0xF0000000 "); // r3=length |
615 asm("bics r3, r2, #0xF0000000 "); // r3=length |
616 asm("mvneq r0, #0 "); // if length=0, not found |
616 asm("mvneq r0, #0 "); // if length=0, not found |
617 __JUMP(eq,lr); |
617 __JUMP(eq,lr); |
618 asm("eor r2, r2, r2, lsr #1 "); |
618 asm("eor r2, r2, r2, lsr #1 "); |
619 asm("msr cpsr_flg, r2 "); |
619 asm("msr cpsr_flg, r2 "); |
641 // |
641 // |
642 { |
642 { |
643 asm("ldr r12, 1f "); |
643 asm("ldr r12, 1f "); |
644 asm("b comparebody "); |
644 asm("b comparebody "); |
645 asm("1: "); |
645 asm("1: "); |
646 asm(".word " CSM_ZN3Mem8CompareFEPKtiS0_i); |
646 asm(".word " CSM_ZN3Mem8CompareFEPKtiS1_i); |
647 } |
647 } |
648 |
648 |
649 __NAKED__ EXPORT_C TInt TDesC16::CompareC(const TDesC16& /*aDes*/) const |
649 __NAKED__ EXPORT_C TInt TDesC16::CompareC(const TDesC16& /*aDes*/) const |
650 // |
650 // |
651 // Compare a descriptor to this descriptor collated. |
651 // Compare a descriptor to this descriptor collated. |
652 // |
652 // |
653 { |
653 { |
654 asm("ldr r12, 1f "); |
654 asm("ldr r12, 1f "); |
655 asm("b comparebody "); |
655 asm("b comparebody "); |
656 asm("1: "); |
656 asm("1: "); |
657 asm(".word " CSM_ZN3Mem8CompareCEPKtiS0_i); |
657 asm(".word " CSM_ZN3Mem8CompareCEPKtiS1_i); |
658 } |
658 } |
659 #endif |
659 #endif |
660 |
660 |
661 __NAKED__ EXPORT_C TInt TDesC16::Compare(const TDesC16& /*aDes*/) const |
661 __NAKED__ EXPORT_C TInt TDesC16::Compare(const TDesC16& /*aDes*/) const |
662 // |
662 // |
818 { |
818 { |
819 // On entry r0=return store ptr, r1=this, r2=aLength |
819 // On entry r0=return store ptr, r1=this, r2=aLength |
820 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
820 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
821 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
821 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
822 asm("cmp r2, #0 "); // check aLength>=0 |
822 asm("cmp r2, #0 "); // check aLength>=0 |
823 asm("blt Des16PanicPosOutOfRange__Fv "); // if not, panic |
823 asm("blt " CSM_Z23Des16PanicPosOutOfRangev); // if not, panic |
824 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
824 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
825 asm("cmp r2, r12 "); // else limit aLength to Length() |
825 asm("cmp r2, r12 "); // else limit aLength to Length() |
826 asm("movgt r2, r12 "); |
826 asm("movgt r2, r12 "); |
827 asm("cmp r3, #0x50000000 "); |
827 asm("cmp r3, #0x50000000 "); |
828 asm("bcs Des16PanicBadDesType__Fv "); |
828 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
829 asm("eor r3, r3, r3, lsr #1 "); |
829 asm("eor r3, r3, r3, lsr #1 "); |
830 asm("msr cpsr_flg, r3 "); |
830 asm("msr cpsr_flg, r3 "); |
831 asm("addcs r1, r1, #4 "); |
831 asm("addcs r1, r1, #4 "); |
832 asm("ldrle r1, [r1] "); |
832 asm("ldrle r1, [r1] "); |
833 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
833 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
844 { |
844 { |
845 // On entry r0=return store ptr, r1=this, r2=aLength |
845 // On entry r0=return store ptr, r1=this, r2=aLength |
846 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
846 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
847 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
847 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
848 asm("cmp r2, #0 "); // check aLength>=0 |
848 asm("cmp r2, #0 "); // check aLength>=0 |
849 asm("blt Des16PanicPosOutOfRange__Fv "); // if not, panic |
849 asm("blt " CSM_Z23Des16PanicPosOutOfRangev); // if not, panic |
850 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
850 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
851 asm("cmp r2, r12 "); // else limit aLength to Length() |
851 asm("cmp r2, r12 "); // else limit aLength to Length() |
852 asm("movgt r2, r12 "); |
852 asm("movgt r2, r12 "); |
853 asm("cmp r3, #0x50000000 "); |
853 asm("cmp r3, #0x50000000 "); |
854 asm("bcs Des16PanicBadDesType__Fv "); |
854 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
855 asm("eor r3, r3, r3, lsr #1 "); |
855 asm("eor r3, r3, r3, lsr #1 "); |
856 asm("msr cpsr_flg, r3 "); |
856 asm("msr cpsr_flg, r3 "); |
857 asm("addcs r1, r1, #4 "); |
857 asm("addcs r1, r1, #4 "); |
858 asm("ldrle r1, [r1] "); |
858 asm("ldrle r1, [r1] "); |
859 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
859 asm("addeq r1, r1, #4 "); // r1=this.Ptr() |
873 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
873 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
874 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
874 asm("ldr r3, [r1], #4 "); // r3=this.length/type |
875 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
875 asm("bic r12, r3, #0xF0000000 "); // r12=this.Length() |
876 asm("cmp r2, #0 "); // check aPos>=0 |
876 asm("cmp r2, #0 "); // check aPos>=0 |
877 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
877 asm("cmpge r12, r2 "); // if so check Length()>=aPos |
878 asm("blt Des16PanicPosOutOfRange__Fv "); |
878 asm("blt " CSM_Z23Des16PanicPosOutOfRangev); |
879 asm("cmp r3, #0x50000000 "); |
879 asm("cmp r3, #0x50000000 "); |
880 asm("bcs Des16PanicBadDesType__Fv "); |
880 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
881 asm("eor r3, r3, r3, lsr #1 "); |
881 asm("eor r3, r3, r3, lsr #1 "); |
882 asm("msr cpsr_flg, r3 "); |
882 asm("msr cpsr_flg, r3 "); |
883 asm("addcs r1, r1, #4 "); |
883 asm("addcs r1, r1, #4 "); |
884 asm("ldrle r1, [r1] "); |
884 asm("ldrle r1, [r1] "); |
885 asm("addeq r1, r1, #4 "); // r3=this.Ptr() |
885 asm("addeq r1, r1, #4 "); // r3=this.Ptr() |
897 { |
897 { |
898 // On entry r0=return store ptr, r1=this, r2=aPos, r3=aLength |
898 // On entry r0=return store ptr, r1=this, r2=aPos, r3=aLength |
899 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
899 // Return TPtr16 ([r0]=length/type,[r0,#4]=Ptr) |
900 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
900 asm("ldr r12, [r1], #4 "); // r12=this.length/type |
901 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
901 asm("cmp r12, #0x50000000 "); // check valid descriptor type |
902 asm("bcs Des16PanicBadDesType__Fv "); |
902 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
903 asm("eor r12, r12, r12, lsr #1 "); |
903 asm("eor r12, r12, r12, lsr #1 "); |
904 asm("msr cpsr_flg, r12 "); |
904 asm("msr cpsr_flg, r12 "); |
905 asm("ldr r12, [r1, #-4] "); |
905 asm("ldr r12, [r1, #-4] "); |
906 asm("addcs r1, r1, #4 "); |
906 asm("addcs r1, r1, #4 "); |
907 asm("ldrle r1, [r1] "); |
907 asm("ldrle r1, [r1] "); |
912 asm("cmpge r12, r3 "); // and check Length()-aPos>=aLength |
912 asm("cmpge r12, r3 "); // and check Length()-aPos>=aLength |
913 asm("addge r2, r1, r2, lsl #1 "); // if so r2=this.Ptr()+aPos*2 |
913 asm("addge r2, r1, r2, lsl #1 "); // if so r2=this.Ptr()+aPos*2 |
914 asm("orrge r1, r3, #0x10000000 "); // and r1 = aLength + EPtrC |
914 asm("orrge r1, r3, #0x10000000 "); // and r1 = aLength + EPtrC |
915 asm("stmgeia r0, {r1,r2} "); |
915 asm("stmgeia r0, {r1,r2} "); |
916 __JUMP(ge,lr); |
916 __JUMP(ge,lr); |
917 asm("b Des16PanicPosOutOfRange__Fv "); |
917 asm("b " CSM_Z23Des16PanicPosOutOfRangev); |
918 } |
918 } |
919 #endif // __EABI__ |
919 #endif // __EABI__ |
920 |
920 |
921 |
921 |
922 __NAKED__ EXPORT_C void TDes16::Zero() |
922 __NAKED__ EXPORT_C void TDes16::Zero() |
951 // |
951 // |
952 { |
952 { |
953 asm("ldmia r0, {r1,r2} "); // r1=length/type, r2=maxlength |
953 asm("ldmia r0, {r1,r2} "); // r1=length/type, r2=maxlength |
954 asm("bic r3, r1, #0xF0000000 "); // r3=Length(); |
954 asm("bic r3, r1, #0xF0000000 "); // r3=Length(); |
955 asm("cmp r3, r2 "); // check Length()<MaxLength() |
955 asm("cmp r3, r2 "); // check Length()<MaxLength() |
956 asm("bge Des16PanicDesOverflow__Fv "); |
956 asm("bge " CSM_Z21Des16PanicDesOverflowv); |
957 asm("cmp r1, #0x50000000 "); |
957 asm("cmp r1, #0x50000000 "); |
958 asm("bcs Des16PanicBadDesType__Fv "); |
958 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
959 asm("eor r1, r1, r1, lsr #1 "); |
959 asm("eor r1, r1, r1, lsr #1 "); |
960 asm("msr cpsr_flg, r1 "); |
960 asm("msr cpsr_flg, r1 "); |
961 asm("add r0, r0, #4 "); |
961 asm("add r0, r0, #4 "); |
962 asm("addcs r0, r0, #4 "); |
962 asm("addcs r0, r0, #4 "); |
963 asm("ldrle r0, [r0] "); |
963 asm("ldrle r0, [r0] "); |
975 // |
975 // |
976 { |
976 { |
977 asm("ldmia r0, {r2,r3} "); // r2=length/type, r3=maxlength |
977 asm("ldmia r0, {r2,r3} "); // r2=length/type, r3=maxlength |
978 asm("bic r12, r2, #0xF0000000 "); // r12=Length(); |
978 asm("bic r12, r2, #0xF0000000 "); // r12=Length(); |
979 asm("cmp r12, r3 "); // check Length()<MaxLength() |
979 asm("cmp r12, r3 "); // check Length()<MaxLength() |
980 asm("bge Des16PanicDesOverflow__Fv "); |
980 asm("bge " CSM_Z21Des16PanicDesOverflowv); |
981 asm("cmp r2, #0x50000000 "); |
981 asm("cmp r2, #0x50000000 "); |
982 asm("bcs Des16PanicBadDesType__Fv "); |
982 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
983 asm("add r2, r2, #1 "); // increment length by 1 |
983 asm("add r2, r2, #1 "); // increment length by 1 |
984 asm("str r2, [r0] "); // store new length |
984 asm("str r2, [r0] "); // store new length |
985 asm("eor r2, r2, r2, lsr #1 "); |
985 asm("eor r2, r2, r2, lsr #1 "); |
986 asm("msr cpsr_flg, r2 "); |
986 asm("msr cpsr_flg, r2 "); |
987 asm("add r2, r0, #4 "); // r2=this+4 |
987 asm("add r2, r0, #4 "); // r2=this+4 |
1070 // |
1070 // |
1071 { |
1071 { |
1072 // on entry r0=this, r1=fill char |
1072 // on entry r0=this, r1=fill char |
1073 asm("ldr r3, [r0] "); // r3=length/type |
1073 asm("ldr r3, [r0] "); // r3=length/type |
1074 asm("cmp r3, #0x50000000 "); |
1074 asm("cmp r3, #0x50000000 "); |
1075 asm("bcs Des16PanicBadDesType__Fv "); |
1075 asm("bcs " CSM_Z20Des16PanicBadDesTypev); |
1076 asm("bics r2, r3, #0xF0000000 "); // r2=Length() |
1076 asm("bics r2, r3, #0xF0000000 "); // r2=Length() |
1077 __JUMP(eq,lr); // if length is zero, finished |
1077 __JUMP(eq,lr); // if length is zero, finished |
1078 asm("stmfd sp!, {r0,lr} "); // save registers for function call |
1078 asm("stmfd sp!, {r0,lr} "); // save registers for function call |
1079 asm("eor r3, r3, r3, lsr #1 "); |
1079 asm("eor r3, r3, r3, lsr #1 "); |
1080 asm("msr cpsr_flg, r3 "); |
1080 asm("msr cpsr_flg, r3 "); |