[Cbe-oss-dev] [PATCH 23/23]MARS/task: asm reg func self modifying

Yuji Mano yuji.mano at am.sony.com
Sat Mar 14 12:19:17 EST 2009


Implement registers_save/registers_restore in task module to be self modifying
assembly code. This reduces task module code size by 288 bytes.

Signed-off-by: Yuji Mano <yuji.mano at am.sony.com>
---
 task/src/mpu/module/task_switch.S |  164 ++++++++++++++------------------------
 1 file changed, 64 insertions(+), 100 deletions(-)

--- a/task/src/mpu/module/task_switch.S
+++ b/task/src/mpu/module/task_switch.S
@@ -128,106 +128,70 @@ task_restore:
 .size	task_restore, .-task_restore
 
 
+/*
+ * Registers are saved/restored on task stack.
+ *
+ * Task Stack               High Address
+ * +------------------------+
+ * |  Used Task Stack Area  |
+ * +------------------------+ <--- STACK_PTR
+ * | Non-volatile Registers |          |
+ * |         $127           |          |
+ * |         $126           |          |
+ * |         $125           |       (size)
+ * |         ...            |    NUM_REGS * 16
+ * |         $82            |          |
+ * |         $81            |          |
+ * |         $80            |          |
+ * +------------------------+ <--- REGS_PTR
+ * |    Work Code Block     |
+ * +------------------------+ <--- CODE_PTR + 16
+ * |    Loop Code Block     |
+ * +------------------------+ <--- CODE_PTR
+ *                          Low Address
+ */
+
+#define NUM_REGS	48	/* number of registers to be saved/restored */
+#define STACK_PTR	$73	/* current task stack pointer */
+#define CODE_PTR	$74	/* where code will be loaded into stack */
+#define REGS_PTR	$75	/* where regs will be placed into stack */
+#define REGS_INC	$76	/* register increment value for instruction */
+#define TEMP		$77	/* temporary register */
+#define INST		$78	/* register to store volatile instruction */
+#define INST_MASK	$79	/* mask instruction to store or load */
+
 __registers_save:
-	lqr	$75, __task_stack
-	stqd	$80, -16($75)
-	stqd	$81, -32($75)
-	stqd	$82, -48($75)
-	stqd	$83, -64($75)
-	stqd	$84, -80($75)
-	stqd	$85, -96($75)
-	stqd	$86, -112($75)
-	stqd	$87, -128($75)
-	stqd	$88, -144($75)
-	stqd	$89, -160($75)
-	stqd	$90, -176($75)
-	stqd	$91, -192($75)
-	stqd	$92, -208($75)
-	stqd	$93, -224($75)
-	stqd	$94, -240($75)
-	stqd	$95, -256($75)
-	stqd	$96, -272($75)
-	stqd	$97, -288($75)
-	stqd	$98, -304($75)
-	stqd	$99, -320($75)
-	stqd	$100, -336($75)
-	stqd	$101, -352($75)
-	stqd	$102, -368($75)
-	stqd	$103, -384($75)
-	stqd	$104, -400($75)
-	stqd	$105, -416($75)
-	stqd	$106, -432($75)
-	stqd	$107, -448($75)
-	stqd	$108, -464($75)
-	stqd	$109, -480($75)
-	stqd	$110, -496($75)
-	stqd	$111, -512($75)
-	stqd	$112, -528($75)
-	stqd	$113, -544($75)
-	stqd	$114, -560($75)
-	stqd	$115, -576($75)
-	stqd	$116, -592($75)
-	stqd	$117, -608($75)
-	stqd	$118, -624($75)
-	stqd	$119, -640($75)
-	stqd	$120, -656($75)
-	stqd	$121, -672($75)
-	stqd	$122, -688($75)
-	stqd	$123, -704($75)
-	stqd	$124, -720($75)
-	stqd	$125, -736($75)
-	stqd	$126, -752($75)
-	stqd	$127, -768($75)
-	bi	$LR
+	il	INST_MASK, 0			/* no mask - default is stqd */
+	br	body				/* jump to the body */
 
 __registers_restore:
-	lqr	$75, __task_stack
-	lqd	$80, -16($75)
-	lqd	$81, -32($75)
-	lqd	$82, -48($75)
-	lqd	$83, -64($75)
-	lqd	$84, -80($75)
-	lqd	$85, -96($75)
-	lqd	$86, -112($75)
-	lqd	$87, -128($75)
-	lqd	$88, -144($75)
-	lqd	$89, -160($75)
-	lqd	$90, -176($75)
-	lqd	$91, -192($75)
-	lqd	$92, -208($75)
-	lqd	$93, -224($75)
-	lqd	$94, -240($75)
-	lqd	$95, -256($75)
-	lqd	$96, -272($75)
-	lqd	$97, -288($75)
-	lqd	$98, -304($75)
-	lqd	$99, -320($75)
-	lqd	$100, -336($75)
-	lqd	$101, -352($75)
-	lqd	$102, -368($75)
-	lqd	$103, -384($75)
-	lqd	$104, -400($75)
-	lqd	$105, -416($75)
-	lqd	$106, -432($75)
-	lqd	$107, -448($75)
-	lqd	$108, -464($75)
-	lqd	$109, -480($75)
-	lqd	$110, -496($75)
-	lqd	$111, -512($75)
-	lqd	$112, -528($75)
-	lqd	$113, -544($75)
-	lqd	$114, -560($75)
-	lqd	$115, -576($75)
-	lqd	$116, -592($75)
-	lqd	$117, -608($75)
-	lqd	$118, -624($75)
-	lqd	$119, -640($75)
-	lqd	$120, -656($75)
-	lqd	$121, -672($75)
-	lqd	$122, -688($75)
-	lqd	$123, -704($75)
-	lqd	$124, -720($75)
-	lqd	$125, -736($75)
-	lqd	$126, -752($75)
-	lqd	$127, -768($75)
-	bi	$LR
+	il	INST_MASK, 16			/* set necessary bits */
+	shlqbyi	INST_MASK, INST_MASK, 15	/* shift to correct position */
+
+body:
+	lqr	STACK_PTR, __task_stack		/* load task stack pointer */
+	il	TEMP, -NUM_REGS * 16		/* size of reg save area */
+	a	REGS_PTR, STACK_PTR, TEMP	/* set reg load addr pointer */
+	ai	CODE_PTR, REGS_PTR, -2 * 16	/* set code load addr pointer */
+	lqr	TEMP, loop			/* load loop code to register */
+	stqd	TEMP, 0(CODE_PTR)		/* store loop code to stack */
+	lqr	INST, inst			/* load inst code to register */
+	or	INST, INST, INST_MASK		/* mask instr to stqd or lqd */
+	il	REGS_INC, 1			/* set bit in reg incrementer */
+	shlqbyi	REGS_INC, REGS_INC, 12		/* shift to correct word slot */
+	il	TEMP, NUM_REGS - 1		/* initialize loop counter */
+	sync					/* wait till loop code stored */
+	bi	CODE_PTR			/* jump and never return */
+
+	.balignl	16, 0			/* align self modifying code */
+loop:
+	stqd	INST, 16(CODE_PTR)		/* store inst code to stack */
+	a	INST, INST, REGS_INC		/* increment register number */
+	ai	TEMP, TEMP, -1			/* decrment loop counter */
+	sync					/* wait till inst code stored */
+
+inst:
+	stqd	$80, 0(REGS_PTR)		/* store reg to stack */
+	ai	REGS_PTR, REGS_PTR, 16		/* increment regs pointer */
+	biz	TEMP, $LR			/* if (TEMP == 0) done */
+	br	loop				/* if (TEMP != 0) loop */






More information about the cbe-oss-dev mailing list