Hi,
ich bastle gerade ein Subtraktionsmakro bei dem ich unschlüssig bin, ob
der Output-OP res das =& braucht oder nur =. Der erzeugte Code ist mit
oder ohne & identisch. Ich denke es braucht kein &, da der eraly clobber
ja schon geschrieben wird, bevor die letzte Verwendung als input
erfolgt. Was denkt ihr ?
#define sub_u16u16_u16sat(op1_16, op2_16) \
({ \
uint16_t res = op1_16; \
\
_asm_ __volatile__( \
"sub %A0,%A2" CR_TAB \
"sbc %B0,%B2" CR_TAB \
"brcc _1_%=" CR_TAB \
"clr %A0" CR_TAB \
"clr %B0" CR_TAB \
"_1_%=:" CR_TAB \
: /* outputs */ \
"=&r" (res) \
: /* inputs */ \
"0" (res), \
"r" ((uint16_t)(op2_16)) \
); \
res; \
})
inlineasm schrieb:> ich hätt's ja gern als Makro
Und weshalb?
Ausserdem ist auch hier das "volatile" nicht sinnvoll. Es sei denn du
willst mit Gewalt auch dann an exakt dieser Stelle subtrahieren, wenn
der Compiler merkt, dass das Ergebnis nicht benötigt wird oder an
anderer Stelle billiger ist.
ist schon ein grosses altes Projekt, wo alles als Makro's erledigt ist
und ich ein wenig aufräumen soll. Noch eine Frage: Ist nicht bei
folgendem Makro ein memory clobber sinnvoll und nötig ?
#define ATOMIC_RESTORE_MEM_SET16(d, s) \
({ \
_asm_ __volatile__( \
"in _tmp_reg_,__SREG__" CR_TAB \
"cli" CR_TAB \
"sts %A0,%A1" CR_TAB \
"out _SREG_,__tmp_reg__" CR_TAB \
"sts %B0,%B1" CR_TAB \
: /* outputs */ \
: /* inputs */ \
"m" ((uint16_t)(d)), \
"r" ((uint16_t)(s)) \
); \
})
Gruss und Danke
Hallo nochmal,
ich habe jetzt mal alle Makro's doch zu Funktionen gemacht. Klappt auch
alles soweit wie gewollt. Ich habe jetzt nur noch eine Frage/ein Problem
bei folgender Funktion zur Division:
Anfänglich wurde mir natürlich immer op1_32 zerschossen. Das konnte ich
dann mit "+r" verhindern. Soweit geht das jetzt auch. Ich bin allerdings
noch unschlüssig, ob das der korrekte Weg ist ...
Gruss und Danke
Klaro, op1_32 wird ja verändert.
Wenn der Compiler das nicht mitbekommt — wie auch sonst? — kann er den
vermeintlich alten Wert weiter verwenden.
Was soll die Funktion eigentlich tun?
Wenn ein 32-Bit Wert durch 16 Bits geteilt wird, ist doch nicht a priori
klar, daß das Ergebnis in 16 Bits passt?
Selbstredend, aber bei genauer Kenntnis der Einangswertebereiche
(Funktion wird entsprechend natürlich nur für solche Zahlenbereiche
verwendet) ist diese Fkt. halt doppelt so schnell, wie die volle 32Bit
Division mit 33Shift's. Es gibt fast für alle Wertebereiche und
Operandentypen gesonderte Funktionen, da es in dem Projekt extrem auf
Rechenzeit ankommt ...
Gruss und Danke
Hallo,
nochmal eine Frage. Ich finde irgendwie keine Lösung. Wie bekomme ich
denn das Zweierkomplement einer RAM-Adresse in so ein Assembler-Makro.
Ich brauche diesen Wert (lo8 und hi8) für die Offsetbrechnung mittels
Z-Pointer und subi, sbci in einem Array ???
Gruss und Danke schon mal für die evtl. Hilfe
ja klar, aber ich suche ja passende/ensprechende Constraint-Notation für
ein inline Assemblerstückchen. Der Compiler kann ja das Label direkt in
den Code einsetzen, was er natürlich auch tut ...