kernel/eka/common/arm/cdes8.cia
branchGCC_SURGE
changeset 173 2afef616d2a1
parent 0 a41df078684a
equal deleted inserted replaced
172:8f7f130ac31a 173:2afef616d2a1
   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 //