Hello,
There appears to be some inconsistent behaviour with an unsigned 16-bit integer on underflow with optimisation levels 2 and 3.
I am compiling the following code in CCS v6.1.3 for Generic C64xx with compiler version 7.1.16 (problem also occurs with 6.1.21). Compiler flags: -mv6400 --abi=coffabi -O2 -g --include_path="/home/user1/ti/ccsv6/tools/compiler/c6000_7.4.16/include" --display_error_number --diag_warning=225
#include <stdio.h>
#include <stdint.h>
uint16_t var1;
uint16_t var2;
uint16_t msb_ext;
uint16_t set_high_if_msb_not_zero;
void check_underflow()
{
var2 = var2 - 0x0002; // expect this to give 0xFFFF due to wrapping
uint16_t msb = (var2 ^ var1) & 0x8000; // expect this to give 0x0000
msb_ext = msb;
if (msb != 0)
{
set_high_if_msb_not_zero = 1;
var2 = var2 + 1;
}
}
int main()
{
msb_ext = 1;
set_high_if_msb_not_zero = 0;
var1 = 0x8000;
var2 = 0x0001;
check_underflow();
printf("msb_ext: %u\n", msb_ext);
printf("set_high_if_msb_not_zero: %u\n", set_high_if_msb_not_zero);
}
The console output is:
msb_ext: 0
set_high_if_msb_not_zero: 1
Examining the assembly, it appears that the value of msb used to write to msb_ext has the upper 16 bits zeroed (using EXTU) while the value used in the conditional has not. I know that behaviour of signed integers on overflow is undefined in the C99 standard but I thought that behaviour of unsigned integers was.
Thanks,
Bruce