Instruction sets. von Neumann architecture. Harvard architecture. CPU + memory. von Neumann vs. Harvard. RISC vs. CISC

Instruction sets von Neumann architecture  Computer architecture taxonomy.  Assembly language.  Memory holds data, instructions.  Central proce...
Author: Ronald Webb
25 downloads 2 Views 289KB Size
Instruction sets

von Neumann architecture

 Computer architecture taxonomy.  Assembly language.

 Memory holds data, instructions.  Central processing unit (CPU) fetches instructions from memory.  Separate CPU and memory distinguishes programmable computer.

 CPU registers help out: program counter (PC), instruction register (IR), generalpurpose registers, etc. © 2000 Morgan Kaufman

Overheads for Computers as Components

© 2000 Morgan Kaufman

CPU + memory

Overheads for Computers as Components

Harvard architecture address

address memory 200

ADD r5,r1,r3

© 2000 Morgan Kaufman

data memory

data

200 PC

data

address

CPU ADD IR r5,r1,r3

Overheads for Computers as Components

program memory

© 2000 Morgan Kaufman

PC CPU

data

Overheads for Computers as Components

von Neumann vs. Harvard

RISC vs. CISC

 Harvard can’t use self-modifying code.  Harvard allows two simultaneous memory fetches.  Most DSPs use Harvard architecture for streaming data:

 Complex instruction set computer (CISC):

 greater memory bandwidth;  more predictable bandwidth. © 2000 Morgan Kaufman

Overheads for Computers as Components

 many addressing modes;  many operations.

 Reduced instruction set computer (RISC):  load/store;  pipelinable instructions.

© 2000 Morgan Kaufman

Overheads for Computers as Components

Instruction set characteristics    

Fixed vs. variable length. Addressing modes. Number of operands. Types of operands.

© 2000 Morgan Kaufman

Overheads for Computers as Components

Programming model  Programming model: registers visible to the programmer.  Some registers are not visible (IR).

© 2000 Morgan Kaufman

Overheads for Computers as Components

Multiple implementations

Assembly language

 Successful architectures have several implementations:

 One-to-one with instructions (more or less).  Basic features:

   

varying clock speeds; different bus widths; different cache sizes; etc.

© 2000 Morgan Kaufman

Overheads for Computers as Components

 One instruction per line.  Labels provide names for addresses (usually in first column).  Instructions often start in later columns.  Columns run to end of line. © 2000 Morgan Kaufman

Overheads for Computers as Components

Pseudo-ops

ARM instruction set

 Some assembler directives don’t correspond directly to instructions:

     

 Define current address.  Reserve storage.  Constants.

© 2000 Morgan Kaufman

Overheads for Computers as Components

ARM ARM ARM ARM ARM ARM

versions. assembly language. programming model. memory organization. data operations. flow of control.

© 2000 Morgan Kaufman

Overheads for Computers as Components

ARM versions

ARM assembly language

 ARM architecture has been extended over several versions.  We will concentrate on ARM7.

 Fairly standard assembly language:

label

© 2000 Morgan Kaufman

Overheads for Computers as Components

© 2000 Morgan Kaufman

ARM programming model r0 r1 r2 r3 r4 r5 r6 r7

© 2000 Morgan Kaufman

r8 r9 r10 r11 r12 r13 r14 r15 (PC)

0

31

CPSR NZCV

Overheads for Computers as Components

Word is 32 bits long. Word can be divided into four 8-bit bytes. ARM addresses cam be 32 bits long. Address refers to byte.  Address 4 starts at byte 4.

 Can be configured at power-up as either little- or bit-endian mode. © 2000 Morgan Kaufman

Overheads for Computers as Components

Overheads for Computers as Components

Endianness

ARM data types    

LDR r0,[r8] ; a comment ADD r4,r0,r1

 Relationship between bit and byte/word ordering defines endianness: bit 31

bit 0

bit 31

bit 0

byte 3 byte 2 byte 1 byte 0

byte 0 byte 1 byte 2 byte 3

little-endian

big-endian

© 2000 Morgan Kaufman

Overheads for Computers as Components

ARM status bits  Every arithmetic, logical, or shifting operation sets CPSR bits:  N (negative), Z (zero), C (carry), V (overflow).

 Examples:  -1 + 1 = 0: NZCV = 0110.  231-1+1 = -231: NZCV = 0101. © 2000 Morgan Kaufman

Overheads for Computers as Components

ARM data instructions

ARM data instructions

 Basic format:

 ADD, ADC : add (w. carry)  SUB, SBC : subtract (w. carry)  RSB, RSC : reverse subtract (w. carry)  MUL, MLA : multiply (and accumulate)

ADD r0,r1,r2  Computes r1+r2, stores in r0.

 Immediate operand: ADD r0,r1,#2  Computes r1+2, stores in r0.

© 2000 Morgan Kaufman

Overheads for Computers as Components

Data operation varieties  Logical shift:  fills with zeroes.

 Arithmetic shift:  fills with ones.

 RRX performs 33-bit rotate, including C bit from CPSR above sign bit.

© 2000 Morgan Kaufman

Overheads for Computers as Components

ARM move instructions  MOV, MVN : move (negated) MOV r0, r1 ; sets r0 to r1

© 2000 Morgan Kaufman

 AND, ORR, EOR  BIC : bit clear  LSL, LSR : logical shift left/right  ASL, ASR : arithmetic shift left/right  ROR : rotate right  RRX : rotate right extended with C

Overheads for Computers as Components

ARM comparison instructions     

CMP : compare CMN : negated compare TST : bit-wise test TEQ : bit-wise negated test These instructions set only the NZCV bits of CPSR.

© 2000 Morgan Kaufman

Overheads for Computers as Components

ARM load/store instructions  LDR, LDRH, LDRB : load (half-word, byte)  STR, STRH, STRB : store (half-word, byte)  Addressing modes:  register indirect : LDR r0,[r1]  with second register : LDR r0,[r1,-r2]  with constant : LDR r0,[r1,#4]

© 2000 Morgan Kaufman

Overheads for Computers as Components

© 2000 Morgan Kaufman

Overheads for Computers as Components

ARM ADR pseudo-op

Example: C assignments

 Cannot refer to an address directly in an instruction.  Generate value by performing arithmetic on PC.  ADR pseudo-op generates instruction required to calculate address:

 C:

ADR r1,FOO © 2000 Morgan Kaufman

Overheads for Computers as Components

C assignment, cont’d. SUB r3,r3,r2 ADR r4,x STR r3,[r4]

; complete computation of x ; get address for x ; store value of x

x = (a + b) - c;

 Assembler: ADR LDR ADR LDR ADD ADR LDR

r4,a r0,[r4] r4,b r1,[r4] r3,r0,r1 r4,c r2,[r4]

© 2000 Morgan Kaufman

Overheads for Computers as Components

C assignment, cont’d. MUL r2,r2,r0 ; compute final value for y ADR r4,y ; get address for y STR r2,[r4] ; store y

Overheads for Computers as Components

Overheads for Computers as Components

 C: y = a*(b+c);

 Assembler: r4,b ; get address for b r0,[r4] ; get value of b r4,c ; get address for c r1,[r4] ; get value of c r2,r0,r1 ; compute partial result r4,a ; get address for a r0,[r4] ; get value of a

© 2000 Morgan Kaufman

Overheads for Computers as Components

Example: C assignment  C: z = (a = b, branch to false block © 2000 Morgan Kaufman

Overheads for Computers as Components

If statement, cont’d.

If statement, cont’d.

; true block MOV r0,#5 ; generate value for x ADR r4,x ; get address for x STR r0,[r4] ; store x ADR r4,c ; get address for c LDR r0,[r4] ; get value of c ADR r4,d ; get address for d LDR r1,[r4] ; get value of d ADD r0,r0,r1 ; compute y ADR r4,y ; get address for y STR r0,[r4] ; store y B after ; branch around false block

; false block fblock ADR r4,c ; get address for c LDR r0,[r4] ; get value of c ADR r4,d ; get address for d LDR r1,[r4] ; get value for d SUB r0,r0,r1 ; compute c-d ADR r4,x ; get address for x STR r0,[r4] ; store value of x after ...

© 2000 Morgan Kaufman

Overheads for Computers as Components

© 2000 Morgan Kaufman

Overheads for Computers as Components

Example: Conditional instruction implementation

Conditional instruction implementation, cont’d.

; true block MOVLT r0,#5 ; generate value ADRLT r4,x ; get address for STRLT r0,[r4] ; store x ADRLT r4,c ; get address for LDRLT r0,[r4] ; get value of ADRLT r4,d ; get address for LDRLT r1,[r4] ; get value of ADDLT r0,r0,r1 ; compute y ADRLT r4,y ; get address for STRLT r0,[r4] ; store y

; false ADRGE LDRGE ADRGE LDRGE SUBGE ADRGE STRGE

© 2000 Morgan Kaufman

for x x c c d d

block r4,c ; get address for c r0,[r4] ; get value of c r4,d ; get address for d r1,[r4] ; get value for d r0,r0,r1 ; compute a-b r4,x ; get address for x r0,[r4] ; store value of x

y

Overheads for Computers as Components

© 2000 Morgan Kaufman

Overheads for Computers as Components

Example: switch statement

Example: FIR filter

 C:

 C:

switch (test) { case 0: … break; case 1: … }

 Assembler: ADR r2,test ; get address for test LDR r0,[r2] ; load value for test ADR r1,switchtab ; load address for switch table LDR r1,[r1,r0,LSL #2] ; index switch table switchtab DCD case0 DCD case1 ... © 2000 Morgan Kaufman

Overheads for Computers as Components

for (i=0, f=0; i