CS4100: 計算機結構 Instruction Set Architecture 國立清華大學資訊工程學系 一零零學年度第二學期 Outline Instruction set architecture (Sec 2.1) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-1 Computer Architecture What Is Computer Architecture? Computer Architecture = Instruction Set Architecture + Machine Organization “... the attributes of a [computing] system as seen by the [____________ assembly language] programmer, i.e. the conceptual structure and functional behavior …” What are specified? Instruction Set-2 Computer Architecture Recall in C Language Operators: +, -, *, /, % (mod), ... Operands: 7/4==1, 7%4==3 Variables: lower, upper, fahr, celsius Constants: 0, 1000, -17, 15.4 Assignment statement: variable = expression Expressions consist of operators operating on operands, e.g., celsius = 5*(fahr-32)/9; a = b+c+d-e; Instruction Set-3 Computer Architecture When Translating to Assembly ... a = b + 5; load load add store $r1, M[b] $r2, 5 $r3, $r1, $r2 $r3, M[a] Statement Constant Operands Memory Register Operator (op code) Instruction Set-4 Computer Architecture Components of an ISA Organization of programmable storage Data types and data structures registers memory: flat, segmented modes of addressing and accessing data items and instructions encoding and representation Instruction formats Instruction set (or operation code) ALU, control transfer, exceptional handling Instruction Set-5 Computer Architecture MIPS ISA as an Example Instruction categories: Registers Load/Store Computational Jump and Branch Floating Point Memory Management Special $r0 - $r31 PC HI LO 3 Instruction Formats: all 32 bits wide OP $rs $rt OP $rs $rt OP $rd sa funct immediate jump target Instruction Set-6 Computer Architecture Outline Instruction set architecture Operands (Sec 2.2, 2.3) Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-7 Computer Architecture Operations of Hardware Syntax of basic MIPS arithmetic/logic instructions: 1 2 3 4 add $s0,$s1,$s2 # f = g + h 1) operation by name 2) operand getting result (“destination”) 3) 1st operand for operation (“source1”) 4) 2nd operand for operation (“source2”) Each instruction is 32 bits Syntax is rigid: 1 operator, 3 operands Why? Keep hardware simple via regularity Design Principle 1: Simplicity favors regularity Regularity makes implementation simpler Simplicity enables higher performance at lower cost Instruction Set-8 Computer Architecture Example How to do the following C statement? f = (g + h) - (i + j); Compiled MIPS code: add t0, g, h add t1, i, j sub f, t0, t1 # temp t0 = g + h # temp t1 = i + j # f = t0 - t1 Instruction Set-9 Computer Architecture Operands and Registers Unlike high-level language, assembly don’t use variables => assembly operands are registers Limited number of special locations built directly into the hardware Operations are performed on these Benefits: Registers in hardware => faster than memory Registers are easier for a compiler to use e.g., as a place for temporary storage Registers can hold variables to reduce memory traffic and improve code density (since register named with fewer bits than memory location) Instruction Set-10 Computer Architecture MIPS Registers 32 registers, each is 32 bits wide Why 32? Design Principle 2: smaller is faster Groups of 32 bits called a word in MIPS Registers are numbered from 0 to 31 Each can be referred to by number or name Number references: $0, $1, $2, … $30, $31 By convention, each register also has a name to make it easier to code, e.g., $16 - $22 $s0 - $s7 (C variables) $8 - $15 $t0 - $t7 (temporary) 32 x 32-bit FP registers (paired DP) Others: HI, LO, PC Instruction Set-11 Computer Architecture Registers Conventions for MIPS 0 zero constant 0 16 s0 callee saves 1 at ... 2 v0 expression evaluation & 23 s7 3 v1 function results 24 t8 4 a0 arguments 25 t9 5 a1 26 k0 reserved for OS kernel 6 a2 27 k1 7 a3 28 gp pointer to global area 8 t0 ... 15 t7 reserved for assembler (caller can clobber) temporary (cont’d) temporary: caller saves 29 sp stack pointer (callee can clobber) 30 fp frame pointer 31 ra return address (HW) Fig. 2.18 Instruction Set-12 Computer Architecture Memory MIPS R2000 Organization CPU Coprocessor 1 (FPU) Registers Registers $0 $0 $31 $31 Arithmetic unit Multiply divide Lo Fig. A.10.1 Arithmetic unit Hi Coprocessor 0 (traps and memory) Registers BadVAddr Cause Status EPC Example How to do the following C statement? f = (g + h) - (i + j); f, …, j in $s0, …, $s4 use intermediate temporary register t0,t1 add $t0,$s1,$s2 add $t1,$s3,$s4 sub $s0,$t0,$t1 # t0 = g + h # t1 = i + j # f=(g+h)-(i+j) Instruction Set-14 Computer Architecture Operations of Hardware Syntax of basic MIPS arithmetic/logic instructions: 1 2 3 4 add $s0,$s1,$s2 # f = g + h 1) operation by name 2) operand getting result (“destination”) 3) 1st operand for operation (“source1”) 4) 2nd operand for operation (“source2”) Each instruction is 32 bits Syntax is rigid: 1 operator, 3 operands Why? Keep hardware simple via regularity Design Principle 1: Simplicity favors regularity Regularity makes implementation simpler Simplicity enables higher performance at lower cost Instruction Set-15 Computer Architecture Register Architecture Accumulator (1 register): 1 address: add A acc acc + mem[A] 1+x address: addx A acc acc + mem[A+x] Stack: 0 address: tos tos + next General Purpose Register: 2 address: 3 address: add add A,B EA(A) EA(A) + EA(B) add A,B,C EA(A) EA(B) + EA(C) Load/Store: (a special case of GPR) 3 address: add load store $ra,$rb,$rc $ra $rb + $rc $ra,$rb $ra mem[$rb] $ra,$rb mem[$rb] $ra Instruction Set-16 Computer Architecture Register Organization Affects Programming Code for C = A + B for four register organizations: Stack Accumulator Register Register (reg-mem) (load-store) Push A Load A Load $r1,A Load $r1,A Push B Add B Add $r1,B Load $r2,B Add Store C Store C,$r1 Add $r3,$r1,$r2 Pop C Store C,$r3 => Register organization is an attribute of ISA! Comparison: Byte per instruction? Number of instructions? Cycles per instruction? Since 1975 all machines use GPRs Instruction Set-17 Computer Architecture Outline Instruction set architecture Operands (Sec 2.2, 2.3) Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-18 Computer Architecture Memory Operands C variables map onto registers; what about large data structures like arrays? Memory contains such data structures But MIPS arithmetic instructions operate on registers, not directly on memory Data transfer instructions (lw, sw, ...) to transfer between memory and register A way to address memory operands Instruction Set-19 Computer Architecture Data Transfer: Memory to Register (1/2) To transfer a word of data, need to specify two things: Register: specify this by number (0 - 31) Memory address: more difficult Think of memory as a 1D array Address it by supplying a pointer to a memory address Offset (in bytes) from this pointer The desired memory address is the sum of these two values, e.g., 8($t0) Specifies the memory address pointed to by the value in $t0, plus 8 bytes (why “bytes”, not “words”?) Each address is 32 bits Instruction Set-20 Computer Architecture Data Transfer: Memory to Register (2/2) Load Instruction Syntax: 1 2 3 4 lw $t0,12($s0) 1) operation name 2) register that will receive value 3) numerical offset in bytes 4) register containing pointer to memory Example: lw $t0,12($s0) lw (Load Word, so a word (32 bits) is loaded at a time) Take the pointer in $s0, add 12 bytes to it, and then load the value from the memory pointed to by this calculated sum into register $t0 Notes: $s0 is called the base register, 12 is called the offset Offset is generally used in accessing elements of array: base register points to the beginning of the array Instruction Set-21 Computer Architecture Example $s0 lw = 1000 Memory ‧ ‧ ‧ 1000 $t0, 12($s0) 1004 $t0 =? 1008 1012 999 1016 ‧ ‧ ‧ Instruction Set-22 Computer Architecture Data Transfer: Register to Memory Also want to store value from a register into memory Store instruction syntax is identical to Load instruction syntax Example: sw $t0,12($s0) sw (meaning Store Word, so 32 bits or one word are stored at a time) This instruction will take the pointer in $s0, add 12 bytes to it, and then store the value from register $t0 into the memory address pointed to by the calculated sum Instruction Set-23 Computer Architecture Example $s0 = 1000 $t0 = 25 sw Memory ‧ ‧ ‧ 1000 $t0, 12($s0) 1004 1008 M[?] = 25 1012 1016 ‧ ‧ ‧ Instruction Set-24 Computer Architecture Compilation with Memory Compile by hand using registers: $s1:g, $s2:h, $s3:base address of A g = h + A[8]; What offset in lw to select an array element A[8] in a C program? 4x8=32 bytes to select A[8] 1st transfer from memory to register: lw $t0,32($s3) # $t0 gets A[8] Add 32 to $s3 to select A[8], put into $t0 Next add it to h and place in g add $s1,$s2,$t0 # $s1 = h+A[8] Instruction Set-25 Computer Architecture Memory Operand Example 2 C code: A[12] = h + A[8]; h in $s2, base address of A in $s3 Compiled MIPS code: Index 8 requires offset of 32 lw $t0, 32($s3) add $t0, $s2, $t0 sw $t0, 48($s3) # load word # store word Instruction Set-26 Computer Architecture Addressing: Byte versus Word Every word in memory has an address, similar to an index in an array Early computers numbered words like C numbers elements of an array: Memory[0], Memory[1], Memory[2], … Called the “address” of a word Computers need to access 8-bit bytes as well as words (4 bytes/word) Today, machines address memory as bytes, hence word addresses differ by 4 Memory[0], Memory[4], Memory[8], … This is also why lw and sw use bytes in offset Instruction Set-27 Computer Architecture A Note about Memory: Alignment MIPS requires that all words start at addresses that are multiples of 4 bytes 0 1 2 3 Aligned Not Aligned Called Alignment: objects must fall on address that is multiple of their size Instruction Set-28 Computer Architecture Another Note: Endianess Byte order: numbering of bytes within a word Big Endian: address of most significant byte at least address of a word IBM 360/370, Motorola 68k, MIPS, Sparc, HP PA Little Endian: address of least significant byte at least address Intel 80x86, DEC Vax, DEC Alpha (Windows NT) little endian byte 0 3 2 1 0 msb 0 1 big endian byte 0 lsb 2 3 word address Instruction Set-29 Computer Architecture Role of Registers vs. Memory What if more variables than registers? Compiler tries to keep most frequently used variables in registers Writes less common variables to memory: spilling Why not keep all variables in memory? Smaller is faster: registers are faster than memory Registers more versatile: MIPS arithmetic instructions can read 2 registers, operate on them, and write 1 per instruction MIPS data transfers only read or write 1 operand per instruction, and no operation Instruction Set-30 Computer Architecture Outline Instruction set architecture Operands (Sec 2.2, 2.3) Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-31 Computer Architecture Constants Small constants used frequently (50% of operands) e.g., A = A + 5; B = B + 1; C = C - 18; Put 'typical constants' in memory and load them Constant data specified in an instruction: addi $29, $29, 4 slti $8, $18, 10 andi $29, $29, 6 ori $29, $29, 4 Design Principle 3: Make the common case fast Instruction Set-32 Computer Architecture Immediate Operands Immediate: numerical constants Often appear in code, so there are special instructions for them Add Immediate: f = g + 10 (in C) addi $s0,$s1,10 (in MIPS) where $s0,$s1 are associated with f,g Syntax similar to add instruction, except that last argument is a number instead of a register No subtract immediate instruction Just use a negative constant addi $s2, $s1, -1 Instruction Set-33 Computer Architecture The Constant Zero The number zero (0), appears very often in code; so we define register zero MIPS register 0 ($zero) is the constant 0 Cannot be overwritten This is defined in hardware, so an instruction like addi $0,$0,5 will not do anything Useful for common operations E.g., move between registers add $t2, $s1, $zero Instruction Set-34 Computer Architecture Outline Instruction set architecture Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers (Sec 2.4, read by students) Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-35 Computer Architecture Outline Instruction set architecture Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions (Sec 2.5) Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-36 Computer Architecture Instructions as Numbers Currently we only work with words (32-bit blocks): Each register is a word lw and sw both access memory one word at a time So how do we represent instructions? Remember: Computer only understands 1s and 0s, so “add $t0,$0,$0” is meaningless to hardware MIPS wants simplicity: since data is in words, make instructions be words… Instruction Set-37 Computer Architecture MIPS Instruction Format One instruction is 32 bits => divide instruction word into “fields” Each field tells computer something about instruction We could define different fields for each instruction, but MIPS is based on simplicity, so define 3 basic types of instruction formats: R-format: for register I-format: for immediate, and lw and sw (since the offset counts as an immediate) J-format: for jump Instruction Set-38 Computer Architecture R-Format Instructions (1/2) Define the following “fields”: 6 opcode 5 rs 5 rt 5 rd 5 shamt 6 funct opcode: partially specifies what instruction it is (Note: 0 for all R-Format instructions) funct: combined with opcode to specify the instruction Question: Why aren’t opcode and funct a single 12-bit field? rs (Source Register): generally used to specify register containing first operand rt (Target Register): generally used to specify register containing second operand rd (Destination Register): generally used to specify register which will receive result of computation Instruction Set-39 Computer Architecture R-Format Instructions (2/2) Notes about register fields: Each register field is exactly 5 bits, which means that it can specify any unsigned integer in the range 0-31. Each of these fields specifies one of the 32 registers by number. Final field: shamt: contains the amount a shift instruction will shift by. Shifting a 32-bit word by more than 31 is useless, so this field is only 5 bits This field is set to 0 in all but the shift instructions Instruction Set-40 Computer Architecture R-format Example op rs rt rd shamt funct 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits add $t0, $s1, $s2 Special $s1 $s2 $t0 0 add 0 17 18 8 0 32 000000 10001 10010 01000 00000 100000 000000100011001001000000001000002 = 0232402016 Instruction Set-41 Computer Architecture Hexadecimal Base 16 0 1 2 3 Compact representation of bit strings 4 bits per hex digit 0000 0001 0010 0011 4 5 6 7 0100 0101 0110 0111 8 9 a b 1000 1001 1010 1011 c d e f 1100 1101 1110 1111 Example: eca8 6420 1110 1100 1010 1000 0110 0100 0010 0000 Instruction Set-42 Computer Architecture I-Format Instructions Define the following “fields”: 6 opcode 5 rs 5 rt 16 immediate opcode: uniquely specifies an I-format instruction rs: specifies the only register operand rt: specifies register which will receive result of computation (target register) addi, slti, immediate is sign-extended to 32 bits, and treated as a signed integer 16 bits can be used to represent immediate up to 216 different values Instruction Set-43 Computer Architecture MIPS I-format Instructions Design Principle 4: Good design demands good compromises Different formats complicate decoding, but allow 32-bit instructions uniformly Keep formats as similar as possible Instruction Set-44 Computer Architecture I-Format Example 1 MIPS Instruction: addi $21,$22,-50 opcode = 8 (look up in table) rs = 22 (register containing operand) rt = 21 (target register) immediate = -50 (by default, this is decimal) decimal representation: 8 22 21 -50 binary representation: 001000 10110 10101 1111111111001110 Instruction Set-45 Computer Architecture I-Format Example 2 MIPS Instruction: lw $t0,1200($t1) opcode = 35 (look up in table) rs = 9 (base register) rt = 8 (destination register) immediate = 1200 (offset) decimal representation: 35 9 8 1200 binary representation: 100011 01001 01000 0000010010110000 Instruction Set-46 Computer Architecture Stored Program Computers The BIG Picture Instructions represented in binary, just like data Instructions and data stored in memory Programs can operate on programs e.g., compilers, linkers, … Binary compatibility allows compiled programs to work on different computers Standardized ISAs Instruction Set-47 Computer Architecture Outline Instruction set architecture Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical (Sec 2.6) Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-48 Computer Architecture Bitwise Operations Up until now, we’ve done arithmetic (add, sub, addi) and memory access (lw and sw) All of these instructions view contents of register as a single quantity (such as a signed or unsigned integer) New perspective: View contents of register as 32 bits rather than as a single 32-bit number Since registers are composed of 32 bits, we may want to access individual bits rather than the whole. Introduce two new classes of instructions: Shift instructions Logical operators Instruction Set-49 Computer Architecture Logical Operations Instructions for bitwise manipulation Operation C Java MIPS Shift left << << sll Shift right >> >>> srl Bitwise AND & & and, andi Bitwise OR | | or, ori Bitwise NOT ~ ~ nor Useful for extracting and inserting groups of bits in a word Instruction Set-50 Computer Architecture Shift Operations rs rt rd shamt funct 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits shamt: how many positions to shift Shift left logical op Shift left and fill with 0 bits sll by i bits multiplies by 2i Shift right logical Shift right and fill with 0 bits srl by i bits divides by 2i (unsigned only) Instruction Set-51 Computer Architecture Shift Instructions (1/3) Shift Instruction Syntax: 1 2 3 sll 4 $t2,$s0,4 1) operation name 2) register that will receive value 3) first operand (register) 4) shift amount (constant) MIPS has three shift instructions: sll (shift left logical): shifts left, fills empties with 0s srl (shift right logical): shifts right, fills empties with 0s sra (shift right arithmetic): shifts right, fills empties by sign extending Instruction Set-52 Computer Architecture Shift Instructions (2/3) Move (shift) all the bits in a word to the left or right by a number of bits, filling the emptied bits with 0s. Example: shift right by 8 bits 0001 0010 0011 0100 0101 0110 0111 1000 0000 0000 0001 0010 0011 0100 0101 0110 Example: shift left by 8 bits 0001 0010 0011 0100 0101 0110 0111 1000 0011 0100 0101 0110 0111 1000 0000 0000 Instruction Set-53 Computer Architecture Shift Instructions (3/3) Example: shift right arithmetic by 8 bits 0001 0010 0011 0100 0101 0110 0111 1000 0000 0000 0001 0010 0011 0100 0101 0110 Example: shift right arithmetic by 8 bits 1001 0010 0011 0100 0101 0110 0111 1000 1111 1111 1001 0010 0011 0100 0101 0110 Instruction Set-54 Computer Architecture Uses for Shift Instructions Shift for multiplication: in binary Multiplying by 4 is same as shifting left by 2: 112 x 1002 = 11002 10102 x 1002 = 1010002 Multiplying by 2n is same as shifting left by n Since shifting is so much faster than multiplication (you can imagine how complicated multiplication is), a good compiler usually notices when C code multiplies by a power of 2 and compiles it to a shift instruction: a *= 8; would compile to: sll $s0,$s0,3 (in C) (in MIPS) Instruction Set-55 Computer Architecture AND Operations Useful to mask bits in a word Select some bits, clear others to 0 and $t0, $t1, $t2 $t2 0000 0000 0000 0000 0000 1101 1100 0000 $t1 0000 0000 0000 0000 0011 1100 0000 0000 $t0 0000 0000 0000 0000 0000 1100 0000 0000 Instruction Set-56 Computer Architecture OR Operations Useful to include bits in a word Set some bits to 1, leave others unchanged or $t0, $t1, $t2 $t2 0000 0000 0000 0000 0000 1101 1100 0000 $t1 0000 0000 0000 0000 0011 1100 0000 0000 $t0 0000 0000 0000 0000 0011 1101 1100 0000 Instruction Set-57 Computer Architecture NOT Operations Useful to invert bits in a word Change 0 to 1, and 1 to 0 MIPS has NOR 3-operand instruction a NOR b == NOT ( a OR b ) nor $t0, $t1, $zero Register 0: always read as zero $t1 0000 0000 0000 0000 0011 1100 0000 0000 $t0 1111 1111 1111 1111 1100 0011 1111 1111 Instruction Set-58 Computer Architecture So Far... All instructions have allowed us to manipulate data. So we’ve built a calculator. In order to build a computer, we need ability to make decisions… Instruction Set-59 Computer Architecture Outline Instruction set architecture Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches (Sec 2.7) Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-60 Computer Architecture MIPS Decision Instructions beq register1, register2, L1 Decision instruction in MIPS: beq register1, register2, L1 “Branch if (registers are) equal” meaning : if (register1==register2) goto L1 Complementary MIPS decision instruction bne register1, register2, L1 “Branch if (registers are) not equal” meaning : if (register1!=register2) goto L1 These are called conditional branches Instruction Set-61 Computer Architecture MIPS Goto Instruction j MIPS has an unconditional branch: j label label Called a Jump Instruction: jump directly to the given label without testing any condition meaning : goto label Technically, it’s the same as: beq $0,$0,label since it always satisfies the condition It has the j-type instruction format Instruction Set-62 Computer Architecture Compiling C if into MIPS Compile by hand if (i == j) f=g+h; else f=g-h; Use this mapping: Final compiled MIPS code: f, g.., j : $s0,$s1, $s2, $s3, $s4 Else: Exit: bne add j sub $s3,$s4,Else $s0,$s1,$s2 Exit $s0,$s1,$s2 (true) i == j i == j? f=g+h # # # # (false) i != j f=g-h Exit branch i!=j f=g+h(true) go to Exit f=g-h (false) Note: Compiler automatically creates labels to handle decisions (branches) appropriately Instruction Set-63 Computer Architecture Compiling Loop Statements C code: while (save[i] == k) i += 1; i in $s3, k in $s5, address of save in $s6 Compiled MIPS code: Loop: Exit: … sll add lw bne addi j $t1, $t1, $t0, $t0, $s3, Loop $s3, 2 $t1, $s6 0($t1) $s5, Exit $s3, 1 Instruction Set-64 #$t1=i x 4 #$t1=addr of save[i] #$t0=save[i] #if save[i]!=k goto Exit #i=i+1 #goto Loop Computer Architecture Basic Blocks A basic block is a sequence of instructions with No embedded branches (except at end) No branch targets (except at beginning) A compiler identifies basic blocks for optimization An advanced processor can accelerate execution of basic blocks Instruction Set-65 Computer Architecture Inequalities in MIPS Until now, we’ve only tested equalities (== and != in C), but general programs need to test < and > Set on Less Than: slt rd, rs, rt if (rs < rt) rd = 1; else rd = 0; slti rt, rs, constant if (rs < constant) rt = 1; else rt = 0; Compile by hand: if (g < h) goto Less; Let g: $s0, h: $s1 slt $t0,$s0,$s1 bne $t0,$0,Less # $t0 = 1 if g<h # goto Less if $t0!=0 MIPS has no “branch on less than” => too complex Instruction Set-66 Computer Architecture Branch Instruction Design Why not blt, bge, etc? Hardware for <, ≥, … slower than =, ≠ Combining with branch involves more work per instruction, requiring a slower clock All instructions penalized! beq and bne are the common case This is a good design compromise Instruction Set-67 Computer Architecture Signed vs. Unsigned Signed comparison: slt, slti Unsigned comparison: sltu, sltui Example $s0 = 1111 1111 1111 1111 1111 1111 1111 1111 $s1 = 0000 0000 0000 0000 0000 0000 0000 0001 slt $t0, $s0, $s1 # signed –1 < +1 $t0 = 1 sltu $t0, $s0, $s1 # unsigned +4,294,967,295 > +1 $t0 = 0 Instruction Set-68 Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware (Sec. 2.8) Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-69 Computer Architecture Procedure Calling Steps required Caller: 1. Place parameters in registers 2. Transfer control to procedure Callee: 3. Acquire storage for procedure 4. Perform procedure’s operations 5. Place result in register for caller 6. Return to place of call Instruction Set-70 Computer Architecture C Function Call Bookkeeping sum = leaf_example(a,b,c,d) . . . int leaf_example (int g, h, i, j) { int f; f = (g + h) - (i + j); return f; } Return address $ra Procedure address Labels Arguments $a0, $a1, $a2, $a3 Return value $v0, $v1 Local variables $s0, $s1, …, $s7 Note the use of register conventions Instruction Set-71 Computer Architecture Registers Conventions for MIPS 0 zero constant 0 16 s0 callee saves 1 at ... 2 v0 expression evaluation & 23 s7 3 v1 function results 24 t8 4 a0 arguments 25 t9 5 a1 26 k0 reserved for OS kernel 6 a2 27 k1 7 a3 28 gp pointer to global area 8 t0 ... 15 t7 reserved for assembler (caller can clobber) temporary (cont’d) temporary: caller saves 29 sp stack pointer (callee can clobber) 30 fp frame pointer 31 ra return address (HW) Fig. 2.18 Instruction Set-72 Computer Architecture Procedure Call Instructions Procedure call: jump and link jal ProcedureLabel Address of following instruction put in $ra Jumps to target address (i.e.,ProcedureLabel) Procedure return: jump register jr $ra Copies $ra to program counter Can also be used for computed jumps e.g., for case/switch statements Jump table is an array of addresses corresponding to labels in codes Load appropriate entry to register Jump register Instruction Set-73 Computer Architecture Caller’s Code . . . sum = leaf_example(a,b,c,d) . . . MIPS code: a, …, d in $s0, …, $s3, and sum in $s4 : add add add add jal add $a0, $0, $s0 $a1, $0, $s1 $a2, $0, $s2 $a3, $0, $s3 leaf_example $s4, $0, $v0 Move a,b,c,d to a0..a3 Jump to leaf_example Move result in v0 to sum : Instruction Set-74 Computer Architecture Leaf Procedure Example C code: int leaf_example (int g, h, i, j) { int f; f = (g + h) - (i + j); return f; } Arguments g, …, j in $a0, …, $a3 f in $s0 (hence, need to save $s0 on stack) Save $t1 and $t2 Result in $v0 Instruction Set-75 Computer Architecture Leaf Procedure Example MIPS code: leaf_example: addi $sp, $sp, -12 sw $s0, 0($sp) sw $t0, 4($sp) sw $t1, 8($sp) add $t0, $a0, $a1 add $t1, $a2, $a3 sub $s0, $t0, $t1 add $v0, $s0, $zero lw $s0, 0($sp) lw $t0, 4($sp) lw $t1, 8($sp) addi $sp, $sp, 12 jr $ra Instruction Set-76 Save $s0 $t0 $t1 on stack Procedure body Result Restore $s0 $t0 $t1 Return Computer Architecture Leaf Procedure Example C code: int leaf_example (int g, h, i, j) { int f; f = (g + h) - (i + j); return f; } Arguments g, …, j in $a0, …, $a3 f in $s0 (hence, need to save $s0 on stack) $t1 and $t2 are not saved on stack Result in $v0 Instruction Set-77 Computer Architecture Leaf Procedure Example MIPS code: leaf_example: addi $sp, $sp, -4 sw $s0, 0($sp) add $t0, $a0, $a1 add $t1, $a2, $a3 sub $s0, $t0, $t1 add $v0, $s0, $zero lw $s0, 0($sp) addi $sp, $sp, 4 jr $ra Instruction Set-78 Save $s0 on stack Procedure body Result Restore $s0 Return Computer Architecture Local Data on the Stack High address High address $sp High address $sp $sp Contents of $s0 Instruction Set-79 Computer Architecture Non-Leaf Procedures Procedures that call other procedures For nested call, caller needs to save on the stack: Its return address Any arguments and temporaries needed after the call (because callee will not save them) Restore from the stack after the call Instruction Set-80 Computer Architecture Non-Leaf Procedure Example C code: int fact (int n) { if (n < 1) return 1; else return n * fact(n - 1); } Argument n in $a0 Result in $v0 Instruction Set-81 Computer Architecture Non-Leaf Procedure Example MIPS code: fact: addi sw sw slti beq addi addi jr L1: addi jal lw lw addi mul jr $sp, $ra, $a0, $t0, $t0, $v0, $sp, $ra $a0, fact $a0, $ra, $sp, $v0, $ra $sp, -8 4($sp) 0($sp) $a0, 1 $zero, L1 $zero, 1 $sp, 8 $a0, -1 0($sp) 4($sp) $sp, 8 $a0, $v0 # # # # adjust stack for 2 items save return address save argument test for n < 1 # # # # # # # # # # if so, result is 1 pop 2 items from stack and return else decrement n recursive call restore original n and return address pop 2 items from stack multiply to get result and return Instruction Set-82 Computer Architecture Local Data on the Stack Local data allocated by callee e.g., C automatic variables Procedure frame (activation record) Used by some compilers to manage stack storage Instruction Set-83 Computer Architecture Memory Layout Text: program code Static data: global variables e.g., static variables in C, constant arrays and strings $gp initialized to address allowing ±offsets into this segment Dynamic data: heap E.g., malloc in C, new in Java Stack: automatic storage Instruction Set-84 Computer Architecture Why Procedure Conventions? Definitions Caller: function making the call, using jal Callee: function being called Procedure conventions as a contract between the Caller and the Callee If both the Caller and Callee obey the procedure conventions, there are significant benefits People who have never seen or even communicated with each other can write functions that work together Recursion functions work correctly Instruction Set-85 Computer Architecture Caller’s Rights, Callee’s Rights Callees’ rights: To ensure callees’s right, caller saves registers: Return address Arguments Return value $t Registers $ra $a0, $a1, $a2, $a3 $v0, $v1 $t0 - $t9 Callers’ rights: Right to use VAT registers freely Right to assume arguments are passed correctly Right to use S registers without fear of being overwritten by callee Right to assume return value will be returned correctly To ensure caller’s right, callee saves registers: $s Registers $s0 - $s7 Instruction Set-86 Computer Architecture Contract in Function Calls (1/2) Caller’s responsibilities (how to call a function) Slide $sp down to reserve memory: e.g., addi $sp, $sp, -28 Save $ra on stack because jal clobbers it: e.g., sw $ra, 24 ($sp) If still need their values after function call, save $v, $a, $t on stack or copy to $s registers Put first 4 words of arguments in $a0-3, additional arguments go on stack: “a4” is 16($sp) jal to the desired function Receive return values in $v0, $v1 Undo first steps: e.g. lw $t0, 20($sp) lw $ra, 24($sp) addi $sp, $sp, 28 Instruction Set-87 Computer Architecture Contract in Function Calls (2/2) Callee’s responsibilities (i.e. how to write a function) If using $s or big local structures, slide $sp down to reserve memory: e.g., addi $sp, $sp, -48 If using $s, save before using: e.g., sw $s0, 44($sp) Receive arguments in $a0-3, additional arguments on stack Run the procedure body If not void, put return values in $v0,1 If applicable, undo first two steps: e.g., lw $s0, 44($sp) addi $sp, $sp, 48 jr $ra Instruction Set-88 Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people (Sec. 2.9) Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-89 Computer Architecture Character Data Byte-encoded character sets ASCII: 128 characters 95 graphic, 33 control Latin-1: 256 characters ASCII, +96 more graphic characters Unicode: 32-bit character set Used in Java, C++ wide characters, … Most of the world’s alphabets, plus symbols UTF-8, UTF-16: variable-length encodings Instruction Set-90 Computer Architecture Byte/Halfword Operations Could use bitwise operations MIPS byte/halfword load/store String processing is a common case lb rt, offset(rs) lh rt, offset(rs) Sign extend to 32 bits in rt lbu rt, offset(rs) lhu rt, offset(rs) Zero extend to 32 bits in rt sb rt, offset(rs) sh rt, offset(rs) Store just rightmost byte/halfword Instruction Set-91 Computer Architecture Load Byte Signed/Unsigned $t0 … 12 F7 F0 … lb $t1, 0($t0) $t1 ? Sign-extended lbu $t2, 0($t0) $t2 ? Zero-extended Instruction Set-92 Computer Architecture String Copy Example C code (naïve): Null-terminated string void strcpy (char x[], char y[]) { int i; i = 0; while ((x[i]=y[i])!='\0') i += 1; } Addresses of x, y in $a0, $a1 i in $s0 Instruction Set-93 Computer Architecture String Copy Example MIPS code: strcpy: addi sw add L1: add lbu add sb beq addi j L2: lw addi jr $sp, $s0, $s0, $t1, $t2, $t3, $t2, $t2, $s0, L1 $s0, $sp, $ra $sp, -4 0($sp) $zero, $zero $s0, $a1 0($t1) $s0, $a0 0($t3) $zero, L2 $s0, 1 0($sp) $sp, 4 # # # # # # # # # # # # # Instruction Set-94 adjust stack for 1 item save $s0 i = 0 addr of y[i] in $t1 $t2 = y[i] addr of x[i] in $t3 x[i] = y[i] exit loop if y[i] == 0 i = i + 1 next iteration of loop restore saved $s0 pop 1 item from stack and return Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses (Sec. 2.10) Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-95 Computer Architecture 32-bit Constants Most constants are small 16-bit immediate is sufficient For the occasional 32-bit constant Load Upper Immediate: lui rt, constant Copies 16-bit constant to left 16 bits of rt Clears right 16 bits of rt to 0 machine version of lui 001111 00000 10000 0000 0000 0011 1101 lui $s0, 61 0000 0000 0011 1101 0000 0000 0000 0000 S0 ori $s0, $s0, 2304 0000 0000 0011 1101 0000 1001 0000 0000 S0 Instruction Set-96 Computer Architecture Branch Addressing (1) Use I-format: opcode rs rt immediate opcode specifies beq or bne Rs and Rt specify registers to compare What can immediate specify? PC-relative addressing Immediate is only 16 bits, but PC is 32-bit => immediate cannot specify entire address Loops are generally small: < 50 instructions Though we want to branch to anywhere in memory, a single branch only need to change PC by a small amount How to use PC-relative addressing 16-bit immediate as a signed two’s complement integer to be added to the PC if branch taken 15 bytes from the PC ? Now we can branchInstruction +/- 2Set-97 Computer Architecture Branch Addressing (2) Immediate specifies word address Instructions are word aligned (byte address is always a multiple of 4, i.e., it ends with 00 in binary) The number of bytes to add to the PC will always be a multiple of 4 Specify the immediate in words (confusing?) Now, we can branch +/- 215 words from the PC (or +/217 bytes), handle loops 4 times as large Immediate specifies PC + 4 Due to hardware, add immediate to (PC+4), not to PC If branch not taken: PC = PC + 4 If branch taken: PC = (PC+4) + (immediate*4) Instruction Set-98 Computer Architecture Branch Example MIPS Code: Loop: beq add addi j End: $9,$0,End $8,$8,$10 $9,$9,-1 Loop Branch is I-Format: opcode rs rt immediate opcode = 4 (look up in table) rs = 9 (first operand) rt = 0 (second operand) immediate = ??? Number of instructions to add to (or subtract from) the PC, starting at the instruction following the branch => immediate = ? Instruction Set-99 Computer Architecture Branch Example MIPS Code: Loop: beq add addi j End: $9,$0,End $8,$8,$10 $9,$9,-1 Loop decimal representation: 4 9 0 3 binary representation: 000100 01001 00000 0000000000000011 Instruction Set-100 Computer Architecture Jump Addressing (1/3) For branches, we assumed that we won’t want to branch too far, so we can specify change in PC. For general jumps (j and jal), we may jump to anywhere in memory. Ideally, we could specify a 32-bit memory address to jump to. Unfortunately, we can’t fit both a 6-bit opcode and a 32-bit address into a single 32-bit word, so we compromise. Instruction Set-101 Computer Architecture Jump Addressing (2/3) Define “fields” of the following number of bits each: 6 bits As usual, each field has a name: opcode target address Key concepts: 26 bits Keep opcode field identical to R-format and I-format for consistency Combine other fields to make room for target address Optimization: Jumps only jump to word aligned addresses last two bits are always 00 (in binary) specify 28 bits of the 32-bit bit address Instruction Set-102 Computer Architecture Jump Addressing (3/3) Where do we get the other 4 bits? Summary: Take the 4 highest order bits from the PC Technically, this means that we cannot jump to anywhere in memory, but it’s adequate 99.9999…% of the time, since programs aren’t that long Linker and loader avoid placing a program across an address boundary of 256 MB New PC = PC[31..28] || target address (26 bits) || 00 Note: II means concatenation 4 bits || 26 bits || 2 bits = 32-bit address If we absolutely need to specify a 32-bit address: Use jr $ra # jump to the address specified by $ra Instruction Set-103 Computer Architecture Target Addressing Example Loop code from earlier example Assume Loop at location 80000 $t1, $s3, 2 80000 0 0 19 9 4 0 add $t1, $t1, $s6 80004 0 9 22 9 0 32 lw $t0, 0($t1) 80008 35 9 8 0 bne $t0, $s5, Exit 80012 5 8 21 2 addi $s3, $s3, 1 80016 8 19 19 1 j 80020 2 Loop: sll Loop 80024 Exit: … 20000 80016 + 2 x 4 = 80024 20000 x 4 = 80000 Instruction Set-104 Computer Architecture Branching Far Away If branch target is too far to encode with 16-bit offset, assembler rewrites the code Example beq $s0,$s1, L1 ↓ bne $s0,$s1, L2 j L1 L2: … Instruction Set-105 Computer Architecture MIPS Addressing Mode Instruction Set-106 Computer Architecture MPIS Addressing Modes Instruction Set-107 Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program (Sec. 2.12) A sort example Arrays versus pointers ARM and x86 instruction sets Instruction Set-108 Computer Architecture Translation and Startup Many compilers produce object modules directly Static linking Instruction Set-109 Computer Architecture Assembler Pseudoinstructions Most assembler instructions represent machine instructions one-to-one Pseudo instructions: figments of the assembler’s imagination move $t0, $t1 → add $t0, $zero, $t1 blt $t0, $t1, L → slt $at, $t0, $t1 bne $at, $zero, L $at (register 1): assembler temporary Instruction Set-110 Computer Architecture Producing an Object Module Assembler (or compiler) translates program into machine instructions Provides information for building a complete program from the pieces Header: described contents of object module Text segment: translated instructions Static data segment: data allocated for the life of the program Relocation info: for contents that depend on absolute location of loaded program Symbol table: global definitions and external refs Debug info: for associating with source code Instruction Set-111 Computer Architecture Linking Object Modules Produces an executable image 1.Merges segments 2.Resolve labels (determine their addresses) 3.Patch location-dependent and external refs Could leave location dependencies for fixing by a relocating loader But with virtual memory, no need to do this Program can be loaded into absolute location in virtual memory space Instruction Set-112 Computer Architecture Loading a Program Load from image file on disk into memory 1.Read header to determine segment sizes 2.Create virtual address space 3.Copy text and initialized data into memory Or set page table entries so they can be faulted in 4.Set up arguments on stack 5.Initialize registers (including $sp, $fp, $gp) 6.Jump to startup routine Copies arguments to $a0, … and calls main When main returns, do exit syscall Instruction Set-113 Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example (Sec. 2.13) Arrays versus pointers ARM and x86 instruction sets Instruction Set-114 Computer Architecture C Sort Example Illustrates use of assembly instructions for a C bubble sort function Swap procedure (leaf) void swap(int v[], int k) { int temp; temp = v[k]; v[k] = v[k+1]; v[k+1] = temp; } v in $a0, k in $a1, temp in $t0 Instruction Set-115 Computer Architecture The Procedure Swap swap: sll $t1, $a1, 2 # $t1 = k * 4 add $t1, $a0, $t1 # $t1 = v+(k*4) # (address of v[k]) lw $t0, 0($t1) # $t0 (temp) = v[k] lw $t2, 4($t1) # $t2 = v[k+1] sw $t2, 0($t1) # v[k] = $t2 (v[k+1]) sw $t0, 4($t1) # v[k+1] = $t0 (temp) jr $ra # return to calling routine Instruction Set-116 Computer Architecture The Sort Procedure in C Non-leaf (calls swap) void sort (int v[], int n) { int i, j; for (i = 0; i < n; i += 1) { for (j = i – 1; j >= 0 && v[j] > v[j + 1]; j -= 1) { swap(v,j); } } } v in $a0, k in $a1, i in $s0, j in $s1 Instruction Set-117 Computer Architecture The Procedure Body move move move for1tst: slt beq addi for2tst: slti bne sll add lw lw slt beq move move jal addi j exit2: addi j $s2, $a0 $s3, $a1 $s0, $zero $t0, $s0, $s3 $t0, $zero, exit1 $s1, $s0, –1 $t0, $s1, 0 $t0, $zero, exit2 $t1, $s1, 2 $t2, $s2, $t1 $t3, 0($t2) $t4, 4($t2) $t0, $t4, $t3 $t0, $zero, exit2 $a0, $s2 $a1, $s1 swap $s1, $s1, –1 for2tst $s0, $s0, 1 for1tst # # # # # # # # # # # # # # # # # # # # # save $a0 into $s2 Move params save $a1 into $s3 i = 0 Outer loop $t0 = 0 if $s0 ≥ $s3 (i ≥ n) go to exit1 if $s0 ≥ $s3 (i ≥ n) j = i – 1 $t0 = 1 if $s1 < 0 (j < 0) go to exit2 if $s1 < 0 (j < 0) $t1 = j * 4 Inner loop $t2 = v + (j * 4) $t3 = v[j] $t4 = v[j + 1] $t0 = 0 if $t4 ≥ $t3 go to exit2 if $t4 ≥ $t3 1st param of swap is v (old $a0) Pass 2nd param of swap is j params & call call swap procedure j –= 1 Inner loop jump to test of inner loop i += 1 Outer loop jump to test of outer loopComputer Architecture Instruction Set-118 The Full Procedure sort: exit1: addi $sp,$sp, –20 sw $ra, 16($sp) sw $s3,12($sp) sw $s2, 8($sp) sw $s1, 4($sp) sw $s0, 0($sp) … … lw $s0, 0($sp) lw $s1, 4($sp) lw $s2, 8($sp) lw $s3,12($sp) lw $ra,16($sp) addi $sp,$sp, 20 jr $ra # # # # # # # make room on stack for 5 registers save $ra on stack save $s3 on stack save $s2 on stack save $s1 on stack save $s0 on stack procedure body # # # # # # # restore $s0 from stack restore $s1 from stack restore $s2 from stack restore $s3 from stack restore $ra from stack restore stack pointer return to calling routine Instruction Set-119 Computer Architecture Effect of Compiler Optimization Compiled with gcc for Pentium 4 under Linux Relative Performance 3 140000 Instruction count 120000 2.5 100000 2 80000 1.5 60000 1 40000 0.5 20000 0 0 none 180000 160000 140000 120000 100000 80000 60000 40000 20000 0 O1 O2 none O3 O1 O3 CPI 2 Clock Cycles O2 1.5 1 0.5 0 none O1 O2 O3 none Instruction Set-120 O1 O2 O3 Computer Architecture Effect of Language and Algorithm Bubblesort Relative Performance 3 2.5 2 1.5 1 0.5 0 C/none C/O1 C/O2 C/O3 Java/int Java/JIT Quicksort Relative Performance 2.5 2 1.5 1 0.5 0 C/none C/O1 C/O2 C/O3 Java/int Java/JIT Quicksort vs. Bubblesort Speedup 3000 2500 2000 1500 1000 500 0 C/none C/O1 C/O2 C/O3 Instruction Set-121 Java/int Java/JIT Computer Architecture Lessons Learnt Instruction count and CPI are not good performance indicators in isolation Compiler optimizations are sensitive to the algorithm Nothing can fix a dumb algorithm! Instruction Set-122 Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program (Sec. 2.12) A sort example Arrays versus pointers (Sec. 2.14) ARM and x86 instruction sets Instruction Set-123 Computer Architecture Arrays vs. Pointers Array indexing involves Multiplying index by element size Adding to array base address Pointers correspond directly to memory addresses Can avoid indexing complexity Instruction Set-124 Computer Architecture Example: Clearing an Array clear1(int array[], int size) { int i; for (i = 0; i < size; i += 1) array[i] = 0; } clear2(int *array, int size) { int *p; for (p = &array[0]; p < &array[size]; p = p + 1) *p = 0; } move $t0,$zero loop1: sll $t1,$t0,2 add $t2,$a0,$t1 move $t0, $a0 # p = & array[0] sll $t1, $a1, 2 # $t1 = size * 4 add $t2,$a0,$t1 # $t2 = # &array[size] loop2: sw $zero,0($t0) # Memory[p] = 0 addi $t0,$t0,4 # p = p + 4 slt $t3,$t0,$t2 # $t3 = #(p<&array[size]) bne $t3,$zero,loop2 # if (…) # goto loop2 # i = 0 # $t1 = i * 4 # $t2 = # &array[i] sw $zero, 0($t2) # array[i] = 0 addi $t0,$t0,1 # i = i + 1 slt $t3,$t0,$a1 # $t3 = # (i < size) bne $t3,$zero,loop1 # if (…) # goto loop1 Instruction Set-125 Computer Architecture Comparison of Array vs. Ptr Multiply “strength reduced” to shift (strength reduction) Array version requires shift to be inside loop Part of index calculation for incremented i c.f. incrementing pointer Compiler can achieve same effect as manual use of pointers Eliminating array address calculations within loop (induction variable elimination): 6 instructions reduced to 4 in loop Better to make program clearer and safer Instruction Set-126 Computer Architecture Outline Instruction set architecture (using MIPS ISA as an example) Operands Register operands and their organization Memory operands, data transfer Immediate operands Signed and unsigned numbers Representing instructions Operations Logical Decision making and branches Supporting procedures in hardware Communicating with people Addressing for 32-bit immediate and addresses Translating and starting a program A sort example Arrays versus pointers ARM and x86 instruction sets (Sec. 2.15, 2.16) Instruction Set-127 Computer Architecture ARM & MIPS Similarities ARM: the most popular embedded core Similar basic set of instructions to MIPS ARM MIPS 1985 1985 Instruction size 32 bits 32 bits Address space 32-bit flat 32-bit flat Data alignment Aligned Aligned 9 3 15 × 32-bit 31 × 32-bit Memory mapped Memory mapped Date announced Data addressing modes Registers Input/output Instruction Set-128 Computer Architecture Compare and Branch in ARM Uses condition codes for result of an arithmetic/logical instruction Negative, zero, carry, overflow Compare instructions to set condition codes without keeping the result Each instruction can be conditional Top 4 bits of instruction word: condition value Can avoid branches over single instructions Instruction Set-129 Computer Architecture Instruction Encoding Instruction Set-130 Computer Architecture The Intel x86 ISA Evolution with backward compatibility 8080 (1974): 8-bit microprocessor Accumulator, plus 3 index-register pairs 8086 (1978): 16-bit extension to 8080 Complex instruction set (CISC) 8087 (1980): floating-point coprocessor Adds FP instructions and register stack 80286 (1982): 24-bit addresses, MMU Segmented memory mapping and protection 80386 (1985): 32-bit extension (now IA-32) Additional addressing modes and operations Paged memory mapping as well as segments Instruction Set-131 Computer Architecture The Intel x86 ISA Further evolution… i486 (1989): pipelined, on-chip caches and FPU Compatible competitors: AMD, Cyrix, … Pentium (1993): superscalar, 64-bit datapath Later versions added MMX (Multi-Media eXtension) instructions The infamous FDIV bug Pentium Pro (1995), Pentium II (1997) New microarchitecture (see Colwell, The Pentium Chronicles) Pentium III (1999) Added SSE (Streaming SIMD Extensions) and associated registers Pentium 4 (2001) New microarchitecture Computer Architecture Instruction Set-132 Added SSE2 instructions The Intel x86 ISA And further… AMD64 (2003): extended architecture to 64 bits EM64T – Extended Memory 64 Technology (2004) AMD64 adopted by Intel (with refinements) Added SSE3 instructions Intel Core (2006) Added SSE4 instructions, virtual machine support AMD64 (announced 2007): SSE5 instructions Intel declined to follow, instead… Advanced Vector Extension (announced 2008) Longer SSE registers, more instructions If Intel didn’t extend with compatibility, its competitors would! Technical elegance ≠ market success Instruction Set-133 Computer Architecture Basic x86 Registers Instruction Set-134 Computer Architecture Basic x86 Addressing Modes Two operands per instruction Source/dest operand Register Register Register Memory Memory Second source operand Register Immediate Memory Register Immediate Memory addressing modes Address in register Address = Rbase + displacement Address = Rbase + 2scale × Rindex (scale = 0, 1, 2, or 3) Address = Rbase + 2scale × Rindex + displacement Instruction Set-135 Computer Architecture x86 Instruction Encoding Variable length encoding Postfix bytes specify addressing mode Prefix bytes modify operation Operand length, repetition, locking, … Instruction Set-136 Computer Architecture Implementing IA-32 Complex instruction set makes implementation difficult Hardware translates instructions to simpler microoperations Simple instructions: 1–1 Complex instructions: 1–many Microengine similar to RISC Market share makes this economically viable Comparable performance to RISC Compilers avoid complex instructions Instruction Set-137 Computer Architecture Powerful instruction higher performance Fewer instructions required But complex instructions are hard to implement May slow down all instructions, including simple ones Compilers are good at making fast code from simple instructions Use assembly code for high performance But modern compilers are better at dealing with modern processors More lines of code more errors and less productivity Instruction Set-138 Computer Architecture §2.18 Fallacies and Pitfalls Fallacies Fallacies Backward compatibility instruction set doesn’t change But they do accrete more instructions x86 instruction set Instruction Set-139 Computer Architecture Pitfalls Sequential words are not at sequential addresses Increment by 4, not by 1! Keeping a pointer to an automatic variable after procedure returns e.g., passing pointer back via an argument Pointer becomes invalid when stack popped Instruction Set-140 Computer Architecture Concluding Remarks Design principles 1.Simplicity favors regularity 2.Smaller is faster 3.Make the common case fast 4.Good design demands good compromises Layers of software/hardware Compiler, assembler, hardware MIPS: typical of RISC ISAs c.f. x86 Instruction Set-141 Computer Architecture Concluding Remarks Measure MIPS instruction executions in benchmark programs Consider making the common case fast Consider compromises Instruction class MIPS examples SPEC2006 Int SPEC2006 FP Arithmetic Data transfer add, sub, addi lw, sw, lb, lbu, lh, lhu, sb, lui and, or, nor, andi, ori, sll, srl beq, bne, slt, slti, sltiu j, jr, jal 16% 35% 48% 36% 12% 4% 34% 8% 2% 0% Logical Cond. Branch Jump Instruction Set-142 Computer Architecture