Нашел ошибку в компиляторе IAR EWARM V6.50 Оптимизатор глючит с 64-битной арифметикой.
Проверьте пожалуйста на более свежих версиях - осталась ли ошибка. Если да, то прошу многоуважаемую Ксению послать шведам багрепорт.
Исходный код:
void outll(unsigned long long val);
void IARBug(void)
{
unsigned long long n;
unsigned long long step;
step = 0x111111111111LL;
outll(step);
for (n = 0; n < 16; n++)
outll(step * n + 0x123456789ABCDLL);
}
Компилируем с максимальной оптимизацией, для Кортекс-М4 без FPU.
Листинг:
###############################################################################
# #
# IAR ANSI C/C++ Compiler V6.50.2.4510/W32 for ARM 13/Dec/2017 09:58:09 #
# Copyright 1999-2012 IAR Systems AB. #
# #
# Cpu mode = thumb #
# Endian = little #
# --debug --endian=little --cpu=Cortex-M4 -e --fpu=None #
# -lCN -Oh #
[other info skipped]
1 void outll(unsigned long long val);
\ In section .text, align 2, keep-with-next
2 void IARBug(void)
3 {
\ IARBug:
\ 00000000 0xB5F8 PUSH {R3-R7,LR}
4 unsigned long long n;
5 unsigned long long step;
6
7 step = 0x111111111111LL;
8 outll(step);
\ 00000002 0xF04F 0x3011 MOV R0,#+286331153
\ 00000006 0xF241 0x1111 MOVW R1,#+4369
\ 0000000A 0x.... 0x.... BL outll
9 for (n = 0; n < 16; n++)
\ 0000000E 0x.... 0x.... LDR.W R6,??DataTable57 ;; 0x6789abcd
\ 00000012 0x.... 0x.... LDR.W R7,??DataTable57_1 ;; 0x12345
\ 00000016 0x2410 MOVS R4,#+16
\ 00000018 0x2500 MOVS R5,#+0
10 outll(step * n + 0x123456789ABCDLL);
\ ??IARBug_0:
\ 0000001A 0x4630 MOV R0,R6
\ 0000001C 0x4639 MOV R1,R7
\ 0000001E 0x.... 0x.... BL outll
\ 00000022 0xF116 0x3611 ADDS R6,R6,#+286331153
\ 00000026 0xF147 0x0700 ADC R7,R7,#+0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>!!!! Must be #+4369 !!!
\ 0000002A 0x1E64 SUBS R4,R4,#+1
\ 0000002C 0xF175 0x0500 SBCS R5,R5,#+0
\ 00000030 0xD1F3 BNE.N ??IARBug_0
\ 00000032 0x2C00 CMP R4,#+0
\ 00000034 0xD1F1 BNE.N ??IARBug_0
11 }
\ 00000036 0xBDF1 POP {R0,R4-R7,PC} ;; return