Come fa il compilatore LLVM a trattare le operazioni aritmetiche tra parentesi?

0

Quando vede le parentesi, fa in modo che la macchina esegua le operazioni tra parentesi o distribuisca le parentesi?

Ad esempio, se ho la seguente riga di codice:

int i = 2 * (a + b)

si compila come questo codice:

int c = a + b
int i = 2 * c
    
posta moonman239 15.09.2015 - 19:56
fonte

2 risposte

3

Funziona "come-se" l'aggiunta viene eseguita per prima, seguita dalla moltiplicazione. Sotto la regola as-if, è possibile utilizzare qualsiasi numero di istruzioni della macchina che producono il risultato corretto, ed è quasi certo che un'istruzione di moltiplicazione non verrà utilizzata da alcun compilatore di ottimizzazione.

    
risposta data 15.09.2015 - 20:04
fonte
1

Una probabile sequenza di istruzioni della macchina per una CPU RISC regolare e ortogonale a 3 indirizzi sarebbe simile a questa:

LOAD_MEMORY &a -> register01
LOAD_MEMORY &b -> register02
INT_ADD register01, register02 -> register01
LOAD_CONSTANT 1 -> register02
BIT_SHIFT register01, register02 -> register01
STORE_MEMORY &i, register01

Inoltre, se a è una variabile locale e il compilatore può dimostrare che non sarà accessibile dopo questo, potrebbe mettere i e a allo stesso indirizzo di memoria.

Per una CPU CISC con un set di istruzioni irregolari più complesso, potrebbero esserci istruzioni di spostamento che funzionano sulla memoria, prendono costanti e aggiungono istruzioni che funzionano sulla memoria, quindi assomigliano a questo:

INT_ADD_MEM &a, &b -> &i
BIT_SHIFT_MEM_CONSTANT &i, 1 -> &i

Ancora, a e i potrebbero avere lo stesso indirizzo, se a è locale e inutilizzato in seguito.

    
risposta data 15.09.2015 - 21:41
fonte

Leggi altre domande sui tag