diff -urN ./avr-gcc-3.3tinyos/gcc/config/avr/libgcc.S avr-gcc-3.3tinyos-xx/gcc/config/avr/libgcc.S --- ./avr-gcc-3.3tinyos/gcc/config/avr/libgcc.S 2002-06-01 17:33:47.000000000 -0600 +++ avr-gcc-3.3tinyos-xx/gcc/config/avr/libgcc.S 2004-11-30 21:07:14.876377832 -0700 @@ -26,6 +26,8 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#define JDR_HACK 1 + #define __zero_reg__ r1 #define __tmp_reg__ r0 #define __SREG__ 0x3f @@ -418,11 +420,19 @@ 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 + rcall __divmodhi4_neg2xx ; divisor negative : negate rcall __udivmodhi4 ; do the unsigned div/mod rcall __divmodhi4_neg1 ; correct remainder sign tst __tmp_reg__ +#if JDR_HACK + brpl __my_exit_a + rjmp __skip_my_exit_a +__my_exit_a: + ret +__skip_my_exit_a: +#else brpl __divmodhi4_exit +#endif __divmodhi4_neg2: com r_arg2H neg r_arg2L ; correct divisor/result sign @@ -430,11 +440,24 @@ __divmodhi4_exit: ret __divmodhi4_neg1: +#if JDR_HACK + brtc __my_exit_b + rjmp __skip_my_exit_b +__my_exit_b: + ret +__skip_my_exit_b: +#else brtc __divmodhi4_exit +#endif com r_arg1H neg r_arg1L ; correct dividend/remainder sign sbci r_arg1H,0xff ret +__divmodhi4_neg2xx: + com r_arg2H + neg r_arg2L ; correct divisor/result sign + sbci r_arg2H,0xff + ret .endfunc #endif /* defined (L_divmodhi4) */