Gitweb links:

...log 
http://git.netsurf-browser.org/netsurf.git/shortlog/1577d000501894217f59da389f9c08f2d8566f42
...commit 
http://git.netsurf-browser.org/netsurf.git/commit/1577d000501894217f59da389f9c08f2d8566f42
...tree 
http://git.netsurf-browser.org/netsurf.git/tree/1577d000501894217f59da389f9c08f2d8566f42

The branch, master has been updated
       via  1577d000501894217f59da389f9c08f2d8566f42 (commit)
      from  cd76c45e9ec422b63929ab386758b651df73ca45 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commitdiff 
http://git.netsurf-browser.org/netsurf.git/commit/?id=1577d000501894217f59da389f9c08f2d8566f42
commit 1577d000501894217f59da389f9c08f2d8566f42
Author: John-Mark Bell <[email protected]>
Commit: John-Mark Bell <[email protected]>

    RISC OS: fix awrender glue for EABI
    
    The only hand-written asm is the glue to Artworks Render. Update
    it to be ABI compliant when building for EABI and force the
    alignment of the data in the .bss section (as unaligned rotated
    loads are really not a thing).
    
    No functional change for non-EABI builds but, as the stack framing
    differs depending on the ABI in use, we can no longer reliably use
    fp as the base pointer for on-stack function arguments to
    awrender_render. Thus, this has been reworked to use ip as the
    pointer instead and to also use r8/r9 to relieve excess register
    pressure.

diff --git a/frontends/riscos/content-handlers/awrender.s 
b/frontends/riscos/content-handlers/awrender.s
index 5bcafe5..fe37f66 100644
--- a/frontends/riscos/content-handlers/awrender.s
+++ b/frontends/riscos/content-handlers/awrender.s
@@ -209,12 +209,18 @@ errblk            %       256
 @ os_error *awrender_init(byte **doc, size_t *doc_size, void *init_routine, 
void *init_workspace);
 
                .global awrender_init
-awrender_init: MOV     ip,sp
+awrender_init:
+#ifndef __ARM_EABI__
+               MOV     ip,sp
                STMFD   sp!,{a1,a2,v1,v2,fp,ip,lr,pc}
                SUB     fp,ip,#4
                SUB     ip,sp,#512
                CMP     ip,sl
                BLMI    __rt_stkovf_split_big
+#else
+               STMFD   sp!,{a1,a2,v1,v2,fp,lr}
+               ADD     fp,sp,#4*4
+#endif
 
                LDR     v2,=aw_temp
                LDR     a1,[a1]
@@ -235,14 +241,18 @@ awrender_init:    MOV     ip,sp
 
                @ return updated block ptr & size to caller
 
-               LDR     a2,[fp,#-28]
-               LDR     a3,[fp,#-24]
+               LDR     a2,[sp],#4
+               LDR     a3,[sp],#4
                LDR     ip,[v2,#aw_rsz_block]
                LDR     lr,[v2,#aw_rsz_size]
                STR     ip,[a2]
                STR     lr,[a3]
 
-               LDMEA   fp,{v1,v2,fp,sp,pc}
+#ifndef __ARM_EABI__
+               LDMDB   fp,{v1,v2,fp,sp,pc}
+#else
+               LDMIA   sp!,{v1,v2,fp,pc}
+#endif
 
 
 @ os_error *awrender_render(const char *doc,
@@ -258,37 +268,46 @@ awrender_init:    MOV     ip,sp
 @              void *workspace);
 
                .global awrender_render
-awrender_render:       MOV     ip,sp
-               STMFD   sp!,{v1-v4,fp,ip,lr,pc}
+awrender_render:
+#ifndef __ARM_EABI__
+               MOV     ip,sp
+               STMFD   sp!,{v1-v6,fp,ip,lr,pc}
                SUB     fp,ip,#4
                SUB     ip,sp,#512
                CMP     ip,sl
                BLMI    __rt_stkovf_split_big
+               ADD     ip,fp,#4                        @ ip -> stacked args
+#else
+               MOV     ip,sp                           @ ip -> stacked args
+               STMFD   sp!,{v1-v6,fp,lr}
+               ADD     fp,sp,#6*4
+#endif
 
-               LDR     R12,[fp,#20]
                LDR     R14,=aw_temp
-               LDR     R5,[fp,#4]
-               LDR     R6,[fp,#12]
+               LDR     R5,[ip,#0]                      @ rsz_block
+               LDR     R6,[ip,#8]                      @ wysiwyg_setting
                LDR     R4,[R5]                         @ resizable block
-               LDR     R7,[fp,#16]
+               LDR     R7,[ip,#12]                     @ output_dest
+               LDR     R8,[ip,#16]                     @ doc_size
+               LDR     R9,[ip,#4]                      @ rsz_size
                STR     R4,[R14,#aw_rsz_block]
                STR     R0,[R14,#aw_fixed_block]        @ document ptr
-               STR     R12,[R14,#aw_fixed_size]        @ document size
-               LDR     R12,[fp,#8]
+               STR     R8,[R14,#aw_fixed_size]         @ document size
 
                STR     R5,[sp,#-4]!                    @ ptr to receive block
-               STR     R12,[sp,#-4]!                   @ ptr to receive size
+               STR     R9,[sp,#-4]!                    @ ptr to receive size
 
-               LDR     R12,[R12]
+               LDR     R9,[R9]
                ADR     R5,aw_callback
-               STR     R12,[R14,#aw_rsz_size]
+               STR     R9,[R14,#aw_rsz_size]
 
                STR     sl,[R14,#aw_sl]
                STR     fp,[R14,#aw_fp]
 
-               LDR     R12,[fp,#28]
+               LDR     R8,[ip,#20]                     @ routine
+               LDR     R12,[ip,#24]                    @ workspace
                MOV     lr,pc
-               LDR     pc,[fp,#24]
+               MOV     pc,R8
                MOVVC   a1,#0
 
                @ return updated block ptr & size to caller
@@ -301,7 +320,11 @@ awrender_render:   MOV     ip,sp
                STR     R5,[R12]
                STR     R6,[R4]
 
-               LDMEA   fp,{v1-v4,fp,sp,pc}
+#ifndef __ARM_EABI__
+               LDMDB   fp,{v1-v6,fp,sp,pc}
+#else
+               LDMIA   sp!,{v1-v6,fp,pc}
+#endif
 
 
 @ Callback routine for block resizing
@@ -340,11 +363,18 @@ aw_callback:      TEQ     R11,#3
                CMP     R1,R2
                BLS     aw_read
 
-               STMFD   R13!,{R1,R10-R12,R14}
+               STMFD   R13!,{R1,R4,R10-R12,R14}
+#ifdef __ARM_EABI__
+               MOV     R4,R13                  @ save original sp
+               BIC     R13,R13,#7              @ align to multiple of 8
+#endif
                LDR     sl,[R11,#aw_sl]
                LDR     fp,[R11,#aw_fp]
                BL      realloc
-               LDMFD   R13!,{R1,R10-R12,R14}
+#ifdef __ARM_EABI__
+               MOV     R13,R4                  @ restore unaligned sp
+#endif
+               LDMFD   R13!,{R1,R4,R10-R12,R14}
 
                CMP     R0,#0                   @ did it work?
                BEQ     aw_nomem
@@ -359,7 +389,11 @@ aw_read:   @ return details of fixed block
                SUBS    R11,R11,R11             @ clear V
                MOV     PC,R14
 
-aw_nomem:      STMFD   R13!,{R10,R12,R14}
+aw_nomem:      STMFD   R13!,{R4,R10,R12,R14}
+#ifdef __ARM_EABI__
+               MOV     R4,R13                  @ save original sp
+               BIC     R13,R13,#7              @ align to multiple of 8
+#endif
                LDR     sl,[R11,#aw_sl]
                LDR     fp,[R11,#aw_fp]
                ADR     R0,tok_nomem
@@ -370,13 +404,17 @@ aw_nomem: STMFD   R13!,{R10,R12,R14}
                SUB     R0,R0,#4                @ error number already 0
                MOV     R11,#0                  @ restore reason code
                CMP     PC,#1<<31               @ set V
-               LDMFD   R13!,{R10,R12,PC}
+#ifdef __ARM_EABI__
+               MOV     R13,R4                  @ restore original sp
+#endif
+               LDMFD   R13!,{R4,R10,R12,PC}
 
 tok_nomem:     .asciz  "NoMemory"
                .align
 
                .bss
 
+               .align
 aw_temp:       .space  sizeof_aw
                .type   aw_temp, %object
                .size   aw_temp, . - aw_temp


-----------------------------------------------------------------------

Summary of changes:
 frontends/riscos/content-handlers/awrender.s |   82 +++++++++++++++++++-------
 1 file changed, 60 insertions(+), 22 deletions(-)

diff --git a/frontends/riscos/content-handlers/awrender.s 
b/frontends/riscos/content-handlers/awrender.s
index 5bcafe5..fe37f66 100644
--- a/frontends/riscos/content-handlers/awrender.s
+++ b/frontends/riscos/content-handlers/awrender.s
@@ -209,12 +209,18 @@ errblk            %       256
 @ os_error *awrender_init(byte **doc, size_t *doc_size, void *init_routine, 
void *init_workspace);
 
                .global awrender_init
-awrender_init: MOV     ip,sp
+awrender_init:
+#ifndef __ARM_EABI__
+               MOV     ip,sp
                STMFD   sp!,{a1,a2,v1,v2,fp,ip,lr,pc}
                SUB     fp,ip,#4
                SUB     ip,sp,#512
                CMP     ip,sl
                BLMI    __rt_stkovf_split_big
+#else
+               STMFD   sp!,{a1,a2,v1,v2,fp,lr}
+               ADD     fp,sp,#4*4
+#endif
 
                LDR     v2,=aw_temp
                LDR     a1,[a1]
@@ -235,14 +241,18 @@ awrender_init:    MOV     ip,sp
 
                @ return updated block ptr & size to caller
 
-               LDR     a2,[fp,#-28]
-               LDR     a3,[fp,#-24]
+               LDR     a2,[sp],#4
+               LDR     a3,[sp],#4
                LDR     ip,[v2,#aw_rsz_block]
                LDR     lr,[v2,#aw_rsz_size]
                STR     ip,[a2]
                STR     lr,[a3]
 
-               LDMEA   fp,{v1,v2,fp,sp,pc}
+#ifndef __ARM_EABI__
+               LDMDB   fp,{v1,v2,fp,sp,pc}
+#else
+               LDMIA   sp!,{v1,v2,fp,pc}
+#endif
 
 
 @ os_error *awrender_render(const char *doc,
@@ -258,37 +268,46 @@ awrender_init:    MOV     ip,sp
 @              void *workspace);
 
                .global awrender_render
-awrender_render:       MOV     ip,sp
-               STMFD   sp!,{v1-v4,fp,ip,lr,pc}
+awrender_render:
+#ifndef __ARM_EABI__
+               MOV     ip,sp
+               STMFD   sp!,{v1-v6,fp,ip,lr,pc}
                SUB     fp,ip,#4
                SUB     ip,sp,#512
                CMP     ip,sl
                BLMI    __rt_stkovf_split_big
+               ADD     ip,fp,#4                        @ ip -> stacked args
+#else
+               MOV     ip,sp                           @ ip -> stacked args
+               STMFD   sp!,{v1-v6,fp,lr}
+               ADD     fp,sp,#6*4
+#endif
 
-               LDR     R12,[fp,#20]
                LDR     R14,=aw_temp
-               LDR     R5,[fp,#4]
-               LDR     R6,[fp,#12]
+               LDR     R5,[ip,#0]                      @ rsz_block
+               LDR     R6,[ip,#8]                      @ wysiwyg_setting
                LDR     R4,[R5]                         @ resizable block
-               LDR     R7,[fp,#16]
+               LDR     R7,[ip,#12]                     @ output_dest
+               LDR     R8,[ip,#16]                     @ doc_size
+               LDR     R9,[ip,#4]                      @ rsz_size
                STR     R4,[R14,#aw_rsz_block]
                STR     R0,[R14,#aw_fixed_block]        @ document ptr
-               STR     R12,[R14,#aw_fixed_size]        @ document size
-               LDR     R12,[fp,#8]
+               STR     R8,[R14,#aw_fixed_size]         @ document size
 
                STR     R5,[sp,#-4]!                    @ ptr to receive block
-               STR     R12,[sp,#-4]!                   @ ptr to receive size
+               STR     R9,[sp,#-4]!                    @ ptr to receive size
 
-               LDR     R12,[R12]
+               LDR     R9,[R9]
                ADR     R5,aw_callback
-               STR     R12,[R14,#aw_rsz_size]
+               STR     R9,[R14,#aw_rsz_size]
 
                STR     sl,[R14,#aw_sl]
                STR     fp,[R14,#aw_fp]
 
-               LDR     R12,[fp,#28]
+               LDR     R8,[ip,#20]                     @ routine
+               LDR     R12,[ip,#24]                    @ workspace
                MOV     lr,pc
-               LDR     pc,[fp,#24]
+               MOV     pc,R8
                MOVVC   a1,#0
 
                @ return updated block ptr & size to caller
@@ -301,7 +320,11 @@ awrender_render:   MOV     ip,sp
                STR     R5,[R12]
                STR     R6,[R4]
 
-               LDMEA   fp,{v1-v4,fp,sp,pc}
+#ifndef __ARM_EABI__
+               LDMDB   fp,{v1-v6,fp,sp,pc}
+#else
+               LDMIA   sp!,{v1-v6,fp,pc}
+#endif
 
 
 @ Callback routine for block resizing
@@ -340,11 +363,18 @@ aw_callback:      TEQ     R11,#3
                CMP     R1,R2
                BLS     aw_read
 
-               STMFD   R13!,{R1,R10-R12,R14}
+               STMFD   R13!,{R1,R4,R10-R12,R14}
+#ifdef __ARM_EABI__
+               MOV     R4,R13                  @ save original sp
+               BIC     R13,R13,#7              @ align to multiple of 8
+#endif
                LDR     sl,[R11,#aw_sl]
                LDR     fp,[R11,#aw_fp]
                BL      realloc
-               LDMFD   R13!,{R1,R10-R12,R14}
+#ifdef __ARM_EABI__
+               MOV     R13,R4                  @ restore unaligned sp
+#endif
+               LDMFD   R13!,{R1,R4,R10-R12,R14}
 
                CMP     R0,#0                   @ did it work?
                BEQ     aw_nomem
@@ -359,7 +389,11 @@ aw_read:   @ return details of fixed block
                SUBS    R11,R11,R11             @ clear V
                MOV     PC,R14
 
-aw_nomem:      STMFD   R13!,{R10,R12,R14}
+aw_nomem:      STMFD   R13!,{R4,R10,R12,R14}
+#ifdef __ARM_EABI__
+               MOV     R4,R13                  @ save original sp
+               BIC     R13,R13,#7              @ align to multiple of 8
+#endif
                LDR     sl,[R11,#aw_sl]
                LDR     fp,[R11,#aw_fp]
                ADR     R0,tok_nomem
@@ -370,13 +404,17 @@ aw_nomem: STMFD   R13!,{R10,R12,R14}
                SUB     R0,R0,#4                @ error number already 0
                MOV     R11,#0                  @ restore reason code
                CMP     PC,#1<<31               @ set V
-               LDMFD   R13!,{R10,R12,PC}
+#ifdef __ARM_EABI__
+               MOV     R13,R4                  @ restore original sp
+#endif
+               LDMFD   R13!,{R4,R10,R12,PC}
 
 tok_nomem:     .asciz  "NoMemory"
                .align
 
                .bss
 
+               .align
 aw_temp:       .space  sizeof_aw
                .type   aw_temp, %object
                .size   aw_temp, . - aw_temp


-- 
NetSurf Browser
_______________________________________________
netsurf-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to