• Nenhum resultado encontrado

4.2 Seleção de instruções

4.2.4 Seleção de instruções no DAG

Nesta fase os nodos do DAG serão então transformados em instruções específicas do M2up. O gerador de código precisa por isso de informações detalhadas sobre o conjunto de instruções da máquina alvo. A descrição do conjunto de instruções é feita recorrendo a dois ficheiros de descrição Tablegen, o M2upInstrFormats.td no qual é descrito o formato das instruções e o M2upInstrInfo.td que contém a descrição concreta das diversas instruções.

4.2.4.1 Ficheiro de descrição do formato das Instruções

A partir da classe Instruction (Figura 2.6) é definida uma classe M2upInst para definir as instruções do M2up (Figura 4.9).

Figura 4.9- Definição da Classe M2upInst a partir da classe genérica Instruction fornecida pela framework

Como pode ser observado na figura o opcode é definido como sendo os 5 bits mais significativos das instruções do M2up. A partir desta classe foi implementada uma classe para cada formato de instrução diferente. Por exemplo, para as instruções aritméticas e lógicas foi implementada a classe ArithLogic (Figura 4.10).

Figura 4.10- Classe ArithLogic implementada a partir da classe M2upInst. Contêm a informação sobre o formato das instruções aritméticas e lógicas

Define-se assim quantos operandos têm as instruções, qual o tamanho dos diversos operandos e a sua localização no formato da instrução, por exemplo nas instruções

aritméticas e lógicas o operando de saída é o rd que tem 3 bits e se encontra entre o bit 8 e 10.

4.2.4.2 Ficheiro de descrição do conjunto de Instruções

O ficheiro M2upInstrInfo.td descreve as instruções do M2up detalhadamente. Este ficheiro parte das informações recolhidas do ficheiro de formatos descrito anteriormente. Para explicar como se processa a descrição de uma instrução recorreu~se ao exemplo da instrução ANDI. A instrução ANDI realiza um AND lógico entre um registo e um imediato de 4 bits guardando o resultado num registo.

Figura 4.11-Formato da instrução ANDI

A Figura 4.11 mostra o formato da instrução ANDI. Para definirmos esta instrução temos primeiro de definir os seus operandos. Rd e Rx são registos e por isso estão definidos nos ficheiros de descrição de registos. Para o imediato de 4 bits foi definido o operando simm4 (Figura 4.12).

Figura 4.12-Definição do operando simm4

Após a definição dos operandos pode ser definida a instrução. Para facilitar a codificação e reduzir a repetição no código o TableGen permite agrupar as instruções em classes e multiclasses. Para as operações aritméticas e lógicas foi definida uma multiclasse com duas classes (Figura 4.13). A primeira para definir as instruções que não utilizam imediatos e a segunda as que utilizam imediatos. Esta multiclasse tem como argumentos o opcode, a string com o nome da instrução, o OpNode que é o

pattern da instrução que terá de ser igualado para que a instrução seja selecionada e o

último argumento é o tipo de itinerário da instrução para ser utilizado no escalonamento das instruções.

Figura 4.13-Definição da multiclasse ArithandLogic

A instrução ADDI pertence á classe que utiliza o formato ArithLogicI definido no ficheiro de formatos das instruções. Como podemos observar na figura 4.12 a saída das instruções desta classe é um registo e as entradas um registo e um imediato. É também definido como se deve formar a string que será enviada para o assembly printer. Entre parênteses retos define-se a operação da instrução, no caso das operações aritméticas e lógicas faz-se um set ao registo de saída rd com o valor do resultado da operação definida no Opnode entre um registo rx e um imediato de 4 bits imm4.

Para definir agora a instrução ADDI é necessário então indicar opcode, o nome da instrução, o OpNode e o tipo de itinerário:

Como o ANDI está definido numa multiclasse utiliza-se a diretiva defm permitindo assim definir logo a instrução AND e ANDI.

Este processo de descrição é repetido para as restantes instruções do M2up.

4.2.4.3 Pattern Matching

Após a definição do conjunto de instruções pode então ser efetuado o matching entre os nodos do DAG e os patterns definidos para cada uma das instruções.

O processo de pattern matching segue os seguintes passos:

1. A Framework de geração de código chama o método genérico SelectionDAGISel::DoInstructionSelection responsável por chamar o selecionador de instruções para o target que se pretende utilizar. O método M2upDagToDagIsel::Select é então chamado pelo método anterior para analisar e efetuar a seleção de instrução para cada nodo do DAG.

2. O método M2upDagToDagIsel::Select não efetua no caso do M2up nenhum matching manual chamando então o método

M2upDagToDagIsel::SelectCode que será responsável por todo o processo de seleção.

3. O método M2upDagToDagIsel::SelectCode é gerado a partir dos ficheiros de descrição e contêm a tabela de correspondência.

O método SelectCode (Figura 4.14) gerado automaticamente pelo TableGen a partir dos ficheiros de descrição é um enorme switch case que vai testando para cada nodo qual a sua correspondência. Para cada um dos nodos pode existir um leque de instruções possíveis sendo por isso necessário testar cada uma delas por ordem até se encontrar a correspondência correta. No caso de existir mais do que uma correspondência correta será substituído pelo primeiro que for encontrado.

Figura 4.14- Método SelectCode gerado automaticamente a partir dos ficheiros de descrição

Para o código LLVM IR da figura 4.5 o processo de pattern matching é o seguinte:

Figura 4.15- Seleção de Instruções para o bloco entry do código LLVM IR da figura 4.5

Na seleção de instruções da Figura 4.15 a correspondência é sempre feita à primeira pois os nodos deste bloco apresentam apenas uma correspondência possível. Os índices da figura referem-se aos índices que aparecem a comentário no SelectCode.

Na Figura 4.16 podemos observar que o índice do nodo M2upISD::CMPPSW é o 591 e que o único nodo correspondente é o M2up::SUBCCi.

Figura 4.16- Método SelectCode no caso do nodo ser o M2upISD::CMPPSW

Após o processo de seleção de instruções o DAG legalizado da Figura 4.8 é transformado no DAG apresentado na Figura 4.17.

Figura 4.17- SelectionDag após a fase de seleção de isntruções.

Documentos relacionados