Newsgroup: it.comp.lang.c
Titolo: calcolo quadrato in c-assembly

salve,
considerate un microcontrollore ad 8 bit che sappia eseguire somme,
sottrazioni,
moltiplicazioni solo con gli ingressi ad 1 byte.
Ora io chiedo: quante operazioni aritmetiche monobyte esegue il
compilatore C per calcolare il
quadrato di una variabile a 16 bit?
(ciò mi serve per valutare la efficienza di un algoritmo).
Partiamo dal presupposto che il tipo intero occupa 16 bit.
Per eseguire il prodotto: quadrato32=fattore16*fattore16, la
promozione intera in sè non basta, e quindi non è corretto impiegare
la istruzione C:
quadrato32=fattore16*fattore16;
Serve invece impiegare la istruzione corretta:
quadrato32=(uint32_t)fattore16*fattore16;
Ora però io non so come il compilatore converta in assembly la
istruzione corretta.
Sia:
fattore16=(C:D)
Nell'eseguire il cast, si aggiungono 2 byte di zeri che precedano
(visto che si impiega il Big
Endian nel  microcontrollore) i 2 byte del 1° operando: fattore16.
Così ottengo il 1° fattore a 4 byte: A,B,C,D con A=B=0.
Ora io chiedo: anche il 2° operando del prodotto viene convertito a 32
bit (aggiungendo gli zeri),
oppure esso rimane a 16 bit?
Poi viene eseguita la moltiplicazione fra i due fattori convertiti.
In teoria, sapendo come siano stati ricavati i due fattori a 4 byte, a
partire dalle variabili
di partenza a 2 byte, si sa già a priori che basta eseguire solo la
moltiplicazione 2*2 :
(C:D) * (C:D).
Ma il compilatore C dei microntrollori in genere lo capisce da solo
che basta eseguire la
moltiplicazione 2*2?
Oppure esso è talmente inefficiente da eseguire la moltiplicazione
4*4, e cioè: sia A*A che A*B
che A*C che A*D, ecc , nonostante esso sappia già che eseguire A*C o
A*D fa zero, e quando verrà
sommato agli altri prodotti, darà il contributo = 0?
In genere i microntrollori ad 8 bit più diffusi come si comportano in
questo caso?
Cioè nei miei conteggi teorici del n° operazione aritmetiche monobyte
richieste,
considero che alla istruzione:
quadrato32=(uint32_t)fattore16*fattore16;
corrisponda, in assembly, secondo il compilatore C dei
microcontrollori più diffusi
(scelga fra le opzioni a, b, c):
a)la moltiplicazione 4*4 (entrambi i fattori vengono promossi a 32
bit)
b)la moltiplicazione 4*2 (solo il 1° fattore viene promosso a 32 bit)
c)la moltiplicazione 2*2 (è come se non avvenga alcun cast, che è
presente solo per ragioni
  "formali" nella istruzione C)
?
Un'altra considerazione riguarda il fatto che si debba calcolare una
moltiplicazione speciale:
il quadrato.
La domanda è: il compilatore C dei microcontrollori di solito impiega
due conversioni in assembly distinte, quando
calcola:
a)var32=var16*var16 (i due fattori coincidono)
b)var32=varA16*varB16 (i due fattori non coincidono)
?
Infatti nel caso "a" è possibile impiegare un algoritmo più
efficiente.
Infatti nel calcolo di (f1:f2)*(g1*g2) serve eseguire questi prodotti
monobyte:
nel caso a: f1*g1, f1*g2, f2*g1, f2*g2
nel caso b: f1*g1, f1*g2, f2*g2
(f2*g1 è già noto perchè coincide con f1*g2 e non serve ricalcolarlo)
Anche per le somme c'è un risparmio nel caso "b", perchè serve sommare
meno prodotti parziali fra
di loro (queste somme vengono sostituite da delle moltiplicazioni per
2 dei prodotti duplici, e
questi "shift binari" costano meno delle somme sia perchè opertori
unari anzichè binari, e sia
perchè hanno un tempo di esecuzione inferiore alle somme).
Quale metodo impiega di solito il compilatore C dei microcontrollori
nel caso del calcolo del
quadrato? Il metodo "a" o il metodo "b"?
grazie,
adriano

 istruzione corretta.
[CUT]
Questo genere di moltiplicazioni normalmente sono eseguite tramite
delle funzioni di libreria ottimizzate (scritte in assembler),
normalmente fornite insieme al compilatore.
Per vedere come il compilatore converte le istruzioni il modo piu'
semplice e' compilare il programma facendo creare il file assembler al
compilatore (guarda le opzioni del compilatore).
In ogni caso e' difficile risponderti se non si sa' di che
microcontrollore e di che compilatore stai parlando (ce ne sono
diversi).
Ciao Jack

diversi).
io pensavo impiegassero una metodologia comune standardizzata.
Evidentemente mi sbagliavo.
Tutto qua.
adriano