OSDN Git Service

PR target/49313
authorgjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Nov 2011 18:08:35 +0000 (18:08 +0000)
committergjl <gjl@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 7 Nov 2011 18:08:35 +0000 (18:08 +0000)
* config/avr/lib1funcs.S (__divmodhi4, __divmodsi4): Tweak speed.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181104 138bc75d-0d04-0410-961f-82ee72b054a4

libgcc/ChangeLog
libgcc/config/avr/lib1funcs.S

index a0b5a89..6d05f0e 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-07  Georg-Johann Lay  <avr@gjlay.de>
+
+       PR target/49313
+       * config/avr/lib1funcs.S (__divmodhi4, __divmodsi4): Tweak speed.
+
 2011-11-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * config.host (tmake_file): Correct comment.
index cd88a57..f7a8f63 100644 (file)
@@ -562,30 +562,33 @@ ENDF __udivmodhi4
 
 #if defined (L_divmodhi4)
 DEFUN __divmodhi4
-       .global _div
+    .global _div
 _div:
-        bst     r_arg1H,7      ; store sign of dividend
-        mov     __tmp_reg__,r_arg1H
-        eor     __tmp_reg__,r_arg2H   ; r0.7 is sign of result
-       rcall   __divmodhi4_neg1 ; dividend negative : negate
-       sbrc    r_arg2H,7
-       rcall   __divmodhi4_neg2 ; divisor negative : negate
-       XCALL   __udivmodhi4    ; do the unsigned div/mod
-       rcall   __divmodhi4_neg1 ; correct remainder sign
-       tst     __tmp_reg__
-       brpl    __divmodhi4_exit
+    bst     r_arg1H,7           ; store sign of dividend
+    mov     __tmp_reg__,r_arg2H
+    brtc    0f
+    com     __tmp_reg__         ; r0.7 is sign of result
+    rcall   __divmodhi4_neg1    ; dividend negative: negate
+0:
+    sbrc    r_arg2H,7
+    rcall   __divmodhi4_neg2    ; divisor negative: negate
+    XCALL   __udivmodhi4        ; do the unsigned div/mod
+    sbrc    __tmp_reg__,7
+    rcall   __divmodhi4_neg2    ; correct remainder sign
+    brtc    __divmodhi4_exit
+__divmodhi4_neg1:
+    ;; correct dividend/remainder sign
+    com     r_arg1H
+    neg     r_arg1L
+    sbci    r_arg1H,0xff
+    ret
 __divmodhi4_neg2:
-       com     r_arg2H
-       neg     r_arg2L         ; correct divisor/result sign
-       sbci    r_arg2H,0xff
+    ;; correct divisor/result sign
+    com     r_arg2H
+    neg     r_arg2L
+    sbci    r_arg2H,0xff
 __divmodhi4_exit:
-       ret
-__divmodhi4_neg1:
-       brtc    __divmodhi4_exit
-       com     r_arg1H
-       neg     r_arg1L         ; correct dividend/remainder sign
-       sbci    r_arg1H,0xff
-       ret
+    ret
 ENDF __divmodhi4
 #endif /* defined (L_divmodhi4) */
 
@@ -807,36 +810,39 @@ ENDF __udivmodsi4
 
 #if defined (L_divmodsi4)
 DEFUN __divmodsi4
-        bst     r_arg1HH,7     ; store sign of dividend
-        mov     __tmp_reg__,r_arg1HH
-        eor     __tmp_reg__,r_arg2HH   ; r0.7 is sign of result
-       rcall   __divmodsi4_neg1 ; dividend negative : negate
-       sbrc    r_arg2HH,7
-       rcall   __divmodsi4_neg2 ; divisor negative : negate
-       XCALL   __udivmodsi4    ; do the unsigned div/mod
-       rcall   __divmodsi4_neg1 ; correct remainder sign
-       rol     __tmp_reg__
-       brcc    __divmodsi4_exit
+    mov     __tmp_reg__,r_arg2HH
+    bst     r_arg1HH,7          ; store sign of dividend
+    brtc    0f
+    com     __tmp_reg__         ; r0.7 is sign of result
+    rcall   __divmodsi4_neg1    ; dividend negative: negate
+0:
+    sbrc    r_arg2HH,7
+    rcall   __divmodsi4_neg2    ; divisor negative: negate
+    XCALL   __udivmodsi4        ; do the unsigned div/mod
+    sbrc    __tmp_reg__, 7      ; correct quotient sign
+    rcall   __divmodsi4_neg2
+    brtc    __divmodsi4_exit    ; correct remainder sign
+__divmodsi4_neg1:
+    ;; correct dividend/remainder sign
+    com     r_arg1HH
+    com     r_arg1HL
+    com     r_arg1H
+    neg     r_arg1L
+    sbci    r_arg1H, 0xff
+    sbci    r_arg1HL,0xff
+    sbci    r_arg1HH,0xff
+    ret
 __divmodsi4_neg2:
-       com     r_arg2HH
-       com     r_arg2HL
-       com     r_arg2H
-       neg     r_arg2L         ; correct divisor/quotient sign
-       sbci    r_arg2H,0xff
-       sbci    r_arg2HL,0xff
-       sbci    r_arg2HH,0xff
+    ;; correct divisor/quotient sign
+    com     r_arg2HH
+    com     r_arg2HL
+    com     r_arg2H
+    neg     r_arg2L
+    sbci    r_arg2H,0xff
+    sbci    r_arg2HL,0xff
+    sbci    r_arg2HH,0xff
 __divmodsi4_exit:
-       ret
-__divmodsi4_neg1:
-       brtc    __divmodsi4_exit
-       com     r_arg1HH
-       com     r_arg1HL
-       com     r_arg1H
-       neg     r_arg1L         ; correct dividend/remainder sign
-       sbci    r_arg1H, 0xff
-       sbci    r_arg1HL,0xff
-       sbci    r_arg1HH,0xff
-       ret
+    ret
 ENDF __divmodsi4
 #endif /* defined (L_divmodsi4) */