Topics of this Slideset

CS429: Computer Organization and Architecture Instruction Set Architecture Intro to Programmer visible state Dr. Bill Young Department of Computer Science Y86 Rudiments University of Texas at Austin RISC vs. CISC architectures

Last updated: October 2, 2019 at 18:05

CS429 Slideset 6: 1 Instruction Set Architecture CS429 Slideset 6: 2 Instruction Set Architecture Instruction Set Architecture Why Y86? Assembly Language View

Processor state: registers, The Y86 is a “toy” machine that is similar to the but much memory, etc. simpler. It is a gentler introduction to assembly level programming Instructions and how than the x86. instructions are encoded just a few instructions as opposed Layer of Abstraction to hundreds for the x86; Above: how to program fewer addressing modes; Application machine, processor executes Program simpler system state; instructions sequentially Compiler OS Below: What needs to be absolute addressing.   ISA ISA Layer built  Everything you learn about the Y86 will apply to the x86 with very  Use variety of tricks to CPU Design little modification. But the main reason we’re bothering with the make it run faster Y86 is because we’ll be explaining pipelining in that context. Circuit Design E.g., execute multiple instructions Chip Layout simultaneously

CS429 Slideset 6: 3 Instruction Set Architecture CS429 Slideset 6: 4 Instruction Set Architecture Language / Machine Semantics Fetch / Decode / Execute Cycle

The most fundamental abstraction for the machine semantics for the x86/Y86 or similar machines is the fetch-decode-execute cycle. This is also called the von Neumann architecture. There are various means of giving a semantics or meaning to a programming system. The machine repeats the following steps forever: Probably the most sensible for an assembly (or machine) language 1 fetch the next instruction is an operational semantics, also known as an interpreter semantics. from memory (the PC tells you which is next); That is, we explain the semantics of each possible operation in the language by explaining the effect that execution of the operation 2 decode the instruction (in has on the machine state. the control unit); 3 execute the instruction, updating the state appropriately; 4 go to step 1.

CS429 Slideset 6: 5 Instruction Set Architecture CS429 Slideset 6: 6 Instruction Set Architecture Y86 Processor State Y86 Instructions

Program Condition Memory Registers codes OF ZF SF %rax %rsp %r8 %r12 We’re actually describing two languages: the assembly language %rcx %rbp %r9 %r13 and the machine language. There is nearly a 1-1 correspondence PC %rdx %rsi %r10 %r14 Stat between them. %rbx %rdi %r11 Machine Language Instructions Program registers: almost the same as x86-64, each 64-bits 1-10 bytes of information read from memory Condition flags: 1-bit flags set by arithmetic and logical Can determine instruction length from first byte operations. OF: Overflow, ZF: Zero, SF: Negative Not as many instruction types and simpler encoding than x86-64 Program counter: indicates address of instruction Each instruction accesses and modifies some part(s) of the Memory program state. Byte-addressable storage array Words stored in little-endian byte order Status code: (status can be AOK, HLT, INS, ADR) to indicate state of program execution.

CS429 Slideset 6: 7 Instruction Set Architecture CS429 Slideset 6: 8 Instruction Set Architecture Y86 Instruction Set Example from C to Assembly

Suppose we have the following simple C program in file code.c. Byte 0123456789 int sumInts ( long int n) halt 0 0 { 1 0 /* Add the integers from 1..n. */ cmovXX rA,rB 2 fn rA rB long int i; irmovq V,rB 3 0 F rB V long int sum = 0; rmmovq rA,D(rB) 4 0 rA rB D for ( i = 1; i <= n; i++ ) { mrmovq D(rB),rA 5 0 rA rB D sum += i; } OPq rA,rB 6 fn rA rB return sum ; jXX Dest 7 fn Dest } call Dest 8 0 Dest ret 9 0 We used long int to force usage of the 64-bit registers. You can pushq rA A 0 rA F generate assembly using the following command: popq rA B 0 rA F > gcc -O -S code.c

CS429 Slideset 6: 9 Instruction Set Architecture CS429 Slideset 6: 10 Instruction Set Architecture x86 Assembly Example Y86 Assembly Example

.file ”code.c” This is a hand translation into Y86 assembler: .text .globl sumInts sumInts : .type sumInts , @function andq %rdi,%rdi # test % rdi = n sumInts : .LFB0 : jle .L4 # if <= 0, done .cfi startproc irmovq$1,%rcx # constant 1 testq %rdi, %rdi irmovq$0,%rax #sum=0 j l e .L4 irmovq$1,%rdx #i=1 movq $0, %rax .L3 : movq $1, %rdx rrmovq %rdi,%rsi #temp=n .L3 : addq %rdx,%rax #sum+=i addq %rdx, %rax addq $1, %rdx addq %rcx,%rdx #i+=1 cmpq %rdx, %rdi subq %rdx,%rsi #temp-=i j g e .L3 jge .L3 # if >= 0, goto L3 ret ret # else return sum .L4 : .L4 : movq $0, %rax irmovq$0,%rax #done ret .cfi endproc ret .LFE0 : .size sumInts, . −sumInts How does it get the argument? How does it return the value? .ident ”GCC: (Ubuntu 4.8.4 −2ubuntu1˜14.04) 4.8.4” − .section .note.GNUCS429 Slideset 6: 11stackInstruction ,””,@progbits Set Architecture CS429 Slideset 6: 12 Instruction Set Architecture Encoding Registers Y86 Instruction Set (2)

Each register has an associated 4-bit ID: cmovXX rA,rB 2 fn rA rB

%rax 0 %r8 8 %rcx 1 %r9 9 %rdx 2 %r10 A Encompasses: %rbx 3 %r11 B %rsp 4 %r12 C rrmovq rA,rB 2 0 move from register to register %rbp 5 %r13 D cmovle rA,rB 2 1 move if less or equal %rsi 6 %r14 E cmovl rA,rB 2 2 move if less %rdi 7 no reg F cmove rA,rB 2 3 move if equal cmovne rA,rB 2 4 move if not equal cmovge rA,rB 2 5 move if greater or equal Almost the same encoding as in x86-64. cmovg rA,rB 2 6 move if greater Most of these registers are general purpose; %rsp has special functionality.

CS429 Slideset 6: 13 Instruction Set Architecture CS429 Slideset 6: 14 Instruction Set Architecture Y86 Instruction Set (3) Y86 Instruction Set (4)

jXX Dest 7 fn Dest OPq rA,rB 6 fn rA rB

Encompasses: Encompasses: jmp Dest 7 0 unconditional jump addq rA,rB 6 0 add jle Dest 7 1 jump if less or equal subq rA,rB 6 1 subtract jl Dest 7 2 jump if less andq rA,rB 6 2 and je Dest 7 3 jump if equal xorq rA,rB 6 3 exclusive or jne Dest 7 4 jump if not equal jge Dest 7 5 jump if greater or equal jg Dest 7 6 jump if greater

CS429 Slideset 6: 15 Instruction Set Architecture CS429 Slideset 6: 16 Instruction Set Architecture Simple Addressing Modes Conventions

It’s important to understand how individual operations update the Immediate: value system state. But that’s not enough! irmovq $0xab, %rbx Much of the way the Y86/x86 operates is based on a a set of Reg[R] Register: programming conventions. Without them, you won’t understand rrmovq %rcx, %rbx how programs work, what the compiler generates, or how your code can interact with code written by others. Normal (R): Mem[Reg[R]] Register R specifies memory address. This is often called indirect addressing. mrmovq (%rcx), %rax

Displacement D(R): Mem[Reg[R]+D] Register R specifies start of memory region. Constant displacement D specifies offset mrmovq 8(%rcb),%rdx

CS429 Slideset 6: 17 Instruction Set Architecture CS429 Slideset 6: 18 Instruction Set Architecture Conventions Sample Program

Let’s write a fragment of Y86 assembly code. Our program swaps the 8-byte values starting in memory locations 0x0100 (value A) The following are conventions necessary to make programs interact: and 0x0200 (value B).

How do you pass arguments to a procedure? start : xorq %rax, %rax Where are variables (local, global, static) created? mrmovq 0x100(%rax), %rbx How does a procedure return a value? mrmovq 0x200(%rax), %rcx rmmovq %rcx, 0x100(%rax) How do procedures preserve the state/data of the caller? rmmovq %rbx, 0x200(%rax) halt Some of these (e.g., the direction the stack grows) are reflected in specific machine operations; others are purely conventions. Reg. Use %rax 0 It’s usually a good idea to have a table like %rbx A this to keep track of the use of registers. %rcx B

CS429 Slideset 6: 19 Instruction Set Architecture CS429 Slideset 6: 20 Instruction Set Architecture Sample Program: Machine Code A Peek Ahead: Argument Passing

Registers: First 6 arguments Now, we generate the machine code for our sample program. Assume that it is stored in memory starting at location 0x030. I 1. %rdi Stack: arguments 7+ did this by hand, so check for errors! 2. %rsi 3. %rdx ... 0x030:6300 #xorq%rax,%rax 4. %rcx Arg n 0x032: 50300001000000000000 # mrmovq 0x100(%rax), %rbx 5. %r8 0x03c: 50100002000000000000 # mrmovq 0x200(%rax), %rcx ... 0x046: 40100001000000000000 # rmmovq %rcx , 0x100(%rax) 6. %r9 Arg 8 0x050: 40300002000000000000 # rmmovq %rbx , 0x200(%rax) Arg 7 ← %rsp 0x05a:00 #halt This convention is for GNU/; Windows is different. Mnemonic to Reg. Use recall order: “Diane’s silk dress cost $89.” Push in reverse order. %rax 0 Only allocate stack space %rbx A Return value when needed. %rcx B %rax

CS429 Slideset 6: 21 Instruction Set Architecture CS429 Slideset 6: 22 Instruction Set Architecture Instruction Example Effects on the State

Addition Instruction Generic form Encoded representation You completely characterize an operation by saying how it changes the state. addq rA, rB 6 0 rA rB What effects does addq %rsi, %rdi have on the state?

Add value in register rA to that in register rB. Store result in register rB Note that Y86 only allows addition to be applied to register data. E.g., addq %rax, %rsi is encoded as: 60 06. Why? Set condition codes based on the result. Two byte encoding: First indicates instruction type. Second gives source and destination registers.

What effects does addq have on the state? CS429 Slideset 6: 23 Instruction Set Architecture CS429 Slideset 6: 24 Instruction Set Architecture Effects on the State Arithmetic and Logical Operations

You completely characterize an operation by saying how it changes the state. Add What effects does addq %rsi, %rdi have on the state? addq rA, rB 6 0 rA rB Refer to generically as “OPq” 1 Set contents of %rdi to the sum of the current contents of Subtract (rA from rB) Encodings differ only by %rsi and %rdi. subq rA, rB 6 1 rA rB “function code”: lower-order 2 Set condition codes based on the result of the sum. And 4-bits in first instruction OF: set (i.e., is 1) iff the result causes an overflow andq rA, rB 6 2 rA rB byte. ZF: set iff the result is zero SF: set iff the result is negative Exclusive Or Set condition codes as side xorq rA, rB 6 3 rA rB effect. 3 Increment the program counter by 2. Why 2?

There is no effect on the memory or status flag.

CS429 Slideset 6: 25 Instruction Set Architecture CS429 Slideset 6: 26 Instruction Set Architecture Move Operations Move Instruction Examples

Register to Register rrmovq rA, rB 2 0 rA rB Immediate to Register x86-64 Y86 Y86 Encoding irmovq V, rB 3 0 F rB V movq $0xabcd, %rdx irmovq $0xabcd, %rdx 30 F2 cd ab 00 00 00 00 00 00 movq %rsp, %rbx rrmovq %rsp, %rbx 20 43 movq -12(%rbp), %rcx mrmovq -12(%rbp), %rcx 5015f4ffffffffffffff Register to Memory movq %rsi, 0x41c(%rsp) rmmovq %rsi, 0x41c(%rsp) 40 64 1c 04 00 00 00 00 00 00 rmmovq rA, D(rB) 4 0 rA rB D movq %0xabcd, (%rax) none movq %rax, 12(%rax, %rdx) none Memory to Register movq (%rbp, %rdx, 4), %rcx none mrmovq D(rB), rA 5 0 rA rB D Similar to the x86-64 movq instruction. The Y86 adds special move instructions to compensate for the lack Similar format for memory addresses. of certain addressing modes. Slightly different names to distinguish them.

CS429 Slideset 6: 27 Instruction Set Architecture CS429 Slideset 6: 28 Instruction Set Architecture Conditional Move Instructions Conditional Move Instructions

Move Unconditionally rrmovq rA, rB 2 0 rA rB

Move (conditionally) Move when less or equal cmovXX rA, rB 2 fn rA rB cmovle rA, rB 2 1 rA rB Refer to generically as “cmovXX” Move when less Encodings differ only by function code fn cmovl rA, rB 2 2 rA rB rrmovq instruction is a special case Move when equal Based on values of condition codes cmove rA, rB 2 3 rA rB Conditionally copy value from source to destination register Move when not equal cmovne rA, rB 2 4 rA rB Note that rrmovq is a special case of cmovXX. Move when greater or equal cmovge rA, rB 2 5 rA rB Move when greater cmovg rA, rB 2 6 rA rB CS429 Slideset 6: 29 Instruction Set Architecture CS429 Slideset 6: 30 Instruction Set Architecture Example of CMOV Jump Instructions

Suppose you want to compile the following C code: long min ( long x, long y) { if (x <= y) Jump (conditionally) return x; jXX Dest 7 fn Dest else return y; } Refer to generically as “jXX” Encodings differ only by function code fn The following is one potential implementation of this. Notice that Based on values of condition codes there are no jumps. Same as x86-64 counterparts min : Encode full destination address (unlike PC-relative addressing rrmovq %rdi, %rax # ans <-- x in x86-64) rrmovq %rdi,%r8 # temp <--x subq %rsi,%r8 # if ( temp - y) > 0 cmovg %rsi,%rax # ans<--y ret # return ans

CS429 Slideset 6: 31 Instruction Set Architecture CS429 Slideset 6: 32 Instruction Set Architecture Jump Instructions Jump Example

Jump Unconditionally jmp Dest 7 0 Dest Suppose you want to count the number of elements in a null Jump when less or equal terminated list A with starting address in %rdi. jle Dest 7 1 Dest Jump when less len : jl Dest 7 2 Dest irmovq $0, %rax # result = 0 mrmovq (%rdi), %rdx # val = *A Jump when equal andq %rdx,%rdx # Test val je Dest 7 3 Dest je Done # If 0, goto # Done Jump when not equal Loop : .... jne Dest 7 4 Dest Done : Jump when greater or equal ret jge Dest 7 5 Dest Jump when greater jg Dest 7 6 Dest CS429 Slideset 6: 33 Instruction Set Architecture CS429 Slideset 6: 34 Instruction Set Architecture Y86 Program Stack Stack Operations

Region of memory holding program Push Stack "bottom" data. pushq rA a 0 rA F Used in Y86 (and x86-64) for Decrement %rsp by 8. supporting procedure calls. Store quad word from rA to memory at %rsp . Stack top is indicated by %rsp , Increasing Similar to x86-64 pushq operation. . address of top stack element. Addresses . Stack grows toward lower Pop addresses. popq rA b 0 rA F Top element is at lowest address Read quad word from memory at %rsp. in the stack. When pushing, must first Save in rA.

%rsp decrement stack pointer. Increment %rsp by 8. When popping, increment stack Stack "top" Similar to x86-64 popq operation. pointer.

CS429 Slideset 6: 35 Instruction Set Architecture CS429 Slideset 6: 36 Instruction Set Architecture Subroutine Call and Return Miscellaneous Instructions

Subroutine call No operation call Dest 8 0 Dest nop 1 0 Push address of next instruction onto stack. Don’t do anything but advance PC. Start executing instructions at Dest. Similar to x86-64 call instruction. Halt execution halt 0 0 Subroutine return ret 9 0 Stop executing instructions; set status to HLT. Pop value from stack. x86-64 has a comparable instruction, but you can’t execute it in user mode. Use as address for next instruction. We will use it to stop the simulator. Similar to x86-64 ret instruction. Encoding ensures that program hitting memory initialized to Note that call and ret don’t implement parameter/return passing. zero will halt. You have to do that in your code.

CS429 Slideset 6: 37 Instruction Set Architecture CS429 Slideset 6: 38 Instruction Set Architecture Status Conditions Writing Y86 Code

Try to use the C compiler as much as possible. Write code in C. Mnemonic Code Meaning Compile for x86-64 with gcc -Og -S. AOK 1 Normal operation Transliterate into Y86 code. HLT 2 Halt inst. encountered Modern compilers make this more difficult, because they ADR 3 Bad address (instr. or data) optimize by default. INS 4 Invalid instruction

To understand Y86 (or x86) code, you have to know the meaning Desired behavior: of the statement, but also certain programming conventions, especially the stack discipline. If AOK, keep executing How do you pass arguments to a procedure? Otherwise, stop program execution Where are local variables created? How does a procedure return a value? How do procedures save and restore the state of the caller?

CS429 Slideset 6: 39 Instruction Set Architecture CS429 Slideset 6: 40 Instruction Set Architecture Writing Y86 Code: Example Y86-64 Code Generation Example

First try writing typical array Coding example: Find number of elements in a null-terminated code: list. Problem: Hard to do array long len ( long a[] ); /* Count elements in null- indexing on Y86, since we don’t terminated list */ have scaled addressing modes. long len ( long a[] ) a { 5043 x86 Code: long length ; 6125 for (length = 0; a[ L3: 7395 length]; length++ ); addq $1, %rax 0 return length ; cmpq $0, (%rdi,%rax,8) } jne L3

The answer in this case should be 3. Compile with gcc -Og -S

CS429 Slideset 6: 41 Instruction Set Architecture CS429 Slideset 6: 42 Instruction Set Architecture Y86-64 Code Generation Example (2) Y86-64 Code Generation Example (3)

Second try: Write C code that mimics expected Y86 code. len : irmovq $1, %r8 # Constant 1 irmovq $8, %r9 # Constant 8 /* Count elements in null- Result: irmovq $0,%rax #len=0 terminated list */ mrmovq (%rdi), %rdx # val = *a long len2 ( long *a ) Compiler generates andq %rdx,%rdx # Test val Reg. Use { exact same code as je Done # If 0, goto %rdi long ip = ( long ) a; a before! # Done %rax len long val = *( long *) ip; Loop : long len = 0; Compiler converts addq %r8,%rax # len++ %rdx val while ( val ) { both versions into the addq %r9,%rdi #a++ %r8 1 ip += sizeof ( long ); same intermediate mrmovq (%rdi), %rdx # val = *a %r9 8 len ++; andq %rdx,%rdx # Test val val = *( long *) ip; form. jne Loop # If !0, goto } # Loop return len ; Done : } ret

CS429 Slideset 6: 43 Instruction Set Architecture CS429 Slideset 6: 44 Instruction Set Architecture Y86 Sample Program Structure Y86 Program Structure (2)

init: # Initialization ... init : call Main # Set up stack pointer halt irmovq Stack, %rsp # Execute main program .align 8 # Program data Program starts at call Main Program starts at Array : address 0 # Terminate ... halt address 0 Must set up stack Must set up stack Main: # Main function Where located # Array of 4 elements + final 0 ... Pointer values .align 8 Must initialize data call len Mustn’t overwrite Array : Can use symbolic ... data .quad 0x000d000d000d000d names .quad 0x00c000c000c000c0 len: # Length function Must initialize data .quad 0x0b000b000b000b00 ... .quad 0xa000a000a000a000 .quad 0 .pos 0x100 # Place stack Stack :

CS429 Slideset 6: 45 Instruction Set Architecture CS429 Slideset 6: 46 Instruction Set Architecture Y86 Program Structure (3) Y86 Assembler

A program that translates Y86 code into machine language. 1-1 mapping of instructions to encodings. Main : irmovq Array, %rdi Resolves symbolic names. # call len ( Array ) Translation is linear. call len ret Assembler directives give additional control.

Some common directives: Set up call to len: .pos x: subsequent lines of code start at address x. Follow x86-64 procedure conventions .align x: align the next line to an x-byte boundary (e.g., Pass array address as argument long ints should be at a quadword address, divisible by 8). .quad x: put an 8-byte value x at the current address; a way to initialize a value.

CS429 Slideset 6: 47 Instruction Set Architecture CS429 Slideset 6: 48 Instruction Set Architecture Assembling Y86 Program Simulating Y86 Programs

unix> yas len.ys unix> yis len.yo

Generates “object code” file len.yo Instruction set simulator Actually looks like disassembler output Computes effect of each instruction on process state 0x054: |len: Prints changes in state from original 0x054: 30f80100000000000000 | irmovq $1, %r8 0x05e: 30f90800000000000000 | irmovq $8, %r9 Stopped in 33 steps at PC = 0x13, Status ’HLT’, CC Z=1 0x068: 30f00000000000000000 | irmovq $0, %rax S=0 O=0 0x072: 50270000000000000000 | mrmovq (%rdi), %rdx Changes to registers: 0x07c:6222 | andq %rdx,%rdx %rax: 0x0000000000000000 0x0000000000000004 0x07e: 73a000000000000000 | je Done %rsp: 0x0000000000000000 0x0000000000000100 0 x087 : | Loop : %rdi: 0x0000000000000000 0x0000000000000038 0x087:6080 | addq %r8,%rax %r8: 0x0000000000000000 0x0000000000000001 0x089:6097 | addq %r9,%rdi %r9: 0x0000000000000000 0x0000000000000008 0x08b: 50270000000000000000 | mrmovq (%rdi), %rdx 0x095:6222 | andq %rdx,%rdx Changes to memory: 0x097: 748700000000000000 | jne Loop 0x00f0: 0x0000000000000000 0x0000000000000053 0x0a0: |Done: 0x00f8: 0x0000000000000000 0x0000000000000013 0 x0a0 : 90 | ret

CS429 Slideset 6: 49 Instruction Set Architecture CS429 Slideset 6: 50 Instruction Set Architecture CISC Instruction Sets RISC Instruction Sets

Complex Instruction Set Computer Reduced Instruction Set Computer Dominant ISA style through the 80s. Originated in IBM Research; popularized in Berkeley and Lots of instructions: Stanford projects. Variable length Few, simple instructions. Stack as mechanism for supporting functions Takes more instructions to execute a task, but faster and Explicit push and pop instructions. simpler implementation ALU instructions can access memory. Fixed length instructions for simpler decoding E.g., addq %rax, 12(%rbx, %rcx, 8) Register-oriented ISA Requires memory read and write in one instruction execution. More registers (32 typically) Some ISAs had much more complex address calculations. Stack is back-up for registers Set condition codes as a side effect of other instructions. Only load and store instructions can access memory (mrmovq Basic philosophy: and rmmovq in Y86). Memory is expensive; Explicit test instructions set condition values in register. Instructions to support high-level language constructs. Philosophy: KISS

CS429 Slideset 6: 51 Instruction Set Architecture CS429 Slideset 6: 52 Instruction Set Architecture CISC vs. RISC Summary

Original Debate Strong opinions! CISC proponents–easy for compiler, fewer code bytes Y86-64 Instruction Set Architecture RISC proponents–better for optimizing compilers, can make Similar state and instructions to x86-64 run fast with simple chip design Simpler encodings Somewhere between CISC and RISC Current Status For desktop processors, choice of ISA not a technical issue With enough hardware, can make anything run fast How Important is ISA Design? Code compatibility more important Less now than before: with enough hardware, can make x86-64 adopted many RISC features almost anything run fast! More registers; use them for argument passing For embedded processors, RISC makes sense Smaller, cheaper, less power Most cell phones use ARM processor

CS429 Slideset 6: 53 Instruction Set Architecture CS429 Slideset 6: 54 Instruction Set Architecture