From: SourceForge.net <no...@so...> - 2007-07-11 14:43:46
|
Bugs item #1745717, was opened at 2007-06-30 15:10 Message generated for change (Comment added) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1745717&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: C-Front End >Group: fixed >Status: Closed >Resolution: Accepted Priority: 5 Private: No Submitted By: Nobody/Anonymous (nobody) >Assigned to: Maarten Brock (maartenbrock) Summary: bit returned in dpl #2 Initial Comment: the following tiny piece of C generates incorrect code with sdcc -v version SDCC : mcs51 2.7.2 # (Jun 28 2007) (UNIX) svn #4870 bit foo(char arg) { return arg & 1; } the generated code looks like 0000 E5 82 108 mov a,dpl 0002 54 01 109 anl a,#0x01 0004 F5 82 110 mov dpl,a 0006 22 111 ret thus, the function returns a char in dpl, instead of a bit. greetings, Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- >Comment By: Maarten Brock (maartenbrock) Date: 2007-07-11 16:43 Message: Logged In: YES user_id=888171 Originator: NO Thanks, this indeed fixes both bugs. Applied in SDCC 2.7.2 #4879. ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2007-07-04 22:56 Message: Logged In: NO the problem seems to have its root in geniCodeCast() where a call to compareType() returns 1 (that is match) though the destination has type bit and the operand has type char. looking at compareType() i'd propose (in unbelivable naivity) something like --- SDCCsymt.c.orig 2007-06-28 11:16:45.000000000 +0200 +++ SDCCsymt.c 2007-07-04 21:26:28.000000000 +0200 @@ -2130,19 +2130,20 @@ if (SPEC_NOUN (dest) != SPEC_NOUN (src)) { if (SPEC_USIGN (dest) == SPEC_USIGN (src) && IS_INTEGRAL (dest) && IS_INTEGRAL (src) && /* I would prefer bitsForType (dest) == bitsForType (src)) instead of the next two lines, but the regression tests fail with them; I guess it's a problem with replaceCheaperOp */ getSize (dest) == getSize (src) && - !(!IS_BIT (dest) && IS_BIT (src))) + (IS_BIT (dest) == IS_BIT (src))) + // !(!IS_BIT (dest) && IS_BIT (src))) return 1; else if (IS_ARITHMETIC (dest) && IS_ARITHMETIC (src)) return -1; else return 0; } else if (IS_STRUCT (dest)) { if (SPEC_STRUCT (dest) != SPEC_STRUCT (src)) at least for the simple test function bit foo(char arg) { return arg & 1; } this seems to do the job. perhaps somebody is so kind and tries to run the regression tests ? i wasn't able to do myself. Robert Larice larice 0x40 vidisys 0x2e de ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1745717&group_id=599 |