ch2-1
ch2-1
Instructions:
Language of the Computer
Introduction
§
2.1
Instruction Set
• The repertoire of instructions of a computer
• Different computers have different
instruction sets
– But with many aspects in common
• Early computers had very simple
instruction sets
– Simplified implementation
• Many modern computers also have
simple instruction sets
The ARMv8 Instruction Set
• A subset, called LEGv8, used as the
example throughout the course
• Commercialized by ARM Holdings (www.arm.com)
• Large share of embedded core market
– Applications in consumer electronics,
network/storage equipment, cameras, printers, …
• Typical of many modern ISAs
– See ARM Reference Data tear-out card
Hardware
§
ADD a, b, c // a gets b + c
•
All arithmetic operations have this form
Hardware
§
• Compiled LEGv8
code: ADD X9, X20,
X21 ADD X10, X22,
X23 SUB X19, X9,
X10
Memory Operands
• Main memory used for composite data
– Arrays, structures, dynamic data
A[12] = h + A[8];
Using 32 bits
–2,147,483,648 to +2,147,483,647
2s-Complement Signed Integers
•
Bit 31 is sign bit
–
1 for negative numbers
–
0 for non-negative numbers
•
–(–2n – 1) can’t be represented
•
Non-negative numbers have the same unsigned
and 2s-complement representation
•
Some specific numbers
0: 0000 0000 … 0000
–1: 1111 1111 … 1111
Most-negative: 1000 0000 … 0000
Most-positive: 0111 1111 … 1111
Signed Negation
•
Complement and add 1
– Complement means 1 → 0, 0 → 1
xx 1
1111...111
2
x 1 x
Example: negate +2
+2 = 0000 0000 … 0010two
–2 = 1111 1111 … 1101two + 1
= 1111 1111 … 1110two
Sign Extension
•
Representing a number using more bits
–
Preserve the numeric value
•
Replicate the sign bit to the left
–
c.f. unsigned values: extend with 0s
•
Examples: 8-bit to 16-bit
– +2: 0000 0010 => 0000 0000 0000 0010
–
–2: 1111 1110 => 1111 1111 1111 1110
•
In LEGv8 instruction set
–
LDURSB: sign-extend loaded byte
–
LDURB: zero-extend loaded byte
Computer
§
•
LEGv8 instructions
–
Encoded as 32-bit instruction words
–
Small number of formats encoding operation
code (opcode), register numbers, …
–
Regularity!
LEGv8 R-format Instructions
opcode Rm shamt Rn Rd
11 bits 5 bits 6 bits 5 bits 5 bits
• Instruction fields
– opcode: operation code
– Rm: the second register source operand
– shamt: shift amount (00000 for now)
– Rn: the first register source operand
– Rd: the register destination
R-format Example
opcode Rm shamt Rn Rd
11 bits 5 bits 6 bits 5 bits 5 bits
ADD X9,X20,X21
8B15028916
LEGv8 D-format Instructions
opcode address op2 Rn Rt
11 bits 9 bits 2 bits 5 bits 5 bits
• Load/store instructions
– Rn: base register
– address: constant offset from contents of base register (+/-
32 doublewords)
– Rt: destination (load) or source (store) register number
• Immediate instructions
– Rn: source register
– Rd: destination register
Logical Operations
2.6 Logical
• Instructions for bitwise manipulation
Operation C Java LEGv8
Shift left << << LSL
Shift right >> >>> LSR
Bit-by-bit AND & & AND, ANDI
Bit-by-bit OR | | OR, ORI
Bit-by-bit NOT ~ ~ EOR, EORI
Useful for extracting and
inserting groups of bits in a
word
Shift Operations
opcode Rm shamt Rn Rd
11 bits 5 bits 6 bits 5 bits 5 bits
X9
OR Operations
• Useful to include bits in a word
– Set some bits to 1, leave others unchanged
ORR X9,X10,X11
X9
EOR Operations
• Differencing operation
– Set some bits to 1, leave others unchanged
EOR X9,X10,X12 // NOT operation
X9
Decisions
§
• CBZ register, L1
– if (register == 0) branch to instruction labeled L1;
• CBNZ register, L1
– if (register != 0) branch to instruction labeled L1;
• B L1
– branch unconditionally to instruction labeled L1;
Compiling If Statements
• C code:
if (i==j) f = g+h; else f =
g-h;
– f, g, … in X22, X23, …
• Compiled LEGv8 code:
SUB X9,X22,X23
CBNZ X9,Else
ADD X19,X20,X21
B Exit
Else: SUB X9,X22,x23
Exit: …
Assembler calculates
addresses
Compiling Loop Statements
• C code:
while (save[i] == k) i += 1;
– i in x22, k in x24, address of save in x25
• Compiled LEGv8 code:
Loop: LSL X10,X22,#3
ADD X10,X10,X25
LDU X9,[X10,#0]
R
SUB X11,X9,X24
CBN X11,Exit
Z
ADDI X22,X22,#1
B Loop
Exit: …
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
More Conditional Operations
• Condition codes, set from arithmetic instruction with S-
suffix (ADDS, ADDIS, ANDS, ANDIS, SUBS, SUBIS)
– negative (N): result had 1 in MSB
– zero (Z): result was 0
– overlow (V): result overflowed
– carry (C): result had carryout from MSB
• Use subtract to set flags, then conditionally branch:
– B.EQ (equal)
– B.NE (not equal)
– B.LT (less than, signed), B.LO (less than, unsigned)
– B.LE (less than or equal, signed), B.LS (less than or equal, unsigned)
– B.GT (greater than, signed), B.HI (greater than, unsigned)
– B.GE (greater than or equal, signed),
– B.HS (greater than or equal, unsigned)
Conditional Example
• if (a > b) a += 1;
– a in X22, b in X23
–
Argument n in X0
–
Result in X1
Leaf Procedure Example
• LEGv8 code:
fact: Save return address and n on stack
SUBI SP,SP,#16
STUR LR,[SP,#8]
STUR X0,[SP,#0] compare n and
1 if n >= 1, go
SUBIS XZR,X0,#1
to L1
B.GE L1
Else, set return value to 1
ADDI X1,XZR,#1
Pop stack, don’t bother restoring values
ADDI SP,SP,#16 Return
BR LR n=n-1
L1: SUBI X0,X0,#1 call fact(n-
BL fact 1)
LDUR X0,[SP,#0] Restore caller’s n
LDUR LR,[SP,#8] Restore caller’s return
ADDI SP,SP,#16 address Pop stack
MUL X1,X0,X1 BR return n * fact(n-1)
LR return