MIPS: start.S: simplify relocation offset calculation
authorGabor Juhos <juhosg@openwrt.org>
Thu, 24 Jan 2013 06:27:54 +0000 (06:27 +0000)
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>
Sun, 27 Jan 2013 15:40:07 +0000 (16:40 +0100)
The current code uses four instructions and a
temporary register to calculate the relocation
offset and to adjust the gp register.

The relocation offset can be calculated directly
from the CONFIG_SYS_MONITOR_BASE constant and from
the destination address. The resulting offset can
be used to adjust the gp pointer.

This approach makes the code a bit simpler because
it needs two instructions only.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
arch/mips/cpu/mips32/start.S
arch/mips/cpu/mips64/start.S

index 64a606f715bd4abd1a061c6d92d070b4a8cb8d05..d67dafacd463a41a469310e5ce663b80cbce1ef2 100644 (file)
@@ -283,19 +283,13 @@ relocate_code:
        move    s2, a2                  # save destination address in s2
 
        li      t0, CONFIG_SYS_MONITOR_BASE
+       sub     s1, s2, t0              # s1 <-- relocation offset
+
        la      t3, in_ram
        lw      t2, -12(t3)             # t2 <-- uboot_end_data
        move    t1, a2
 
-       /*
-        * Fix $gp:
-        *
-        * New $gp = (Old $gp - CONFIG_SYS_MONITOR_BASE) + Destination Address
-        */
-       move    t6, gp
-       sub     gp, CONFIG_SYS_MONITOR_BASE
-       add     gp, a2                  # gp now adjusted
-       sub     s1, gp, t6              # s1 <-- relocation offset
+       add     gp, s1                  # adjust gp
 
        /*
         * t0 = source address
index 3c0f1c3bd9ce00ef3e8e10f54e710ac5ad01290f..d213c8eed0310d1de4370db423873b866e4fd05d 100644 (file)
@@ -162,19 +162,13 @@ relocate_code:
        move    s2, a2                  # save destination address in s2
 
        dli     t0, CONFIG_SYS_MONITOR_BASE
+       dsub    s1, s2, t0              # s1 <-- relocation offset
+
        dla     t3, in_ram
        ld      t2, -24(t3)             # t2 <-- uboot_end_data
        move    t1, a2
 
-       /*
-        * Fix $gp:
-        *
-        * New $gp = (Old $gp - CONFIG_SYS_MONITOR_BASE) + Destination Address
-        */
-       move    t8, gp
-       dsub    gp, CONFIG_SYS_MONITOR_BASE
-       dadd    gp, a2                  # gp now adjusted
-       dsub    s1, gp, t8              # s1 <-- relocation offset
+       dadd    gp, s1                  # adjust gp
 
        /*
         * t0 = source address