P11.1 Izbor instrukcija, najveci zalogaj

Слични документи
P11.3 Analiza zivotnog veka, Graf smetnji

P9.1 Dodela resursa, Bojenje grafa

P11.2 Izbor instrukcija, IBURG

P1.2 Projektovanje asemblera

P1.3 Projektovanje makroasemblera

OPIS RAČUNARSKOG SISTEMA Računarski sistem se sastoji od procesora, operativne memorije, tajmera i terminala. Sve komponente računarskog sistema su me

Logicko projektovanje racunarskih sistema I

Tutoring System for Distance Learning of Java Programming Language

Tutoring System for Distance Learning of Java Programming Language

PROMENLJIVE, TIPOVI PROMENLJIVIH

P2.1 Projektovanje paralelnih algoritama 1

Zbirka resenih zadataka iz arhitekture racunara

Microsoft PowerPoint - 07-DinamickeStrukturePodataka

Рачунарска интелигенција

Funkcije predavač: Nadežda Jakšić

Microsoft Word - AIDA2kolokvijumRsmerResenja.doc

Algoritmi i arhitekture DSP I

Microsoft PowerPoint - 13-Funkcije_2.ppt [Compatibility Mode]

Microsoft PowerPoint - 03-Slozenost [Compatibility Mode]

Razvoj programa, Code::Blocks, struktura programa, printf, scanf, konverzioni karakteri predavač: Nadežda Jakšić

Classroom Expectations

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

Електротехнички факултет Универзитета у Београду Катедра за рачунарску технику и информатику Kолоквијум из Интелигентних система Колоквију

Konstrukcija i analiza algoritama vežbe 10 Nina Radojičić 15. decembar Algoritamske strategije - podeli pa vladaj (divide and conquer) Ova stra

Vezbe_AOR1_2014_V1.0

RACUNARSKA ELEKTRONIKA – VEŽBE 3

Државно такмичење године 5. и 6. разред 1. [pločice] Правоугаону терасу димензија d s центиметара квадратних треба поплочати коришћењем плочица

Microsoft PowerPoint - C-4-1

PowerPoint Presentation

Funkcije predavač: Nadežda Jakšić

MIP-heuristike (Matheuristike) Hibridi izmedu metaheurističkih i egzaktnih metoda Tatjana Davidović Matematički institut SANU

Uvod u računarstvo 2+2

Microsoft Word - 02 Elementi programskog jezika Pascal

Tutoring System for Distance Learning of Java Programming Language

Zadatak T=5: Jedinica WBSD propušta vred Potiče iz polja Rwb.LMD Signal Rwb.WRLMD izaziva propuštanje ove vrednosti 2. Vrednost 0000

P9.2 Optimizujuci kompajler, prednji deo

Grafovi 1. Posmatrajmo graf prikazan na slici sa desne strane. a) Odrediti skup čvorova V i skup grana E posmatranog grafa. Za svaku granu posebno odr

Орт колоквијум

Uvod u računarstvo 2+2

P3.2 Paralelno programiranje 2

Tutoring System for Distance Learning of Java Programming Language

Precesor Intel 8086

Pojačavači

PowerPoint Presentation

Programski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk

Edukacioni racunarski sistem

Upitni jezik SQL

Programiranje 2 0. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/4

_sheets.dvi

ZADACI ZA VEŽBU 1. Realizovati konzolnu aplikaciju koja će računati površinu kvadrata, pravougaonika ili trougla. 2. Preko konzole se unosi ocena od 1

Programski jezik C

Računarski praktikum I - Vježbe 11 - Funktori

Microsoft PowerPoint - Datoteke [Compatibility Mode]

Uvod u računarstvo 2+2

Logicko projektovanje racunarskih sistema I

Microsoft PowerPoint - MR - Vjezbe - 03.ppt [Compatibility Mode]

PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije

Problemi zadovoljavanja ogranicenja.

PowerPoint Presentation

PASCAL UVOD 2 II razred gimnazije

Grananje u programu predavač: Nadežda Jakšić

070-ALIP2-udzbenik.indb

Inženjering informacionih sistema

Microsoft PowerPoint - 12-Funkcije_1.ppt [Compatibility Mode]

Kombinatorno testiranje

Microsoft PowerPoint - OOPpredavanja05 [Compatibility Mode]

Zadatak 011 Razmotrite sljedeći primjer. package hr.fer.oopj.primjeri.p011; public class Main { } public static void main(string[] args) { obrada(2.71

Slide 1

Uvod u organizaciju i arhitekturu računara 2 1

Programiranje za UNIX Okruženje unix procesa

UVOD - OD JAVE DO C# ELEMENTARNE RAZLIKE Veliki broj Java/C# razlika su uglavnom preimenovane ključne reči i razlike u konvencijama imenovanja. Neke o

Grafovski algoritmi - čas 4 Artikulacione tačke i mostovi Ukoliko u neusmerenom povezanom grafu G = (V, E) postoji čvor v V takav da njegovim uklanjan

2_Arhitektura racunara

Konverzije, operatori, matematičke funkcije predavač: Nadežda Jakšić

Microsoft Word - Projekat iz MIPS-a - simCPU.doc

AR2019

I колоквијум из Основа рачунарске технике I СИ- 2017/2018 ( ) Р е ш е њ е Задатак 1 Тачка А Потребно је прво пронаћи вредности функција f(x

1. OPĆE INFORMACIJE 1.1. Naziv kolegija Programiranje 1.6. Semestar Nositelj kolegija dr.sc. Bruno Trstenjak, v. pred Bodovna vrijednost

Algoritmi

Класе комбинација презентације (Хортона) и к о бајаги скрипте (Ово је прича коју врло радо причам) нови тип података: дефинишу могуће вредности подата

Programiranje 1

Računarski praktikum I - Vježbe 03 - Implementacija strukture string

Slide 1

Postavka 2: Osnovni graf algoritmi 1 DISTRIBUIRANI ALGORITMI I SISTEMI Iz kursa CSCE 668 Proleće 2014 Autor izvorne prezentacije: Prof. Jennifer Welch

УНИВЕРЗИТЕТ У НИШУ ПРИРОДНО-МАТЕМАТИЧКИ ФАКУЛТЕТ Департман за рачунарске науке Писмени део испита из предмета Увод у рачунарство 1. [7 пое

Microsoft Word - SIORT1_2019_K1_resenje.docx

Logičke izjave i logičke funkcije

Microsoft PowerPoint - Timer0 16F887.ppt [Compatibility Mode]

P1.0 Uvod

Microsoft PowerPoint - jkoren10.ppt

TEORIJA SIGNALA I INFORMACIJA

P1.1 Analiza efikasnosti algoritama 1

Fortran

Увод у организацију и архитектуру рачунара 1

Oblikovanje i analiza algoritama 5. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb OAA 2017, 5. pr

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvrsnog_Programa [Compatibility Mode]

Programski jezik C

The real problem is that programmers have spent far too much time worrying about efficiency in the wrong places and at the wrong times; premature opti

Uvod u PHP

Microsoft Word - 11 Pokazivaci

Транскрипт:

Избор инструкција 1

Поједностављени поглед на задњи део компајлера Међурепрезентација (Међујезик IR) Избор инструкција Додела ресурса Распоређивање инструкција Инструкције циљне архитектуре 2

Поједностављени поглед на задњи део компајлера Међурепрезентација (Међујезик IR) Избор инструкција Додела ресурса Распоређивање инструкција Инструкције циљне архитектуре 3

Поједностављени поглед на задњи део компајлера Међурепрезентација (Међујезик IR) Избор инструкција Да ли Избор инструкција мора бити прва фаза? Псеудо-асемблер (листа инструкција које још увек не баратају стварним ресурсима) 4

Ближи погледа на избор инструкција Моделоване инструкције Све инструкције циљне платформе Избор инструкција Програм сачињен од операција МР (IR) Програм сачињен од моделованих операција (инструкција) циљне 5 платформе

Задаци избора инструкција Ваљаност Изабране инструкције морају бити семантички еквивалентне програму у међукоду Квалитет Изабрани скуп инструкција треба да буде што бољи, у складу са неким задатим критеријумом Исте задатке има и компајлер као целина. 6

Разни поступци за избор инструкција Поступци се разликују у одређеним елементима у зависности од тога каква је форма међурепрезентације над којом могу да раде У основи сваког поступка су правила која упарују део МР са неким скупом инструкција Разликују се многе друге особине: врсте инструкција које се могу моделовати у правилима, поступак избора правила и сл. 7

Пример једноставне МР := + - * / мем var const := a + - * 2 1 / мем b 6 + 7 c mov add sub mul div ld ldi 8

Правила := + - * / мем var const := -> mov + -> add - -> sub * -> mul / -> div мем -> ld mov r d, r s1, r s2 add r d, r s1, r s2 sub r d, r s1, r s2 mul r d, r s1, r s2 div r d, r s1, r s2 ld r d, r s ldi r d, imm const -> ldi var -> претпоставка да је већ у регистру 9

Правила := -> mov + -> add - -> sub * -> mul / -> div := a + - * мем -> ld 2 1 / мем const -> ldi Сва правила су 1 на 1. b 6 + 7 c 10

Избор инструкција? setnja(node* x) { switch (x->getkind()) { case MOV_OK: MovNode* p = static_cast<movnode*>(x); Reg lop = setnja(p->rightnode()); Reg rop = setnja(p->leftnode()); emitinstr(movinstr(lop, rop)); return?; break; case ADD_OK:... case SUB_OK:... case MUL_OK:... case DIV_OK:... case MEM_OK:... case CONST_OK:... case VAR_OK:... } } 11

Избор инструкција void setnjastm(node* x) { switch (x->getkind()) { case MOV_OK: MovNode* p = static_cast<movnode*>(x); Reg lop = setnjaexp(p->rightnode()); Reg rop = setnjaexp(p->leftnode()); emitinstr(movinstr(lop, rop)); return;... } Reg setnjaexp(node* x) { switch (x->getkind()) { case ADD_OK:...... } } 12

Избор инструкција Reg setnjaexp(node* x) { switch (x->getkind()) { case ADD_OK: AddNode* p = static_cast<addnode*>(x); Reg lop = setnjaexp(p->rightnode()); Reg rop = setnjaexp(p->leftnode()); Reg dst = NewTemp(); emitinstr(addinstr(dst, lop, rop)); return dst; case SUB_OK:... case MUL_OK:... case DIV_OK:... case MEM_OK:... case CONST_OK:... case VAR_OK: VarNode* p = static_cast<varnode*>(x); return p->getreg(); } } 13

Избор инструкција := a + - * 2 1 / мем b 6 + 7 c ldi t1, 2 ldi t2, 1 sub t3, t1, t2 ldi t4, 6 div t5, b, t4 ldi t6, 7 add t7, t6, c ld t8, t7 mul t9, t5, t8 add t10, t3, t9 mov a, t10 14

Избор инструкција := t10 a + t3 t9 - * t1 t2 t5 t8 2 1 / мем t4 t7 b 6 t6 + 7 c ldi t1, 2 ldi t2, 1 sub t3, t1, t2 ldi t4, 6 div t5, b, t4 ldi t6, 7 add t7, t6, c ld t8, t7 mul t9, t5, t8 add t10, t3, t9 mov a, t10 15

МР у форми листе t1 <- 2 t2 <- 1 t3 <- t1 - t2 t4 <- 6 t5 <- b - t4 t6 <- 7 t7 <- t6 + c t8 <- мем[t7] t9 <- t5 * t8 t10 <- t3 + t9 a := t10 16

Избор инструкција - МР у форми листе void izbor(ir x) { for (auto& it : x.oplist()) { switch (it.kind) { case ADD_OK: emitinstr(addinstr(it.dst, it.src1, it.src2)); break; case SUB_OK:... break; case MUL_OK:... break; case DIV_OK:... break; case MEM_OK:... break; case CONST_OK:... break; //case VAR_OK:... } } } 17

Форме међурепрезентације Структуралне: Стабла, усмерени ациклични графови, графови Линеарне: Листа инструкција апстрактне машине Тро-адресни код, код стек машине Хибридне (комбинација претходна два): Граф тока управљања 18

Правила пример 1 на више := + - * / мем var const := -> mov + -> add - -> inv add * -> mul / -> div мем -> ld mov r d, r s1, r s2 add r d, r s1, r s2 invr d, r s mul r d, r s1, r s2 div r d, r s1, r s2 ld r d, r s ldi r d, imm const -> ldi var -> претпоставка да је већ у регистру 19

Избор инструкција пример 1 на више Reg setnjaexp(node* x) { switch (x->getkind()) { case ADD_OK:... case SUB_OK: SubNode* p = (SubNode*)x; Reg lop = setnjaexp(p->rightnode()); Reg rop = setnjaexp(p->leftnode()); Reg tmpd = NewTemp(); emitinstr(invinstr(tmpd, rop)); Reg dst = NewTemp(); emitinstr(addinstr(dst, lop, tmpd)); return dst; case MUL_OK:... case DIV_OK:... case MEM_OK:... case CONST_OK:... case VAR_OK:... } } 20

Избор инструкција пример 1 на више МР у форми листе? 21

Оптималност избора инструкција Оптималност над истим скупом моделованих инструкција. Шта ако неке важне инструкције нису моделоване? Оптималност над истим скупом правила. Како се то односи према укупној оптималности компајлера? Оптималност? По ком критеријуму? 22

Шаблони стабла IR чворови изражавају само по једну операцију Читање или упис у меморију, сабирање или одузимање... Реална инструкција може обавити више операција Нпр. скоро свака машина може обавити сабирање и дохватање операнда у истој инструкцији Модел инструкције у IR = шаблон стабла 23

Пример скупа инструкција (1/3) Jouette архитектура Регистар r0 увек садржи 0 M[x] означава мем. локацију са адресом x Инструкције Аритметичке Производе резултате у регистру Меморијске Изводе ивичне ефекте над меморијом (пишу у меморију) Неким инструкцијама одговара више шаблона комутативни оператори (+ и *) LOAD/STORE: регистар или константа може бити 0 24

Пример скупа инструкција (2/3) Jouette архитектура Име Ефекат Стабла r i TEMP ADD r i r j + r k MUL r i r j x r k SUB r i r j - r k DIV r i r j / r k ADDI r i r j + c SUBI r i r j c LOAD r i M[r j + c] 25

Пример скупа инструкција (3/3) Jouette архитектура STORE M[r j + c] r i MOVEM M[r j ] M[r i ] 26

Пример пополочавања Тајгер исказ a[i] := x ADDI r 1 r 0 + a ADD r 1 fp + r 1 LOAD r 1 M[r 1 + 0] ADDI r 2 r 0 + 4 MUL r 2 r i x r 2 ADD r 1 r 1 + r 2 ADDI r 2 r 0 + x ADD r 2 fp + r 2 LOAD r 2 M[r 2 + 0] STORE M[r 1 + 0] r 2 move mem mem + + mem * fp + temp i const 4 const x fp const a 27

Пример пополочавања Тајгер исказ a[i] := x ADDI r 1 r 0 + a ADD r 1 fp + r 1 LOAD r 1 M[r 1 + 0] ADDI r 2 r 0 + 4 MUL r 2 r i x r 2 ADD r 1 r 1 + r 2 ADDI r 2 r 0 + x ADD r 2 fp + r 2 LOAD r 2 M[r 2 + 0] STORE M[r 1 + 0] r 2 LOAD r 1 M[fp + a] ADDI r 2 r 0 + 4 MUL r 2 r i x r 2 ADD r 1 r 1 + r 2 LOAD r 2 M[fp + x] STORE M[r 1 + 0] r 2 Које поплочавање је боље? 28

Пример пополочавања Тајгер исказ a[i] := x 2 LOAD r 1 M[fp + a] 4 ADDI r 2 r 0 + 4 5 MUL r 2 r i x r 2 6 ADD r 1 r 1 + r 2 8 LOAD r 2 M[fp + x] 9 STORE M[r 1 + 0] r 2 2 LOAD r 1 M[fp + a] 4 ADDI r 2 r 0 + 4 5 MUL r 2 r i x r 2 6 ADD r 1 r 1 + r 2 8 ADDI r 2 fp + x 9 MOVEM M[r 1 ] M[r 2 ] Које поплочавање је боље? 29

Пример пополочавања Тајгер исказ a[i] := x У исказу a[i] := x, i је у регистру, док су a и x у оквиру стека Показана су два могућа поплочавања a и x су у ствари одстојања од показивача оквира, fp У оба случаја, плочице 1, 3 и 7 не одговарају инструкцијама, већ регистрима (TEMP-ови) Иначе, увек је могуће IR поплочати танким плочицама, које покривају по један IR чвор 30

Алгоритам максималног залогаја (енгл. munch) је алгоритам субоптималног поплочавања IR Врло је једноставан Полазећи од корена IR пронаћи највећи шаблон који се уклапа и њиме покрити корен и чворове испод њега Поновити исти алгоритам за сва преостала подстабла Инструкције се генеришу у обратном редоследу Инструкција у корену је прва генерисана, али може да се изврши тек кад све остале инструкције произведу њене операнде 31

Појашњење/изведба алгоритма Највећи шаблон је онај са највише IR чворова Ако се два шаблона исте величине уклапају на неком месту, избор између њих је произвољан Изведба за Jouette: две рекурзивне функције munchstm за исказе и munchexp за изразе Клаузуле munchexp-а одговарају шаблонима Клаузуле су поређане по опадајућој величини шаблона Следе скелети функција Изостављен је избор регистара и емитовање операнада 32

Костур функције munchexp static void munchexp(t_exp exp) MEM(BINOP(PLUS, e1, CONST(i))) => munchexp(e1); emit( LOAD ); MEM(BINOP(PLUS, CONST(i), e1)) => munchexp(e1); emit( LOAD ); MEM(CONST(i)) => emit( LOAD ); MEM(e1) => munchexp(e1); emit( LOAD ); BINOP(PLUS, e1, CONST(i)) => munchexp(e1); emit( ADDI ); BINOP(PLUS, CONST(i), e1) => munchexp(e1); emit( ADDI ); CONST(i) => emit( ADDI ); BINOP(PLUS, e1, e2) => munchexp(e1); munchexp(e2); emit( ADD ); TEMP(t) => {} 33

Брзо поклапање (1/2) Алгоритми поплочавања морају за сваки чвор IR Проверити све шаблоне, који се могу уклопити у чвору Наиван алгоритам би редом проверавао сваки шаблон и сваки чвор шаблона са одговарајућим делом IR Бољи приступ: да би се уклопио шаблон у чвору н Лабела чвора n се користи за избор case клаузуле match(n) { switch (label(n)) { case MEM: case BINOP: case CONST: 34

Брзо поклапање (2/2) Једном кад се изабере једна лабела, нпр. MEM Даље се анализирају само шаблони који имају ту лабелу у свом корену Нови switch-case Правило: низ поређења у munchexp никада не треба да гледа исти чвор IR два пута 35

Костур функције munchstm (1/2) static void munchstm(t_stm s) { switch (s->kind) { case T_MOVE: { T_exp dst = s->u.move.dst, src = s->u.move.src; if (dst->kind == T_MEM) { if (dst->u.mem->kind == T_BINOP && dst->u.mem->u.binop.op == T_plus && dst->u.mem->u.binop.right->kind == T_CONST) { // MOVE(MEM(BINOP(PLUS, e1, CONST(i))), e2) T_exp e1 = dst->u.mem->u.binop.left, e2 = src; munchexp(e1); munchexp(e2); emit( STORE ); } else if (dst->u.mem->kind == T_BINOP && dst->u.mem->u.binop.op == T_plus && dst->u.mem->u.binop.left->kind == T_CONST) { // MOVE(MEM(BINOP(PLUS, CONST(i), e1)), e2) T_exp e1 = dst->u.mem->u.binop.right, e2 = src; munchexp(e1); munchexp(e2); emit( STORE ); 36

Костур функције munchstm (2/2)... } else if (src->u.mem->kind == T_MEM) { // MOVE(MEM(e1), MEM(e2)) T_exp e1 = dst->u.mem, e2 = src->u.mem; munchexp(e1); munchexp(e2); emit( MOVEM ); } else { // MOVE(MEM(e1), e2) T_exp e1 = dst->u.mem, e2 = src; munchexp(e1); munchexp(e2); emit( STORE ); } else if (dst->kind == T_TEMP) { // MOVE(TEMPi, e2) T_exp e2 = src; munchexp(e2); emit( ADD ); //second reg is r0 (==0) } else assert(0); //destination of MOVE must be MEM or TEMP break; case T_JUMP:... case T_CJUMP:... case T_NAME:... 37

Избор инструкција за Тајгер Апстрактни асемблер Мапе привремених променљивих, temp Пример генерисаних асемблерских инструкција Костури MunchStm и MunchExp Позиви процедура и функција Излаз 38

Апстрактни асемблер enum InstrKind{I_OPER, I_LABEL, I_MOVE}; Instr* makeoper(string a, TempList d, TempList s); Instr* makelabel(string a, Label label); Instr* makemove(string a, TempList d, TempList s); void printinst(file* out, const Intr& i, TempMap m); 39

Пример генерисаних инструкција Дато IR стабло би могло бити преведено у следеће Jouette инструкције si/ di означавају i-ти изворишни/одредишни регистар Неки пут се регистар подразумева и не наводи се експлицитно Нпр. за инструкцију add t1,t2, која реализује t1 t1+t2, генерише се стринг add d0, s1; регистар s0 је имплицитан Asem dst src ADDI d0 <- s0+4 t98 t87 LOAD d0 <- M[ s0+0] t99 t92 MUL d0 <- s0* s1 t100 t98,t99 40

munchexp (1/2) Temp_temp munchexp(t_exp e) { switch (e) { case MEM(BINOP(PLUS, e1, CONST(i))): { Temp r = newtemp (); emit(makeoper( LOAD d0 <- M[ s0+ + i + ]\n, {r}, {munchexp(e1)})); return r;} case MEM(CONST(i)): { Temp r = newtemp(); emit(makeoper( LOAD d0 <- M[r0+ + i + ]\n, {r}, {})); return r;} case MEM(e1): { Temp r = newtemp (); emit(makeoper( LOAD d0 <- M[ s0+0]\n, {r}, {munchexp(e1)})); return r;} 41

munchexp (2/2)... case BINOP(PLUS, CONST(i), e1): { Temp r = newtemp (); emit(makeoper( ADDI d0 <- s0+ + i + ]\n, {r}, {munchexp(e1)})); return r;} case CONST(i): { Temp r = newtemp (); emit(makeoper( ADDI d0 <- r0+ + i + ]\n, {r}, {})); return r;} case BINOP(PLUS, e1, e2): { Temp r = newtemp (); emit(makeoper( ADD d0 <- s0+ s1\n, {r}, {munchexp(e1), munchexp(e2)})); return r;} case TEMP(t): return t; 42

munchstm (1/2) static void munchstm(t_stm s) { switch (s) { case MOVE(BINOP(PLUS, e1, CONST(i)), e2): emit(makeoper( STORE M[ s0+ + i + ] <- s1\n, {}, {munchexp(e1), munchexp(e2)})); case MOVE(BINOP(PLUS, CONST(i), e1), e2): emit(makeoper( STORE M[ s0+ + i + ] <- s1\n, {}, {munchexp(e1), munchexp(e2)})); case MOVE(MEM(e1), MEM(e2)): emit(makeoper( MOVE M[ s0] <- M[ s1]\n, {}, {munchexp(e1), munchexp(e2)})); case MOVE(MEM(CONST(i)), e2): emit(makeoper( STORE M[r0+ + i + ] <- s0\n, {}, {munchexp(e2)})); 43

munchstm (2/2)... case MOVE(MEM(e1), e2): emit(makeoper( STORE M[ s0] <- s1\n, {}, {munchexp(e1), munchexp(e2)})); case MOVE(TEMP(i), e2): emit(makemove( ADD d0 <- s0 +r0\n, {i}, {munchexp(e2)})); case LABEL(lab): emit(makelabel(tostring(lab) + :\n s, lab); 44

Позиви процедура и функција Позив процедуре: EXP(CALL(f, args)) Позив функције: MOVE(TEMP t, CALL(f, args)) Код за покривање munchargs генерише код за пребацивање args Враћа листу temp-ове; то су изворишни операнди (source) calldefs листа регистара које процедура мења рег. које чува позивајућа проц., рег. повратне адресе и рег. повратне вредности case EXP(CALL(e, args)): { Temp_temp r = munchexp(e); Temp_tempList l = munchargs(0, args); emit(as_oper( CALL s0\n, calldefs, {r, l}));} 45

Пример генерисаног псеудо кода queens, процедура printboard PROCEDURE printboard... ADD 184 <-$fp + r0 ADDI 185 <-r0+1 ADD 132 <-185 + r0 LOAD 186 <- M[$fp+12] ADDI 190 <-r0+4 LOAD 191 <- M[$fp+4] MUL 189 <-191 * 190 LOAD 193 <- M[$fp+0] LOAD 192 <- M[193+20] ADD 188 <-192 + 189 LOAD 187 <- M[188+0] CMP 187,186 JEQ L91 L92: ADDI 194 <-r0+0 ADD 132 <-194 + r0 L91: ADDI 195 <-r0+1... function printboard() = (for i := 0 to N-1 do (for j := 0 to N-1 do print(if col[i]=j then " O else "."); print("\n")); print("\n")) 46