From: SourceForge.net <no...@so...> - 2011-08-04 10:35:58
|
Feature Requests item #1307995, was opened at 2005-09-29 15:37 Message generated for change (Comment added) made by spth You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=350599&aid=1307995&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Priority: 5 Private: No Submitted By: Philipp Klaus Krause (spth) Assigned to: Nobody/Anonymous (nobody) Summary: Optimize divisons by powers of two. Initial Comment: Please optimize divisons by powers of two. The following two simple functions now generate calls to the internal division functions, while they could be easily implemented with bit shifts: C code: int divtesti(int a) { return(a / 8); } char divtestc(char a) { return(a / 8); } Resulting Z80 asm: ;test.c:8: int divtesti(int a) ; genLabel ; genFunction ; --------------------------------- ; Function divtesti ; --------------------------------- _divtesti_start:: _divtesti: push ix ld ix,#0 add ix,sp ;test.c:10: return(a / 8); ; genIpush ; _saveRegsForCall: sendSetSize: 0 deInUse: 0 bcInUse: 0 deSending: 0 ld hl,#0x0008 push hl ; genIpush ; AOP_STK for ld l,4(ix) ld h,5(ix) push hl ; genCall call __divsint_rrx_s ld b,h ld c,l pop af pop af ; genRet ; Dump of IC_LEFT: type AOP_REG size 2 ; reg = bc ld l,c ld h,b ; genLabel 00101$: ; genEndFunction pop ix ret _divtesti_end:: _BILD: .dw #0x1800 ;test.c:13: char divtestc(char a) ; genLabel ; genFunction ; --------------------------------- ; Function divtestc ; --------------------------------- _divtestc_start:: _divtestc: push ix ld ix,#0 add ix,sp ;test.c:15: return(a / 8); ; genIpush ; _saveRegsForCall: sendSetSize: 0 deInUse: 0 bcInUse: 0 deSending: 0 ld a,#0x08 push af inc sp ; genIpush ; AOP_STK for ld a,4(ix) push af inc sp ; genCall call __divschar_rrx_s ld c,l pop af ; genRet ; Dump of IC_LEFT: type AOP_REG size 1 ; reg = c ld l,c ; genLabel 00101$: ; genEndFunction pop ix ret _divtestc_end:: ---------------------------------------------------------------------- >Comment By: Philipp Klaus Krause (spth) Date: 2011-08-04 12:35 Message: The correct wayx to implement this would be to transform y = x / 2^k; into t = x; if(t < 0) t += 2 ^ k - 1; y = t >> k; The simpler y = x >> k; is wrong, since it rounds towards minus infinity instead of towards zero. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=350599&aid=1307995&group_id=599 |