Da hab ich direkt mal ein paar Fragen zu deinen Konstrukten
--1--
Code:
(op1 == op2 == 0x80)
Ist gleichbedeutend mit
Code:
(op1 == (op2 == 0x80))
und nicht mit
Code:
(op1 == 0x80 && op2 == 0x80)
oder
Code:
(op1 == 0x80 || op2 == 0x80)
Ist das gewollt?
Zitat von
GCC
fixedPointArithmetics.c:88: warning: comparisons like X<=Y<=Z do not have their mathematical meaning
--2--
Die Constraints
Code:
: "=r" (result), "=r" (op1)
: "0" (op1), "r" (op2)
und das damit verbundene Aliasing wirken recht abenteuerlich
Auf jeden Fall muss die Constraint mindestens "d" heissen, wenn auf ein Operanden LDI angewendt wird, und nicht "r". Dies könnte ansonsten zu einem Fehler im Asembler führen (immerhin kein Laufzeitfehler ) weil nicht alle GPR für LDI zulässig sind:
Code:
uint8_t fsub8(uint8_t op1, uint8_t op2)
{
uint8_t result;
// clipping:
// C=1 & V=1 -> pos overflow, result = 0x7f
// C=0 & V=1 -> neg overflow, result = 0x80
asm volatile (
"sub %[result], %[op2]" "\n\t"
"brvc 0f" "\n\t" // no overflow -> done
"ldi %[result], 0x81" "\n\t" // overflow -> set min neg value (might still be positive overflow)
"brcc 0f" "\n\t" // no carry (thus no positive overflow) -> done
"ldi %[result], 0x7f" "\n\t" // positive overflow -> set max pos value
"0:"
: [result] "=d" (result), "=d" (op1)
: "0" (op1), [op2] "r" (op2)
);
return result;
}
Bei die kommt der Fehler nicht zum tragen, weil nie geinlint wird (siehe -4-).
--3--
Wo wird %A0 in fadd816/fsub816 belegt?
--4--
Wozu extern inline? Sehe ich jetzt keinen Nutzen... Innerhalb des Moduls wird keine deiner Funktionen aufgerufen; geinlint wird also nie werden.
Lesezeichen