MACHINE-LEVEL PROGRAMMING II: ARITHMETIC & CONTROL.

Slides:



Advertisements
Similar presentations
Fabián E. Bustamante, Spring 2007 Machine-Level Programming II: Control Flow Today Condition codes Control flow structures Next time Procedures.
Advertisements

1 Carnegie Mellon Machine-Level Programming II: Arithmetic & Control / : Introduction to Computer Systems 6 th Lecture, Jan 29, 2015 Carnegie.
University of Washington Announcements Lab 1 due last night Lab 2 release soon HW1 due Monday night 1.
1 Carnegie Mellon Machine-Level Programming II: Arithmetic & Control / : Introduction to Computer Systems 6 th Lecture, May 28, 2015 Carnegie.
Machine-Level Programming II: Control Flow Sept. 12, 2002 Topics Condition Codes Setting Testing Control Flow If-then-else Varieties of Loops Switch Statements.
Machine-Level Programming II Control Flow Sept. 13, 2001 Topics Condition Codes –Setting –Testing Control Flow –If-then-else –Varieties of Loops –Switch.
Machine-Level Programming II: Control Flow September 1, 2008 Topics Condition Codes Setting Testing Control Flow If-then-else Varieties of Loops Switch.
1 Introduction to x86 Assembly, part II or “What does my laptop actually do?” Ymir Vigfusson Some slides gracefully borrowed from
Machine-Level Programming II: Control Flow Topics Condition codes Conditional branches Loops Switch statements CS 105 “Tour of the Black Holes of Computing”
1 Carnegie Mellon Machine-Level Programming II: Arithmetic & Control : Introduction to Computer Systems 5 th Lecture, Sep. 7, 2010 Carnegie Mellon.
1 Seoul National University Machine-Level Programming II: Arithmetic & Control.
II:1 x86 Assembly - Control. II:2 Alternate reference source Go to the source: Intel 64 and IA32 
1 Machine-Level Programming III: Arithmetic & Condition Codes Comp 21000: Introduction to Computer Organization & Systems March 2015 Systems book chapter.
Assembly Programmer’s View
Carnegie Mellon 1 Introduction to x86 Assembly or “What does my laptop actually do?” Ymir Vigfusson Some slides gracefully borrowed from
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming II: Control : Introduction.
University of Washington Today Lab 2 due next Monday! Finish-up control flow Switch statements 1.
1 Carnegie Mellon Machine-Level Programming II: Arithmetic and Control Lecture, Feb. 28, 2012 These slides are from website which.
1 Machine-Level Programming IV: Control: loops Comp 21000: Introduction to Computer Organization & Systems March 2015 Systems book chapter 3* * Modified.
1 Carnegie Mellon Assembly and Bomb Lab : Introduction to Computer Systems Recitation 4, Sept. 17, 2012.
Machine-Level Programming 1 Introduction Topics Assembly Programmer’s Execution Model Accessing Information Registers Memory Arithmetic operations.
University of Washington x86 Programming I The Hardware/Software Interface CSE351 Winter 2013.
Carnegie Mellon 1 Machine-Level Programming I: Basics Lecture, Feb. 21, 2013 These slides are from website which accompanies the.
1 Carnegie Mellon Machine-Level Programming II: Arithmetic & Control / : Introduction to Computer Systems 6 th Lecture, Sep. 11, 2014 Carnegie.
תרגול 5 תכנות באסמבלי, המשך
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming II: Control Carnegie Mellon.
University of Washington x86 Programming II The Hardware/Software Interface CSE351 Winter 2013.
University of Washington This week Lab 1 due 11pm today  Frustrating? Awesome? Both? Neither? Lab 2 out later today, due 11pm Wednesday July 17  Disassembly,
– 1 – IEEE Floating Point IEEE Standard 754 Established in 1985 as uniform standard for floating point arithmetic Before that, many idiosyncratic.
Lecture 7 Flow of Control Topics Finish Lecture 6 slides Lab 02 = datalab comments Assembly Language flow of control Test 1 – a week from wednesday February.
IA32 Stack –Region of memory managed with stack discipline –Grows toward lower addresses –Register %esp indicates lowest stack address address of top element.
1 Machine-Level Programming V: Control: loops Comp 21000: Introduction to Computer Organization & Systems March 2016 Systems book chapter 3* * Modified.
IA32: Control Flow Topics –Condition Codes Setting Testing –Control Flow If-then-else Varieties of Loops Switch Statements.
Carnegie Mellon Machine-Level Programming II: Arithmetic & Control /18-243: Introduction to Computer Systems 6th Lecture, 5 June 2012 Carnegie Mellon.
1 Binghamton University Machine-Level Programming II: Arithmetic & Control CS220: Computer Systems II.
Assembly תרגול 7 תכנות באסמבלי, המשך. Condition Codes Single bit registers  CF – carry flag  ZF – zero flag  SF – sign flag  OF – overflow flag Relevant.
Machine-Level Programming 2 Control Flow Topics Condition Codes Setting Testing Control Flow If-then-else Varieties of Loops Switch Statements.
1 Bryant and O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition Carnegie Mellon Machine-Level Programming IV Control Comp 21000: Introduction.
Reading Condition Codes (Cont.)
Machine-Level Programming 2 Control Flow
X86 Assembly, and C-to-assembly
IA32 Processors Evolutionary Design
Conditional Branch Example
Machine-Level Programming II: Arithmetic & Control
Machine-Level Programming II: Control
Machine-Level Representation of Programs II
Introduction to Assembly Language IA32
Machine-Level Programming 1 Introduction
Machine-Level Programming II: Control Flow
Y86 Processor State Program Registers
Roadmap C: Java: Assembly language: OS: Machine code: Computer system:
Instructor: David Ferry
Condition Codes Single Bit Registers
Machine-Level Programming: Control Flow
3.5 Conditional Codes Spring, 2015 Euiseong Seo
Machine-Level Programming 2 Control Flow
Machine-Level Programming 2 Control Flow
Machine-Level Programming III: Procedures Sept 18, 2001
Machine-Level Representation of Programs III
Machine-Level Programming 2 Control Flow
Machine-Level Programming II: Control Flow
X86 Assembly - Control.
Machine-Level Programming II: Control Flow Sept. 12, 2007
Carnegie Mellon Ithaca College
CS201- Lecture 8 IA32 Flow Control
Presentation transcript:

MACHINE-LEVEL PROGRAMMING II: ARITHMETIC & CONTROL

2 University of Texas at Austin Today Complete addressing mode, address computation (leal) Arithmetic operations Control: Condition codes Conditional branches While loops

3 University of Texas at Austin Complete Memory Addressing Modes Most General Form D(Rb,Ri,S)Mem[Reg[Rb]+S*Reg[Ri]+ D] D: Constant “displacement” 1, 2, or 4 bytes Rb: Base register: Any of 8 integer registers Ri:Index register: Any, except for %esp Unlikely you’d use %ebp, either S: Scale: 1, 2, 4, or 8 ( why these numbers? ) Special Cases (Rb,Ri)Mem[Reg[Rb]+Reg[Ri]] D(Rb,Ri)Mem[Reg[Rb]+Reg[Ri]+D] (Rb,Ri,S)Mem[Reg[Rb]+S*Reg[Ri]]

4 University of Texas at Austin Address Computation Examples ExpressionAddress ComputationAddress 0x8(%edx)0xf x80xf008 (%edx,%ecx)0xf x1000xf100 (%edx,%ecx,4)0xf *0x1000xf400 0x80(,%edx,2)2*0xf x800x1e080 %edx0xf000 %ecx0x0100 ExpressionAddress ComputationAddress 0x8(%edx) (%edx,%ecx) (%edx,%ecx,4) 0x80(,%edx,2)

5 University of Texas at Austin Address Computation Instruction leal Src, Dest Src is address mode expression Set Dest to address denoted by expression Uses Computing addresses without a memory reference E.g., translation of p = &x[i]; Computing arithmetic expressions of the form x + k*y k = 1, 2, 4, or 8 Example int mul12(int x) { return x*12; } int mul12(int x) { return x*12; } leal (%eax,%eax,2), %eax ;t <- x+x*2 sall $2, %eax ;return t<<2 leal (%eax,%eax,2), %eax ;t <- x+x*2 sall $2, %eax ;return t<<2 Converted to ASM by compiler:

6 University of Texas at Austin Today Complete addressing mode, address computation (leal) Arithmetic operations Control: Condition codes Conditional branches While loops

7 University of Texas at Austin Some Arithmetic Operations Two Operand Instructions: FormatComputation addl Src,Dest Dest = Dest + Src subl Src,Dest Dest = Dest  Src imull Src,Dest Dest = Dest * Src sall Src,Dest Dest = Dest << Src Also called shll sarl Src,Dest Dest = Dest >> Src Arithmetic shrl Src,Dest Dest = Dest >> Src Logical xorl Src,Dest Dest = Dest ^ Src andl Src,Dest Dest = Dest & Src orl Src,Dest Dest = Dest | Src Watch out for argument order! No distinction between signed and unsigned int (why?)

8 University of Texas at Austin Some Arithmetic Operations One Operand Instructions incl DestDest = Dest + 1 decl DestDest = Dest  1 negl DestDest =  Dest notl DestDest = ~Dest See book for more instructions

9 University of Texas at Austin Arithmetic Expression Example int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } arith: pushl%ebp movl%esp, %ebp movl8(%ebp), %ecx movl12(%ebp), %edx leal(%edx,%edx,2), %eax sall$4, %eax leal4(%ecx,%eax), %eax addl%ecx, %edx addl16(%ebp), %edx imull%edx, %eax popl%ebp ret Body Set Up Finish

10 University of Texas at Austin 16z 12y 8x 4Rtn Addr 0Old %ebp Understanding arith movl8(%ebp), %ecx movl12(%ebp), %edx leal(%edx,%edx,2), %eax sall$4, %eax leal4(%ecx,%eax), %eax addl%ecx, %edx addl16(%ebp), %edx imull%edx, %eax %ebp Offset int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; }

11 University of Texas at Austin 16z 12y 8x 4Rtn Addr 0Old %ebp Understanding arith %ebp Offset Stack int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } movl8(%ebp), %ecx# ecx = x movl12(%ebp), %edx# edx = y leal(%edx,%edx,2), %eax# eax = y*3 sall$4, %eax# eax *= 16 (t4) leal4(%ecx,%eax), %eax# eax = t4 +x+4 (t5) addl%ecx, %edx# edx = x+y (t1) addl16(%ebp), %edx# edx += z (t2) imull%edx, %eax# eax = t2 * t5 (rval)

12 University of Texas at Austin Observations about arith Instructions in different order from C code Some expressions require multiple instructions Some instructions cover multiple expressions Get exact same code when compile: (x+y+z)*(x+4+48*y) movl8(%ebp), %ecx# ecx = x movl12(%ebp), %edx# edx = y leal(%edx,%edx,2), %eax# eax = y*3 sall$4, %eax# eax *= 16 (t4) leal4(%ecx,%eax), %eax# eax = t4 +x+4 (t5) addl%ecx, %edx# edx = x+y (t1) addl16(%ebp), %edx# edx += z (t2) imull%edx, %eax# eax = t2 * t5 (rval) int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; } int arith(int x, int y, int z) { int t1 = x+y; int t2 = z+t1; int t3 = x+4; int t4 = y * 48; int t5 = t3 + t4; int rval = t2 * t5; return rval; }

13 University of Texas at Austin Another Example int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } logical: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax xorl 8(%ebp),%eax sarl $17,%eax andl $8185,%eax popl %ebp ret Body Set Up Finish movl 12(%ebp),%eax# eax = y xorl 8(%ebp),%eax# eax = x^y (t1) sarl $17,%eax# eax = t1>>17 (t2) andl $8185,%eax# eax = t2 & mask (rval)

14 University of Texas at Austin Another Example int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } logical: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax xorl 8(%ebp),%eax sarl $17,%eax andl $8185,%eax popl %ebp ret Body Set Up Finish movl 12(%ebp),%eax# eax = y xorl 8(%ebp),%eax# eax = x^y (t1) sarl $17,%eax# eax = t1>>17 (t2) andl $8185,%eax# eax = t2 & mask (rval)

15 University of Texas at Austin Another Example int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } logical: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax xorl 8(%ebp),%eax sarl $17,%eax andl $8185,%eax popl %ebp ret Body Set Up Finish movl 12(%ebp),%eax# eax = y xorl 8(%ebp),%eax# eax = x^y (t1) sarl $17,%eax# eax = t1>>17 (t2) andl $8185,%eax# eax = t2 & mask (rval)

16 University of Texas at Austin Another Example int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } int logical(int x, int y) { int t1 = x^y; int t2 = t1 >> 17; int mask = (1<<13) - 7; int rval = t2 & mask; return rval; } logical: pushl %ebp movl %esp,%ebp movl 12(%ebp),%eax xorl 8(%ebp),%eax sarl $17,%eax andl $8185,%eax popl %ebp ret Body Set Up Finish movl 12(%ebp),%eax# eax = y xorl 8(%ebp),%eax# eax = x^y (t1) sarl $17,%eax# eax = t1>>17 (t2) andl $8185,%eax# eax = t2 & mask (rval) 2 13 = 8192, 2 13 – 7 = 8185

17 University of Texas at Austin Today Complete addressing mode, address computation (leal) Arithmetic operations Control: Condition codes Conditional branches Loops

18 University of Texas at Austin Processor State (IA32, Partial) Information about currently executing program Temporary data ( %eax, … ) Location of runtime stack ( %ebp, %esp ) Location of current code control point ( %eip, … ) Status of recent tests ( CF, ZF, SF, OF ) %eip General purpose registers Current stack top Current stack frame Instruction pointer CFZFSFOF Condition codes %eax %ecx %edx %ebx %esi %edi %esp %ebp

19 University of Texas at Austin Condition Codes (Implicit Setting) Single bit registers CF Carry Flag (for unsigned) SF Sign Flag (for signed) ZF Zero Flag OF Overflow Flag (for signed) Implicitly set (think of it as side effect) by arithmetic operations Example: addl/addq Src, Dest ↔ t = a+b CF set if carry out from most significant bit (unsigned overflow) ZF set if t == 0 SF set if t < 0 (as signed) OF set if two’s-complement (signed) overflow (a>0 && b>0 && t =0) Not set by lea instruction Full documentation (IA32), link on course website Full documentation

20 University of Texas at Austin Condition Codes (Explicit Setting: Compare) Explicit Setting by Compare Instruction cmpl/cmpq Src2, Src1 cmpl b,a like computing a-b without setting destination CF set if carry out from most significant bit (used for unsigned comparisons) ZF set if a == b SF set if (a-b) < 0 (as signed) OF set if two’s-complement (signed) overflow (a>0 && b 0 && (a-b)>0)

21 University of Texas at Austin Condition Codes (Explicit Setting: Test) Explicit Setting by Test instruction testl / testq Src2, Src1 testl b,a like computing a&b without setting destination Sets condition codes based on value of Src1 & Src2 Useful to have one of the operands be a mask ZF set when a&b == 0 SF set when a&b < 0

22 University of Texas at Austin Reading Condition Codes SetX Instructions Set single byte based on combinations of condition codes SetXConditionDescription seteZF Equal / Zero setne~ZF Not Equal / Not Zero setsSF Negative setns~SF Nonnegative setg~(SF^OF)&~ZF Greater (Signed) setge~(SF^OF) Greater or Equal (Signed) setl(SF^OF) Less (Signed) setle(SF^OF)|ZF Less or Equal (Signed) seta~CF&~ZF Above (unsigned) setbCF Below (unsigned)

23 University of Texas at Austin movl 12(%ebp),%eax# eax = y cmpl %eax,8(%ebp)# Compare x : y setg %al# al = x > y movzbl %al,%eax# Zero rest of %eax Reading Condition Codes (Cont.) SetX Instructions: Set single byte based on combination of condition codes One of 8 addressable byte registers Does not alter remaining 3 bytes Typically use movzbl to finish job int gt (int x, int y) { return x > y; } int gt (int x, int y) { return x > y; } Body %eax%ah%al %ecx%ch%cl %edx%dh%dl %ebx%bh%bl %esi %edi %esp %ebp

24 University of Texas at Austin Reading Condition Codes: x86-64 SetX Instructions: Set single byte based on combination of condition codes Does not alter remaining 3 bytes int gt (long x, long y) { return x > y; } int gt (long x, long y) { return x > y; } cmpl %esi, %edi setg %al movzbl %al, %eax Bodies long lgt (long x, long y) { return x > y; } long lgt (long x, long y) { return x > y; } Is %rax zero? Yes: 32-bit instructions set high order 32 bits to 0! cmpq %rsi, %rdi setg %al movzbl %al, %eax

25 University of Texas at Austin Today Complete addressing mode, address computation (leal) Arithmetic operations x86-64 Control: Condition codes Conditional branches & Moves Loops

26 University of Texas at Austin Jumping jX Instructions Jump to different part of code depending on condition codes jXConditionDescription jmp1 Unconditional jeZF Equal / Zero jne~ZF Not Equal / Not Zero jsSF Negative jns~SF Nonnegative jg~(SF^OF)&~ZF Greater (Signed) jge~(SF^OF) Greater or Equal (Signed) jl(SF^OF) Less (Signed) jle(SF^OF)|ZF Less or Equal (Signed) ja~CF&~ZF Above (unsigned) jbCF Below (unsigned)

27 University of Texas at Austin Conditional Branch Example int absdiff(int x, int y) { int result; if (x > y) { result = x-y; } else { result = y-x; } return result; } int absdiff(int x, int y) { int result; if (x > y) { result = x-y; } else { result = y-x; } 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 Body1 Setup Finish Body2b Body2a

28 University of Texas at Austin Conditional Branch Example (Cont.) C allows “goto” as means of transferring control Closer to machine-level programming style Generally considered bad coding style 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; } 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 Body1 Setup Finish Body2b Body2a

29 University of Texas at Austin Conditional Branch Example (Cont.) 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; } 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 Body1 Setup Finish Body2b Body2a

30 University of Texas at Austin Conditional Branch Example (Cont.) 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; } 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 Body1 Setup Finish Body2b Body2a

31 University of Texas at Austin Conditional Branch Example (Cont.) 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; } 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 Body1 Setup Finish Body2b Body2a

32 University of Texas at Austin C Code val = Test ? Then_Expr : Else_Expr; Goto Version nt = !Test; if (nt) goto Else; val = Then_Expr; goto Done; Else: val = Else_Expr; Done:... nt = !Test; if (nt) goto Else; val = Then_Expr; goto Done; Else: val = Else_Expr; Done:... General Conditional Expression Translation Test is expression returning integer = 0 interpreted as false ≠ 0 interpreted as true Create separate code regions for then & else expressions Execute appropriate one val = x>y ? x-y : y-x;

33 University of Texas at Austin C Code val = Test ? Then_Expr : Else_Expr; val = Test ? Then_Expr : Else_Expr; Goto Version tval = Then_Expr ; result = Else_Expr; t = Test; if (t) result = tval; return result; tval = Then_Expr ; result = Else_Expr; t = Test; if (t) result = tval; return result; Using Conditional Moves Conditional Move Instructions Instruction supports: if (Test) Dest  Src Supported in post-1995 x86 processors GCC does not always use them Wants to preserve compatibility with ancient processors Enabled for x86-64 Use switch –march=686 for IA32 Why? Branches are very disruptive to instruction flow through pipelines Conditional move do not require control transfer

34 University of Texas at Austin Conditional Move Example: x86-64 int absdiff(int x, int y) { int result; if (x > y) { result = x-y; } else { result = y-x; } return result; } int absdiff(int x, int y) { int result; if (x > y) { result = x-y; } else { result = y-x; } return result; } absdiff: movl%edi, %edx subl%esi, %edx# tval = x-y movl%esi, %eax subl%edi, %eax# result = y-x cmpl%esi, %edi# Compare x:y cmovg%edx, %eax # If >, result = tval ret x in %edi y in %esi

35 University of Texas at Austin Expensive Computations Bad Cases for Conditional Move Both values get computed Only makes sense when computations are very simple val = Test(x) ? Hard1(x) : Hard2(x); Risky Computations val = p ? *p : 0; Computations with side effects val = x > 0 ? x*=7 : x+=3; Both values get computed May have undesirable effects Both values get computed Must be side-effect free

36 University of Texas at Austin Control transfer and basic blocks jmp, jxx, and call instructions transfer processor control Basic block: region of uninterrupted control No transfers in No transfers out pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax L1: cmpl %eax, %edx subl %eax, %edx movl %edx, %eax subl %edx, %eax L2:

37 University of Texas at Austin Control transfer and basic blocks jmp, jxx, and call instructions transfer processor control Basic block: region of uninterrupted control No transfers in No transfers out pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax L1: cmpl %eax, %edx subl %eax, %edx movl %edx, %eax subl %edx, %eax L2:

38 University of Texas at Austin Control transfer and basic blocks jmp, jxx, and call instructions transfer processor control Basic block: region of uninterrupted control No transfers in No transfers out pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax L1: cmpl %eax, %edx subl %eax, %edx movl %edx, %eax subl %edx, %eax jne L1 L2:

39 University of Texas at Austin Control transfer and basic blocks jmp, jxx, and call instructions transfer processor control Basic block: region of uninterrupted control No transfers in No transfers out pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax L1: cmpl %eax, %edx subl %eax, %edx movl %edx, %eax subl %edx, %eax jne L1 L2:

40 University of Texas at Austin Control transfer and basic blocks jmp, jxx, and call instructions transfer processor control Basic block: region of uninterrupted control No transfers in No transfers out pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax L1: cmpl %eax, %edx subl %eax, %edx jne L2 movl %edx, %eax subl %edx, %eax jne L1 L2:

41 University of Texas at Austin Control transfer and basic blocks jmp, jxx, and call instructions transfer processor control Basic block: region of uninterrupted control No transfers in No transfers out pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl 12(%ebp), %eax L1: cmpl %eax, %edx subl %eax, %edx jne L2 movl %edx, %eax subl %edx, %eax jne L1 L2:

42 University of Texas at Austin Control transfer and basic blocks Basic blocks form a graph Nodes: basic blocks Edges: control transfers BB graph often reflects high-level programming constructs int x = 1; int y = 1; while (y < 1000) { y = x + y; } printf(“%d\n”, y);

43 University of Texas at Austin Control transfer and basic blocks Basic blocks form a graph Nodes: basic blocks Edges: control transfers BB graph often reflects high-level programming constructs int x = 1; int y = 1; while (y < 1000) { y = x + y; } printf(“%d\n”, y);

44 University of Texas at Austin Today Complete addressing mode, address computation (leal) Arithmetic operations x86-64 Control: Condition codes Conditional branches and moves Loops

45 University of Texas at Austin C Code int pcount_do(unsigned x) { int result = 0; do { result += x & 0x1; x >>= 1; } while (x); return result; } int pcount_do(unsigned x) { int result = 0; do { result += x & 0x1; x >>= 1; } while (x); return result; } Goto Version int pcount_do(unsigned x) { int result = 0; loop: result += x & 0x1; x >>= 1; if (x) goto loop; return result; } int pcount_do(unsigned x) { int result = 0; loop: result += x & 0x1; x >>= 1; if (x) goto loop; return result; } “Do-While” Loop Example Count number of 1’s in argument x (“popcount”) Use conditional branch to either continue looping or to exit loop

46 University of Texas at Austin Goto Version “Do-While” Loop Compilation Registers: %edxx %ecxresult movl$0, %ecx# result = 0.L2:# loop: movl%edx, %eax andl$1, %eax# t = x & 1 addl%eax, %ecx# result += t shrl%edx# x >>= 1 jne.L2# If !0, goto loop int pcount_do(unsigned x) { int result = 0; loop: result += x & 0x1; x >>= 1; if (x) goto loop; return result; } int pcount_do(unsigned x) { int result = 0; loop: result += x & 0x1; x >>= 1; if (x) goto loop; return result; }

47 University of Texas at Austin C Code do Body while ( Test ); do Body while ( Test ); Goto Version loop: Body if ( Test ) goto loop loop: Body if ( Test ) goto loop General “Do-While” Translation Body: Test returns integer = 0 interpreted as false ≠ 0 interpreted as true { Statement 1 ; Statement 2 ; … Statement n ; }

48 University of Texas at Austin C CodeGoto Version “While” Loop Example Is this code equivalent to the do-while version? Must jump out of loop if test fails int pcount_while(unsigned x) { int result = 0; while (x) { result += x & 0x1; x >>= 1; } return result; } int pcount_while(unsigned x) { int result = 0; while (x) { result += x & 0x1; x >>= 1; } return result; } int pcount_do(unsigned x) { int result = 0; if (!x) goto done; loop: result += x & 0x1; x >>= 1; if (x) goto loop; done: return result; } int pcount_do(unsigned x) { int result = 0; if (!x) goto done; loop: result += x & 0x1; x >>= 1; if (x) goto loop; done: return result; }

49 University of Texas at Austin While version while ( Test ) Body while ( Test ) Body Do-While Version if (! Test ) goto done; do Body while( Test ); done: if (! Test ) goto done; do Body while( Test ); done: General “While” Translation Goto Version if (! Test ) goto done; loop: Body if ( Test ) goto loop; done: if (! Test ) goto done; loop: Body if ( Test ) goto loop; done:

50 University of Texas at Austin C Code “For” Loop Example Is this code equivalent to other versions? #define WSIZE 8*sizeof(int) int pcount_for(unsigned x) { int i; int result = 0; for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } return result; } #define WSIZE 8*sizeof(int) int pcount_for(unsigned x) { int i; int result = 0; for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } return result; }

51 University of Texas at Austin “For” Loop Form for ( Init ; Test ; Update ) Body General Form for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } i = 0 i < WSIZE i++ { unsigned mask = 1 << i; result += (x & mask) != 0; } { unsigned mask = 1 << i; result += (x & mask) != 0; } Init Test Update Body

52 University of Texas at Austin “For” Loop  While Loop for ( Init ; Test ; Update ) Body For Version Init ; while ( Test ) { Body Update ; } While Version

53 University of Texas at Austin “For” Loop  …  Goto for ( Init ; Test ; Update ) Body For Version Init ; while ( Test ) { Body Update ; } While Version Init ; if (! Test ) goto done; do Body Update while( Test ); done: Init ; if (! Test ) goto done; do Body Update while( Test ); done: Init ; if (! Test ) goto done; loop: Body Update if ( Test ) goto loop; done: Init ; if (! Test ) goto done; loop: Body Update if ( Test ) goto loop; done:

54 University of Texas at Austin C Code “For” Loop Conversion Example Initial test can be optimized away #define WSIZE 8*sizeof(int) int pcount_for(unsigned x) { int i; int result = 0; for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } return result; } #define WSIZE 8*sizeof(int) int pcount_for(unsigned x) { int i; int result = 0; for (i = 0; i < WSIZE; i++) { unsigned mask = 1 << i; result += (x & mask) != 0; } return result; } Goto Version int pcount_for_gt(unsigned x) { int i; int result = 0; i = 0; if (!(i < WSIZE)) goto done; loop: { unsigned mask = 1 << i; result += (x & mask) != 0; } i++; if (i < WSIZE) goto loop; done: return result; } int pcount_for_gt(unsigned x) { int i; int result = 0; i = 0; if (!(i < WSIZE)) goto done; loop: { unsigned mask = 1 << i; result += (x & mask) != 0; } i++; if (i < WSIZE) goto loop; done: return result; } Init ! Test Body Update Test

55 University of Texas at Austin Summary Today Complete addressing mode, address computation ( leal ) Arithmetic operations Control: Condition codes Conditional branches & conditional moves Loops Next Time Switch statements Stack Call / return Procedure call discipline