CRIS: Simple insn reschedule to avoid interlocks.
authorJesper Nilsson <jesper.nilsson@axis.com>
Mon, 2 Aug 2010 16:09:56 +0000 (18:09 +0200)
committerJesper Nilsson <jesper.nilsson@axis.com>
Wed, 4 Aug 2010 11:00:00 +0000 (13:00 +0200)
Brings down the CPI from ~1.5 to ~1.1.

Signed-off-by: Edgar Iglesias <Edgar.Iglesias@axis.com>
Signed-off-by: Jesper Nilsson <jesper.nilsson@axis.com>
arch/cris/arch-v32/kernel/entry.S

index 7c14acb..ce121df 100644 (file)
@@ -348,40 +348,40 @@ _syscall_trace_entry:
 
        .type   resume,@function
 resume:
-       subq    4, $sp
-       move    $srp, [$sp]             ; Keep old/new PC on the stack.
+       subq    4, $sp                  ; Make space for srp.
+
        add.d   $r12, $r10              ; R10 = current tasks tss.
        addoq   +THREAD_ccs, $r10, $acr
+       move    $srp, [$sp]             ; Keep old/new PC on the stack.
        move    $ccs, [$acr]            ; Save IRQ enable state.
        di
 
        addoq   +THREAD_usp, $r10, $acr
+       subq    10*4, $sp               ; Make room for R9.
        move    $usp, [$acr]            ; Save user-mode stackpointer.
 
        ;; See copy_thread for the reason why register R9 is saved.
-       subq    10*4, $sp
        movem   $r9, [$sp]              ; Save non-scratch registers and R9.
 
        addoq   +THREAD_ksp, $r10, $acr
+       move.d  $sp, $r10               ; Return last running task in R10.
        move.d  $sp, [$acr]             ; Save kernel SP for old task.
 
-       move.d  $sp, $r10               ; Return last running task in R10.
        and.d   -8192, $r10             ; Get thread_info from stackpointer.
        addoq   +TI_task, $r10, $acr
-       move.d  [$acr], $r10            ; Get task.
        add.d   $r12, $r11              ; Find the new tasks tss.
+       move.d  [$acr], $r10            ; Get task.
        addoq   +THREAD_ksp, $r11, $acr
        move.d  [$acr], $sp             ; Switch to new stackframe.
+       addoq   +THREAD_usp, $r11, $acr
        movem   [$sp+], $r9             ; Restore non-scratch registers and R9.
 
-       addoq   +THREAD_usp, $r11, $acr
        move    [$acr], $usp            ; Restore user-mode stackpointer.
 
        addoq   +THREAD_ccs, $r11, $acr
+       move.d  [$sp+], $r11
+       jump    $r11                    ; Restore PC.
        move    [$acr], $ccs            ; Restore IRQ enable status.
-       move.d  [$sp+], $acr
-       jump    $acr                    ; Restore PC.
-       nop
        .size   resume, . - resume
 
 nmi_interrupt: