Euskal Herriko Unibertsitatea Informatika Fakultatea Konputagailuen Arkitektura II, 2000 Konputagailuen Arkitektura eta Teknologia Saila Konpilazio-Teknikak Laborategi-saio honetan konpiladore komertzial batek sortzen duen kodea aztertuko dugu. Horretarako, SPARC prozesadorea erabiltzen duen SUN lan-eazio bat eta DIGITAL/COMPAQ alpha prozesadorea erabiliko ditugu. A. SUN Hiru programa hauek dauzkazu zure direktorioan, C-z idatzita: p1.c #define N 50 main() { int i; int a[n]; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=1; i<n; i++) a[i] = a[i] + a[i-1]; p3.c #define N 50 main() { int i; int a[n], b[n], c[n]; } for (i=0; i<n; i++) a[i] = b[i] + c[i] ; Programak konpilatzeko honako hau exekutatu behar da cc S -Ox izena.c -Ox optimizazio-mailak adierazteko (x = 1, 2 edo 3) -S mihiztadura lengoaian idatzitako kodea sortzeko (ez da exekutagarria sortzen) Ondorioz izena.s fitxategia sortzen da.
Konpila ezazu P1 programa honako lau kasu hauetan: optimizatu gabe, eta -O1, -O2 eta - O3 optimizazioak erabiliz. Kasu bakoitzean sortzen den.s fitxategia aztertuko dugu. Optimizazioen eraginaz ideia bat izateko, exekuzio-denborak neur daitezke. Horretarako, editatu p1.c fitxategia, aatu bektorearen tamaina, 2.000.000 bat izateko, eta sartu begizta bat eragiketa 10 aiz errepikatzeko. Konpilatu berriro programa, orain -S aukera jarri gabe cc -Ox izena.c -o izena Exekutatu programa time komandoa gehituz (time izena), exekuzio-denboraren eimazio bat izateko. Errepikatu lauzpabo aiz exekuzioa eta kalkulatu exekuziodenboraren batez beea. Bete ezazu ondoko taula. (2.000.000 bat osagai) t. seg ag/it t/ag d-aurr % Optimizatu gabe 1. aukera -O1 2. aukera -O2 3. aukera -O3 t.seg: exekuzio-denbora segundotan ag/it: exekutatzen den agindu-kopurua bektore-osagai bakoitzeko t/ag: agindu bat exekutatzeko denbora, batez beez, d-aurr%: aurrezten den denbora, optimizatu gabeko kasuarekin konparatuta Errepikatu aurrekoa bee bi programetarako, -P2 eta P3, baina bakarrik -O2 eta -O3 optimizazioak erabiliz. Analizatu kasu bakoitzean sortzen den kodea (.s fitxategia).
P1_0.S a(i) = a(i)+3 LL0:.seg "data".seg "text".proc 04.global _main _main:!#prologue# 0 sethi %hi(lf12),%g1 %g1,%lo(lf12),%g1 save %sp,%g1,%sp!#prologue# 1 %g0,[%fp+-0x4] L16: [%fp+-0x4],%o0 cmp %o0,0x32 bge L15 nop sub %fp,0xcc,%o1 [%fp+-0x4],%o2 sll %o2,0x2,%o3 [%o1+%o3],%o4 %o4,0x3,%o4 %o4,[%o1+%o3] L14: [%fp+-0x4],%o5 %o5,0x1,%o5 %o5,[%fp+-0x4] b L16 nop L15: LE12: ret reore LF12 = -272 LP12 = 64 LST12 = 64 LT12 = 64.seg "data"
P1_1.S a(i) = a(i)+3.seg "text".proc 4.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-272,%sp %g0,[%fp-4] LY1: [%fp-4],%o2 sub %fp,204,%o1 sll %o2,2,%o2 [%o1+%o2],%o4 3,%o4 %o4,[%o1+%o2] [%fp-4],%o5 %o5 cmp %o5,50 bl LY1 %o5,[%fp-4] ret reore.seg "data"
P1_2.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,%o0,%i5 [%i5],%o5 LY1: 3,%o5 %o5,[%i5] 4,%i5 cmp %i5,%i4 blu,a LY1 [%i5],%o5 ret reore.seg "data"
P1_3.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %i5,%o0,%i5 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,12,%o5 cmp %o5,%i4 bcc,a LY2 [%i5],%l4 [%i5],%o7 LY3: 3,%o7 %o7,[%i5] [%i5+4],%l0 3,%l0 %l0,[%i5+4] [%i5+8],%l1 3,%l1 %l1,[%i5+8] [%i5+12],%l2 3,%l2 %l2,[%i5+12] 16,%i5 %i5,12,%l3 cmp %l3,%i4 blu,a LY3 [%i5],%o7 cmp %i5,%i4 bcc L77006 nop [%i5],%l4 LY2: 3,%l4 %l4,[%i5] 4,%i5 cmp %i5,%i4 bcs,a LY2 [%i5],%l4 L77006: ret reore.seg "data"
P2_2.S a(i)=a(i)+a(i-1).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-200,%o2 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i5,%o2,%i5 L77003: [%i4],%l0 [%i5],%l1 4,%i4 %l1,%l0,%l1 %l1,[%i5] cmp %i4,%i3 blu L77003 4,%i5 ret reore.seg "data"
P2_3.S a(i)=a(i)+a(i-1) save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i4,12,%l0 cmp %l0,%i3 %fp,-200,%o2 bcc L77010 %i5,%o2,%i5 L77003: [%i5],%l2 [%i4],%l1 %l2,%l1,%l2 %l2,[%i5] [%i4+4],%l3 [%i5+4],%l4 %l4,%l3,%l4 %l4,[%i5+4] [%i4+8],%l5 [%i5+8],%l6 %l6,%l5,%l6 %l6,[%i5+8] [%i4+12],%l7 [%i5+12],%i0 16,%i4 %i4,12,%i1 %i0,%l7,%i0 %i0,[%i5+12] cmp %i1,%i3 blu L77003 16,%i5 cmp %i4,%i3 bcc L77006 nop L77010: [%i4],%i2 [%i5],%o0 4,%i4 %o0,%i2,%o0 %o0,[%i5] cmp %i4,%i3 bcs L77010 4,%i5 L77006: ret reore.seg "data"
P3_2.S a(i)=b(i)+c(i).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %fp,-200,%i3 %i4,%i3,%i3 %i4,%i5,%i5 %fp,-400,%o4 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i4,%o4,%i4 L77003: [%i4],%l2 [%i5],%l3 4,%i5 %l2,%l3,%l2 %l2,[%i3] cmp %i5,%i2 4,%i4 blu L77003 4,%i3 ret reore.seg "data"
P3_3.S a(i)=b(i)+c(i) _main: save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %i4,%i5,%i5 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i5,12,%l2 %fp,-200,%i3 %i4,%i3,%i3 cmp %l2,%i2 %fp,-400,%o4 bcc L77010 %i4,%o4,%i4 L77003: [%i5+12],%o3 [%i5+8],%o0 [%i5+4],%l7 [%i5],%l4 [%i4+12],%o2 [%i4+8],%i1 [%i4+4],%l6 [%i4],%l3 16,%i5 %i5,12,%o5 %l3,%l4,%l3 %l6,%l7,%l6 %i1,%o0,%i1 %o2,%o3,%o2 %o2,[%i3+12] %i1,[%i3+8] %l6,[%i3+4] %l3,[%i3] cmp %o5,%i2 16,%i4 blu L77003 16,%i3 cmp %i5,%i2 bcc L77006 nop L77010: [%i5],%l0 [%i4],%o7 4,%i5 %o7,%l0,%o7 %o7,[%i3] cmp %i5,%i2 4,%i4 bcs L77010 4,%i3 L77006: ret reore
B. ALPHA Bigarren makina honetan aurrekoan egindako analisi bera errepikatu dugu. Bi programa hauek erabiliko ditugu p1.c #define N 50 int a[n]; main() { int i; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=0; i<=n; i++) a[i] = a[i-1] + 3; Programak modu berean konpilatzen dira: cc S -Ox unroll n izena.c -Ox optimizazio-maila adierazteko (x = 1, 2, 3, 4) -S mihiztadura lengoaian idatzitako kodea sortzeko (ez da exekutagarria sortzen) Ondorioz izena.s fitxategia sortzen da. -unroll n begizta zenbat aiz (n) zabau behar den adierazteko (1 ez egitea) Konpilatu P1 programa O4 unroll 1 (ez zabau) aukerekin. Aztertu.s fitxategia. Zer egin du konpiladoreak? Errepikatu aurrekoa, baina P2 programarekin. Zer egin du konpiladoreak? Konpilatu berriz P2 programa, baina begizta bi aiz zabauz. Eta orain? Bukatzeko, egin ezazu berriz aurrekoa P1 programarekin, begizta bi aiz zabauz (-unroll 2). Eta orain, zer egin du konpiladoreak?
P1_O4_u1.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $1, a($gp)!literal!2 # 000006 l $3, ($1)!lituse_base!2 a $2, 4($1)!lituse_base!2 l $31, 60($2) a $1, 200($1)!lituse_base!2 cmpult $2, $1, $5 l $3, 3, $3 beq $5, L$4 L$5: a $2, 4($2) l $31, 64($2) l $6, -4($2) cmpult $2, $1, $16 l $3, -8($2) l $6, 3, $3 bne $16, L$5 L$4: l $3, -4($2).loc 1 7 # 7 } clr $0 # 000007 ret ($26).end main
P1_O4_u2.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $2, a($gp)!literal!2 # 000006 l $31, 48($2)!lituse_base!2 a $1, 200($2)!lituse_base!2 a $2, 8($2)!lituse_base!2 cmpult $2, $1, $4 beq $4, L$4 l $31, 48($2) l $5, -8($2) a $2, 8($2) cmpult $2, $1, $8 l $5, 3, $5 l $6, -12($2) beq $8, L$6 L$7: l $16, -8($2) l $6, 3, $17 l $31, 48($2) l $6, -4($2) a $2, 8($2) l $5, -24($2) cmpult $2, $1, $22 l $17, -20($2) l $16, 3, $5 bne $22, L$7 L$6: l $6, 3, $24.loc 1 7 # 7 } clr $0 # 000007.loc 1 6 l $23, -8($2) # 000006 l $6, -4($2) l $5, -16($2) l $23, 3, $5 l $6, 3, $6 l $24, -12($2) l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26) # 000007 L$4:.loc 1 6 l $3, -8($2) # 000006 l $6, -4($2).loc 1 7 clr $0 # 000007.loc 1 6 l $3, 3, $5 # 000006 l $6, 3, $6 l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26)
.end main # 000007
P2_O4_u1.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $3, -4($0) a $0, 4($0) cmpult $0, $1, $4 l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main
P2_O4_u2.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $31, 44($0) l $3, -4($0) a $0, 8($0) l $3, 3, $3 cmpult $0, $1, $4 l $3, -8($0) l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main
Universidad del País Vasco Facultad de Informática Arquitectura de Computadores II, 2000 Dep. de Arquitectura y Tecnología de Computadores Técnicas de compilación En ea sesión de laboratorio vamos a examinar el código generado por compiladores comerciales de C. Trabajaremos con una eación de trabajo SUN que utiliza el procesador SPARC y con un DIGITAL/COMPAQ con el procesador alpha. A. SUN En el directorio encontrarás eos tres programas de prueba en C: p1.c #define N 50 main() { int i; int a[n]; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=1; i<n; i++) a[i] = a[i] + a[i-1]; p3.c #define N 50 main() { int i; int a[n], b[n], c[n]; } for (i=0; i<n; i++) a[i] = b[i] + c[i] ; Para compilar los programas hay que ejecutar cc -Ox -S programa.c -Ox indica el nivel de optimización (x = 1, 2 o 3) -S genera el fichero programa.s con el código traducido a lenguaje ensamblador (no genera un fichero ejecutable)
Compila el programa P1 en eos cuatro casos: sin optimizar y con las optimizaciones - O1, -O2 y -O3. En cada caso examinaremos el fichero.s que se genera. Para tener una idea del efecto de eas optimizaciones podemos medir el tiempo de ejecución de cada programa. Para obtener unos tiempos de ejecución medibles edita el fichero p1.c, cambia el tamaño del vector a 2.000.000 e introduce un bucle externo que repita la operación 10 veces. Compila nuevamente el programa, pero sin la opción -S: cc -Ox nombre.c -o nombre Ejecuta el programa anteponiendo el comando time (time nombre), para obtener una eimación del tiempo de ejecución. Repite 4 o 5 veces la ejecución y promedia los tiempos obtenidos. Rellena la tabla adjunta. (2.000.000 de elementos) t. seg inr/elem t/inr % red. Sin optimizar 1. opción -O1 2. opción -O2 3. opción -O3 t.seg: tiempo de ejecución en segundos inr/elem: número de inrucciones que se ejecutan por elemento del vector t/inr: tiempo promedio de ejecución de una inrucción %red: reducción de tiempo conseguida frente a la ejecución no optimizada Repite el proceso anterior para los otros dos programas, P2 y P3. Utiliza sólo las opciones O2 y O3. Analiza en cada caso el código generado (fichero.s).
P1_0.S a(i) = a(i)+3 LL0:.seg "data".seg "text".proc 04.global _main _main:!#prologue# 0 sethi %hi(lf12),%g1 %g1,%lo(lf12),%g1 save %sp,%g1,%sp!#prologue# 1 %g0,[%fp+-0x4] L16: [%fp+-0x4],%o0 cmp %o0,0x32 bge L15 nop sub %fp,0xcc,%o1 [%fp+-0x4],%o2 sll %o2,0x2,%o3 [%o1+%o3],%o4 %o4,0x3,%o4 %o4,[%o1+%o3] L14: [%fp+-0x4],%o5 %o5,0x1,%o5 %o5,[%fp+-0x4] b L16 nop L15: LE12: ret reore LF12 = -272 LP12 = 64 LST12 = 64 LT12 = 64.seg "data"
P1_1.S a(i) = a(i)+3.seg "text".proc 4.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-272,%sp %g0,[%fp-4] LY1: [%fp-4],%o2 sub %fp,204,%o1 sll %o2,2,%o2 [%o1+%o2],%o4 3,%o4 %o4,[%o1+%o2] [%fp-4],%o5 %o5 cmp %o5,50 bl LY1 %o5,[%fp-4] ret reore.seg "data"
P1_2.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,%o0,%i5 [%i5],%o5 LY1: 3,%o5 %o5,[%i5] 4,%i5 cmp %i5,%i4 blu,a LY1 [%i5],%o5 ret reore.seg "data"
P1_3.S a(i) = a(i)+3.seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-200,%o0 %i5,%o0,%i5 %fp,-200,%o2 mov 200,%i4 %i4,%o2,%i4 %i5,12,%o5 cmp %o5,%i4 bcc,a LY2 [%i5],%l4 [%i5],%o7 LY3: 3,%o7 %o7,[%i5] [%i5+4],%l0 3,%l0 %l0,[%i5+4] [%i5+8],%l1 3,%l1 %l1,[%i5+8] [%i5+12],%l2 3,%l2 %l2,[%i5+12] 16,%i5 %i5,12,%l3 cmp %l3,%i4 blu,a LY3 [%i5],%o7 cmp %i5,%i4 bcc L77006 nop [%i5],%l4 LY2: 3,%l4 %l4,[%i5] 4,%i5 cmp %i5,%i4 bcs,a LY2 [%i5],%l4 L77006: ret reore.seg "data"
P2_2.S a(i)=a(i)+a(i-1).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-200,%o2 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i5,%o2,%i5 L77003: [%i4],%l0 [%i5],%l1 4,%i4 %l1,%l0,%l1 %l1,[%i5] cmp %i4,%i3 blu L77003 4,%i5 ret reore.seg "data"
P2_3.S a(i)=a(i)+a(i-1) save %sp,-264,%sp mov 0,%i5 %fp,-204,%i4 %i5,%i4,%i4 %fp,-204,%o4 mov 200,%i3 %i3,%o4,%i3 %i4,12,%l0 cmp %l0,%i3 %fp,-200,%o2 bcc L77010 %i5,%o2,%i5 L77003: [%i5],%l2 [%i4],%l1 %l2,%l1,%l2 %l2,[%i5] [%i4+4],%l3 [%i5+4],%l4 %l4,%l3,%l4 %l4,[%i5+4] [%i4+8],%l5 [%i5+8],%l6 %l6,%l5,%l6 %l6,[%i5+8] [%i4+12],%l7 [%i5+12],%i0 16,%i4 %i4,12,%i1 %i0,%l7,%i0 %i0,[%i5+12] cmp %i1,%i3 blu L77003 16,%i5 cmp %i4,%i3 bcc L77006 nop L77010: [%i4],%i2 [%i5],%o0 4,%i4 %o0,%i2,%o0 %o0,[%i5] cmp %i4,%i3 bcs L77010 4,%i5 L77006: ret reore.seg "data"
P3_2.S a(i)=b(i)+c(i).seg "text".proc 16.global _main _main:!#prologue# 0!#PROLOGUE# 1 save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %fp,-200,%i3 %i4,%i3,%i3 %i4,%i5,%i5 %fp,-400,%o4 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i4,%o4,%i4 L77003: [%i4],%l2 [%i5],%l3 4,%i5 %l2,%l3,%l2 %l2,[%i3] cmp %i5,%i2 4,%i4 blu L77003 4,%i3 ret reore.seg "data"
P3_3.S a(i)=b(i)+c(i) _main: save %sp,-664,%sp mov 0,%i4 %fp,-600,%i5 %i4,%i5,%i5 %fp,-600,%o7 mov 200,%i2 %i2,%o7,%i2 %i5,12,%l2 %fp,-200,%i3 %i4,%i3,%i3 cmp %l2,%i2 %fp,-400,%o4 bcc L77010 %i4,%o4,%i4 L77003: [%i5+12],%o3 [%i5+8],%o0 [%i5+4],%l7 [%i5],%l4 [%i4+12],%o2 [%i4+8],%i1 [%i4+4],%l6 [%i4],%l3 16,%i5 %i5,12,%o5 %l3,%l4,%l3 %l6,%l7,%l6 %i1,%o0,%i1 %o2,%o3,%o2 %o2,[%i3+12] %i1,[%i3+8] %l6,[%i3+4] %l3,[%i3] cmp %o5,%i2 16,%i4 blu L77003 16,%i3 cmp %i5,%i2 bcc L77006 nop L77010: [%i5],%l0 [%i4],%o7 4,%i5 %o7,%l0,%o7 %o7,[%i3] cmp %i5,%i2 4,%i4 bcs L77010 4,%i3 L77006: ret reore
B ALPHA En ea segunda máquina vamos a repetir el análisis anterior, pero con eos dos programas: p1.c #define N 50 int a[n]; main() { int i; p2.c #define N 50 main() { int i; int a[n]; } for (i=0; i<n; i++) a[i] = a[i] + 3; } for (i=0; i<=n; i++) a[i] = a[i-1] + 3; Los programas se compilan de la misma manera: cc S -Ox unroll n nombre.c -Ox nivel de optimización (x = 1, 2, 3, 4) -S genera código en ensamblador (genera el fichero nombre.s) -unroll n para indicar el nivel de desenrolle del bucle (1 no desenrollar) Compila el programa P1 con las opciones O4 unroll 1 (no desenrollar). Analiza el fichero.s. Qué ha hecho el compilador? Repite lo anterior con el programa P2. Qué ha hecho el compilador? Desenrolla el bucle P2 dos veces. Y ahora? Para terminar, desenrolla dos veces el programa P1 (-unroll 2). Qué hace el compilador ea vez?
P1_O4_u1.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $1, a($gp)!literal!2 # 000006 l $3, ($1)!lituse_base!2 a $2, 4($1)!lituse_base!2 l $31, 60($2) a $1, 200($1)!lituse_base!2 cmpult $2, $1, $5 l $3, 3, $3 beq $5, L$4 L$5: a $2, 4($2) l $31, 64($2) l $6, -4($2) cmpult $2, $1, $16 l $3, -8($2) l $6, 3, $3 bne $16, L$5 L$4: l $3, -4($2).loc 1 7 # 7 } clr $0 # 000007 ret ($26).end main
P1_O4_u2.s a(i) = a(i) + 3.set noat.set noreorder.comm a 200.data $$1:.text.align 4.file 1 "p1.c".loc 1 3 # 3 main().globl main.ent main.loc 1 3 main: # 000003 ah $gp, ($27)!gpdisp!1 a $gp, ($gp)!gpdisp!1.frame $sp, 0, $26.save_ra $0.prologue 1.loc 1 6 # 4 { # 5 int i; # 6 for(i=0; i<n; i++) a[i] = a[i]+3; q $2, a($gp)!literal!2 # 000006 l $31, 48($2)!lituse_base!2 a $1, 200($2)!lituse_base!2 a $2, 8($2)!lituse_base!2 cmpult $2, $1, $4 beq $4, L$4 l $31, 48($2) l $5, -8($2) a $2, 8($2) cmpult $2, $1, $8 l $5, 3, $5 l $6, -12($2) beq $8, L$6 L$7: l $16, -8($2) l $6, 3, $17 l $31, 48($2) l $6, -4($2) a $2, 8($2) l $5, -24($2) cmpult $2, $1, $22 l $17, -20($2) l $16, 3, $5 bne $22, L$7 L$6: l $6, 3, $24.loc 1 7 # 7 } clr $0 # 000007.loc 1 6 l $23, -8($2) # 000006 l $6, -4($2) l $5, -16($2) l $23, 3, $5 l $6, 3, $6 l $24, -12($2) l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26) # 000007 L$4:.loc 1 6 l $3, -8($2) # 000006 l $6, -4($2).loc 1 7 clr $0 # 000007.loc 1 6 l $3, 3, $5 # 000006 l $6, 3, $6 l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26)
.end main # 000007
P2_O4_u1.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $3, -4($0) a $0, 4($0) cmpult $0, $1, $4 l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main
P2_O4_u2.s a(i) = a(i-1) + 3.set noat.set noreorder.text.align 4.file 1 "p2.c".loc 1 2 # 2 main().globl main.ent main.loc 1 2 main: # 000002 a $sp, -208($sp).frame $sp, 208, $26.prologue 0.loc 1 6 # 3 { # 4 int i; # 5 int a[n]; # 6 for(i=0; i<n; i++) a[i] = a[i-1]+3; mov $sp, $0 # 000006 a $1, 200($sp) L$2: l $31, 44($0) l $3, -4($0) a $0, 8($0) l $3, 3, $3 cmpult $0, $1, $4 l $3, -8($0) l $3, 3, $3 l $3, -4($0) bne $4, L$2.loc 1 7 # 7 } clr $0 # 000007 a $sp, 208($sp) ret ($26).end main
P1_O4_u2.s a(i) = a(i) + 3... (bis) L$7: a $1, 200($2)!lituse_base!2 a $2, 8($2)!lituse_base!2 cmpult $2, $1, $4 beq $4, L$4 l $31, 48($2) l $5, -8($2) a $2, 8($2) cmpult $2, $1, $8 l $5, 3, $5 l $6, -12($2) beq $8, L$6 l $16, -8($2) l $6, 3, $17 l $31, 48($2) l $6, -4($2) a $2, 8($2) l $5, -24($2) cmpult $2, $1, $22 l $17, -20($2) l $16, 3, $5 bne $22, L$7 L$6: l $6, 3, $24.loc 1 7 # 7 } clr $0.loc 1 6 l $23, -8($2) l $6, -4($2) l $5, -16($2) l $23, 3, $5 l $6, 3, $6 l $24, -12($2) l $5, -8($2) l $6, -4($2).loc 1 7 ret ($26) # 000007 # 000006 # 000007