Решение:
сбрасываю все 4 бита ACOVx в регистре CT0_55 (адрес 0x0002)
Код
*(int *0x0002)=*(int *0x0002)&39FF;
вычисляю
Код
long a,b,c;
int d;
a= 0x70000000;
b= 0x70000000;
c = _lsadd(a,b); // (сложение с насыщением)
int d;
a= 0x70000000;
b= 0x70000000;
c = _lsadd(a,b); // (сложение с насыщением)
проверяю
Код
d=*(int *0x0002)|0xC600;
Оптимизация -o3. Компилер оптимизирует так что второго чтения регистра нет (выдержки кода):
Код
MOV *AR3, AR1; считал
AND #0x39ff, AR1, AR1; изменил
MOV AR1, *AR3; записал
ADD dbl(*SP(#0)), AC0, AC0; выполнил сложение с насыщением
MOV #-14848, AR2; есть 0xC600
AND AR1, AR2; - вот тут оптимизатор решил сэкономить на обращении к памяти, взял ;припасенный результат
MOV AR2, *SP(#6); спокойно положил в переменную d ложный результат
AND #0x39ff, AR1, AR1; изменил
MOV AR1, *AR3; записал
ADD dbl(*SP(#0)), AC0, AC0; выполнил сложение с насыщением
MOV #-14848, AR2; есть 0xC600
AND AR1, AR2; - вот тут оптимизатор решил сэкономить на обращении к памяти, взял ;припасенный результат
MOV AR2, *SP(#6); спокойно положил в переменную d ложный результат
Как написать верный С-код в этом случае?