From: SourceForge.net <no...@so...> - 2008-02-24 18:28:51
|
Bugs item #1900961, was opened at 2008-02-24 19:28 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&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: z80 port Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Philipp Krause (spth) Assigned to: Nobody/Anonymous (nobody) Summary: int8_t x uint8_t multiplication broken Initial Comment: Multiplication of int8_t by uint8_t (and vice vers) is broken on Z80. To see the bug remove the first #ifndef SDCC_z80 in the regression test support/regression/tests/onebyte.c sdcc generates a call to the multiplication function for int8_t x int8_t, so the unsigned number is treated as a signed number which gives wrong results if it's greater than 127. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&group_id=599 |
From: SourceForge.net <no...@so...> - 2008-07-12 18:35:57
|
Bugs item #1900961, was opened at 2008-02-24 19:28 Message generated for change (Comment added) made by spth You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&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: Icode generator Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Philipp Krause (spth) Assigned to: Nobody/Anonymous (nobody) Summary: int8_t x uint8_t multiplication broken Initial Comment: Multiplication of int8_t by uint8_t (and vice vers) is broken on Z80. To see the bug remove the first #ifndef SDCC_z80 in the regression test support/regression/tests/onebyte.c sdcc generates a call to the multiplication function for int8_t x int8_t, so the unsigned number is treated as a signed number which gives wrong results if it's greater than 127. Philipp ---------------------------------------------------------------------- >Comment By: Philipp Krause (spth) Date: 2008-07-12 20:35 Message: Logged In: YES user_id=564030 Originator: YES While Inoticed this problem in the Z80 port it probably affects all ports that use support functions for 8-bit multiplication: There are just two multiplication support functions: One for signed, one for unsigned multiplication. The one for signed multiplication is used for mixed multiplications, too, which gives wrong results. I suggest the following fix: Promote operands of mixed char multiplications to int, do an int multiplication. This is slower, but gives the correct result and I expect mixed char multiplications through support functions to be rare anyway. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&group_id=599 |
From: SourceForge.net <no...@so...> - 2008-07-13 08:26:54
|
Bugs item #1900961, was opened at 2008-02-24 19:28 Message generated for change (Comment added) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&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: Icode generator Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Philipp Krause (spth) Assigned to: Nobody/Anonymous (nobody) Summary: int8_t x uint8_t multiplication broken Initial Comment: Multiplication of int8_t by uint8_t (and vice vers) is broken on Z80. To see the bug remove the first #ifndef SDCC_z80 in the regression test support/regression/tests/onebyte.c sdcc generates a call to the multiplication function for int8_t x int8_t, so the unsigned number is treated as a signed number which gives wrong results if it's greater than 127. Philipp ---------------------------------------------------------------------- >Comment By: Maarten Brock (maartenbrock) Date: 2008-07-13 10:26 Message: Logged In: YES user_id=888171 Originator: NO Using either the signed or unsigned 8 bit multiplication for mixed operands can only give the wrong result if the result is 16 bits. If the result is only 8 bits it doesn't matter. See also genMultOneByte() in mcs51/gen.c. Maarten ---------------------------------------------------------------------- Comment By: Philipp Krause (spth) Date: 2008-07-12 20:35 Message: Logged In: YES user_id=564030 Originator: YES While Inoticed this problem in the Z80 port it probably affects all ports that use support functions for 8-bit multiplication: There are just two multiplication support functions: One for signed, one for unsigned multiplication. The one for signed multiplication is used for mixed multiplications, too, which gives wrong results. I suggest the following fix: Promote operands of mixed char multiplications to int, do an int multiplication. This is slower, but gives the correct result and I expect mixed char multiplications through support functions to be rare anyway. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&group_id=599 |
From: SourceForge.net <no...@so...> - 2008-09-15 11:48:52
|
Bugs item #1900961, was opened at 2008-02-24 19:28 Message generated for change (Settings changed) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&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: Icode generator Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Philipp Krause (spth) >Assigned to: Maarten Brock (maartenbrock) Summary: int8_t x uint8_t multiplication broken Initial Comment: Multiplication of int8_t by uint8_t (and vice vers) is broken on Z80. To see the bug remove the first #ifndef SDCC_z80 in the regression test support/regression/tests/onebyte.c sdcc generates a call to the multiplication function for int8_t x int8_t, so the unsigned number is treated as a signed number which gives wrong results if it's greater than 127. Philipp ---------------------------------------------------------------------- Comment By: Maarten Brock (maartenbrock) Date: 2008-07-13 10:26 Message: Logged In: YES user_id=888171 Originator: NO Using either the signed or unsigned 8 bit multiplication for mixed operands can only give the wrong result if the result is 16 bits. If the result is only 8 bits it doesn't matter. See also genMultOneByte() in mcs51/gen.c. Maarten ---------------------------------------------------------------------- Comment By: Philipp Krause (spth) Date: 2008-07-12 20:35 Message: Logged In: YES user_id=564030 Originator: YES While Inoticed this problem in the Z80 port it probably affects all ports that use support functions for 8-bit multiplication: There are just two multiplication support functions: One for signed, one for unsigned multiplication. The one for signed multiplication is used for mixed multiplications, too, which gives wrong results. I suggest the following fix: Promote operands of mixed char multiplications to int, do an int multiplication. This is slower, but gives the correct result and I expect mixed char multiplications through support functions to be rare anyway. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&group_id=599 |
From: SourceForge.net <no...@so...> - 2008-09-16 12:35:46
|
Bugs item #1900961, was opened at 2008-02-24 19:28 Message generated for change (Comment added) made by maartenbrock You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&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: Icode generator >Group: fixed >Status: Closed >Resolution: Fixed Priority: 5 Private: No Submitted By: Philipp Krause (spth) Assigned to: Maarten Brock (maartenbrock) Summary: int8_t x uint8_t multiplication broken Initial Comment: Multiplication of int8_t by uint8_t (and vice vers) is broken on Z80. To see the bug remove the first #ifndef SDCC_z80 in the regression test support/regression/tests/onebyte.c sdcc generates a call to the multiplication function for int8_t x int8_t, so the unsigned number is treated as a signed number which gives wrong results if it's greater than 127. Philipp ---------------------------------------------------------------------- >Comment By: Maarten Brock (maartenbrock) Date: 2008-09-16 21:35 Message: Fixed in SDCC 2.8.4 #5241. ---------------------------------------------------------------------- Comment By: Maarten Brock (maartenbrock) Date: 2008-07-13 10:26 Message: Logged In: YES user_id=888171 Originator: NO Using either the signed or unsigned 8 bit multiplication for mixed operands can only give the wrong result if the result is 16 bits. If the result is only 8 bits it doesn't matter. See also genMultOneByte() in mcs51/gen.c. Maarten ---------------------------------------------------------------------- Comment By: Philipp Krause (spth) Date: 2008-07-12 20:35 Message: Logged In: YES user_id=564030 Originator: YES While Inoticed this problem in the Z80 port it probably affects all ports that use support functions for 8-bit multiplication: There are just two multiplication support functions: One for signed, one for unsigned multiplication. The one for signed multiplication is used for mixed multiplications, too, which gives wrong results. I suggest the following fix: Promote operands of mixed char multiplications to int, do an int multiplication. This is slower, but gives the correct result and I expect mixed char multiplications through support functions to be rare anyway. Philipp ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1900961&group_id=599 |