[cc65] Bug(s) with -O/--static-locals?

From: Marc 'BlackJack' Rintsch <marc1rintsch.de>
Date: 2010-11-02 01:14:28
Hi,

Compiler is build from cc65-snapshot-2.13.9.20101031 sources.

The source file in question:

----
#include <stdio.h>
#include <stdint.h>

// uint16_t __fastcall__ calculate_checksum(uint8_t *block);
uint8_t block[256];

uint16_t calculate_checksum(uint8_t *block)
{
    uint16_t i, result = 0xffff;
    uint8_t j;
    
    for (i = 0; i < 256; ++i) {
        result ^= block[i] << 8;
        for (j = 0; j < 8; ++j) {
            if (result & (1 << 15)) {
                result = (result << 1) ^ 0x1021;
            } else {
                result <<= 1;
            }
        }
    }
    return ~result;
}

int main(void)
{
    uint16_t i;
    
    printf("zeroes: %u\n", calculate_checksum(block));
    for (i = 0; i < 256; ++i) block[i] = i;
    printf("0..255: %u\n", calculate_checksum(block));
    return 0;
}
----

Expected results and also what I get from this without any optimisations 
are: 48663 and 49218

When I turn on ``-O``: 58096 and 58096.  After swapping the two variable 
declaration lines in `calculate_checksum()` the results are correct 
with ``-O``.

But with ``--O --static-locals`` the results are incorrect again (31757 
and 15408).  ``--static-locals`` alone works though.

Ciao,
	Marc 'BlackJack' Rintsch
-- 
“Much human ingenuity has gone into finding the ultimate Before.
 The current state of knowledge can be summarized thus:
 In the beginning, there was nothing, which exploded.”
                            -- Terry Pratchett, Lords and Ladies

----------------------------------------------------------------------
To unsubscribe from the list send mail to majordomo@musoftware.de with
the string "unsubscribe cc65" in the body(!) of the mail.
Received on Tue Nov 2 00:59:52 2010

This archive was generated by hypermail 2.1.8 : 2010-11-02 00:59:56 CET