kernel/eka/common/arm/cdes16.cia
branchGCC_SURGE
changeset 173 2afef616d2a1
parent 0 a41df078684a
equal deleted inserted replaced
172:8f7f130ac31a 173:2afef616d2a1
   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 //
   693 	
   693 	
   694 	asm("1: ");
   694 	asm("1: ");
   695 #ifdef __KERNEL_MODE__
   695 #ifdef __KERNEL_MODE__
   696 	asm(".word memcompare ");
   696 	asm(".word memcompare ");
   697 #else
   697 #else
   698 	asm(".word  " CSM_ZN3Mem7CompareEPKtiS0_i);
   698 	asm(".word  " CSM_ZN3Mem7CompareEPKtiS1_i);
   699 #endif
   699 #endif
   700 	}
   700 	}
   701 #endif // __DES16_MACHINE_CODED__
   701 #endif // __DES16_MACHINE_CODED__
   702 
   702 
   703 
   703 
   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 ");