X y y x goto version nt test if nt goto else val

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: to Exit; Else: result = y-x; Exit: return result; } absdiff: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax cmpl %eax, %edx jle .L6 subl %eax, %edx movl %edx, %eax jmp .L7 .L6: subl %edx, %eax .L7: popl %ebp ret Setup Body1 Body2a Body2b Finish 25 SALTO CONDICIONAL: EJEMPLO int goto_ad(int x, int y) { int result; if (x <= y) goto Else; result = x-y; goto Exit; Else: result = y-x; Exit: return result; } absdiff: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax cmpl %eax, %edx jle .L6 subl %eax, %edx movl %edx, %eax jmp .L7 .L6: subl %edx, %eax .L7: popl %ebp ret Setup Body1 Body2a Body2b Finish 26 SALTO CONDICIONAL: EJEMPLO int goto_ad(int x, int y) { int result; if (x <= y) goto Else; result = x-y; goto Exit; Else: result = y-x; Exit: return result; } absdiff: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax cmpl %eax, %edx jle .L6 subl %eax, %edx movl %edx, %eax jmp .L7 .L6: subl %edx, %eax .L7: popl %ebp ret Setup Body1 Body2a Body2b Finish 27 USANDO BIFURCACIONES C Code val = Test ? Then_Expr : Else_Expr; val = x>y ? x-y : y-x; Goto Version nt = !Test; if (nt) goto Else; val = Then_Expr; goto Done; Else: val = Else_Expr; Done: ... —༉  Test es una expresión que retorna entero = 0 interpretado false ¢༊  ≠ 0 interpretado true ¢༊  —༉  —༉  Crear regiones de código por separado para expresiones Then y Else Ejecutar una 28 INSTRUCCIONES DE MOVIMIENTOS CONDICIONALES ¢༊  Operaciones de transferencia condicional —༉  Soporte instrución: if (Test) Dest ß། Src —༉  —༉  Soportado en los procesadores x86 post-1995 GCC trata de usarlo ¢༊  ¢༊  Habilitado para IA32 & x86-64 Por qué? —༉  —༉  Las bifurcaciones son muy perjudiciales para el flujo de la instrucción a través de pipelines Movimiento condicional no requieren transferencia de control C Code val = Test ? Then_Expr : Else_Expr; Goto Version tval = Then_Expr; result = Else_Expr; t = Test; if (t) result = tval; return result; 29 MOVIMIENTOS CONDICIONALES: EJEMPLO int absdiff(int x, int y) { int result; if (x > y) { result = x-y; } else { result = y-x; } return result; } x in %edi y in %esi absdiff: movl subl movl cmpl subl cmovg ret %edi, %esi, %esi, %esi, %edi, %edx, %edx %edx # tval = x-y # result = y-x %e %eax %eaxdi # Compare x:y %eax # If >, result = tval 30 CASOS MALOS PARA CONDICIONALES LOS MOVIMIENTOS Cálculos costosos val = Test(x) ? Hard1(x) : Hard2(x); ¢༊  ¢༊  Ambos valores consiguen ser calculados Sólo tiene sentido cuando los cálculos son muy simples Riegos de los cálculos val = p ? *p : 0; ¢༊  Ambos valores consiguen ser calculados ¢༊  Puede tener efectos indeseables Cálculos con efectos secundarios...
View Full Document

This document was uploaded on 04/05/2014.

Ask a homework question - tutors are online