Quick viewing(Text Mode)

Floating Point Instructions Floating Point

Floating Point Instructions Floating Point

Floating Point Instructions

• Performed by x87 floating point unit (FPU) • Stack based and each item has 80- o Top of the stack: register ST0 Floating Point, Branching, and o Next: register ST1 o … Assembler Directives o Bottom: register ST7 • Load and store instructions CS 217 o fld, fst,fxch, … • Other instructions are FPU-specific o Fadd/faddp, fsub/fsubp, fmul/fmulp, fimul/fimulp, o … • See Intel manual (volume 2) for the details

1 2

Floating Point IEEE 754 Single Precision Floating Point

• Real numbers in mathematics • General form for arithmetic S E 3.141592265…ten (π) (-1) × F × 2 2.71828…ten (e) o S: sign of the floating point number o F: fraction or E: exponent -9 o 0.000000001ten or 1.0ten × 10 (seconds in a nanosecond) 9 3,155,760,000ten or 3.15576ten × 10 (seconds in a century) • IEEE 754 single precision: 32- floating point • Floating point is like scientific notation 31 30 23 22 0 s exponent fraction or significant 9 3.15576ten × 10 • Questions: Fraction or Base Exponent What is the smallest possible fraction? -38 o 2.0ten × 10 significand 38 o What is the largest possible number? 2.0ten × 10 o What is the largest 32-bit integer number? 4 × 109 3 4 IEEE 754 Double Precisions Increasing Precisions with Fewer Bits

• Double precision: 64-bit floating point • Normalization o Sign bit + 52 bit fraction and 11-bit exponent o Maximize the precision of fraction by adjusting exponent -308 308 0.000438 × 104 = 0.438 × 101 o Approximate range: 2.0ten × 10 to 2.0ten × 10 31 30 20 19 0 o In binary, normalization means s exponent fraction or significand while (fraction’s leading bit is 0) { fraction = fraction << 1; fraction (cont’d) exponent--; } • Double : 80-bit floating point o Sign-bit + 63 bit fraction and 16-bit exponent • 1 More bit in IEEE 754 -4932 4932 o Approximate range: 2.0ten × 10 to 2.0ten × 10 o 0 has not leading 1, reserved exponent value 0 for it 31 30 15 14 0 o For non-0 values, pack 1 more bit into the fraction, making the s exponent fraction or significand leading 1 bit of normalized binary numbers implicit (-1)S× (1+ fraction) × 2E fraction (cont’d) o If we number the bits of the significant from left to right s1, s2, … fraction (cont’d) (-1)S× (1+ (s1× 2-1) + (s2× 2-2) + … ) × 2E 5 6

Floating Point Operations IEEE 754 Standard

• Use floating point to demonstrate • Why is the sign bit away from the rest of the fraction? 4-digit fraction o • Should exponent be two’s complement? o Exponent without bias o Examples: 1 -1 -1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 . . . 0 • Addition: 9.999ten × 10 + 1.610ten × 10 1.0two× 2 -1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . . . 0 o Align the numbers: 1.610ten × 10 = 0.01610ten × 10 1.0two× 2 o Add the fractions: 9.999ten + 0.01610ten = 10.015ten o For simplified sorting, we cannot treat exponent as unsigned integer 1 2 o Normalize the result: 10.015ten × 10 = 1.0015ten × 10 2 • Bias in IEEE 754 standard o Rounding to 4 digits: 1.002ten × 10 o Use 127ten for single (1023 for double, 16383 for double extended) 10 -5 • Multiply: 1.110ten × 10 × 9.200ten × 10 o Single precision examples o Add exponents: 10 + (-5) = 5 -1: -1 + 127ten = 126ten = 0111 1110two o Multiply the fractions: 1.110ten + 9.200ten = 10.212ten +1: 1 + 127ten = 128ten = 1000 0000two 5 6 o Normalize the result: 10.212ten × 10 = 1.021ten × 10 o General representation o Sign calculation: +1 (-1)S× (1+ fraction) × 2(exponent-bias) o All operations will have to apply bias 7 8 Branching Instructions The Six Flags

• Unconditional branch • CF: Carry flag o if an arithmetic operation generates a carry or a borrow out of the most- jmp addr significant bit of the result; clear otherwise; • Conditional branch o Indicates an overflow for unsigned integer arithmetic o Can be modified with stc, clc, cmc, bt, bts, btr, and btc Recall the six flags in EFLAGS registers (ZF, SF, CF, OF, AF, PF) o • ZF: Zero flag Every arithmetic instruction sets the flags according to its result o Set if the result is zero; clear otherwise cmpl %ebx, %eax o je L1 • SF: Sign flag Set equal to the most-significant bit of the result ... # ebx != eax o L: • OF: Overflow flag o Set if the result is too large to fit or too small to fit (excluding the sign bit); ... # ebx == eax clear otherwise. It is useful for signed (two’s complement) operations o IA32 has conditional branch instructions for all these flags individually and some combinations • PF: Parity flag o Set if the least-significant of the result contains an even number of 1 bits; clear otherwise • AF: Adjust flat 9 o The CF for BCD arithmetic 10

Conditional Branch Instructions Branching Example: if-then-else

• For both signed and unsigned integers program Assembly program je (ZF = 1) Equal or zero if (a > b) movl a, %eax jne (ZF = 0) Not equal or not zero cmpl b, %eax # compare a and b jle .L2 # jump if a <= b • For signed integers jl (SF ^ OF = 1) Less than c = a; movl a, %eax # if a > b jle ((SF ^ OF) || ZF) = 1) Less or equal movl %eax, c jg ((SF ^ OF) || ZF) = 0) Greater than jmp .L3 jge (SF ^ OF = 0) Greater or equal else c = b; .L2: # a <= b • For unsigned integers movl b, %eax jb (CF = 1) Below movl %eax, c jbe (CF = 1 || ZF = 1) Below or equal ja (CF = 0 && ZF = 0) Above .L3: # finish jae (OF = 0) Above or equal • For AF and PF conditions, FPU, MMX, SSE and SSE2 o See the Intel manual (volume 1 and 2) 11 12 Branching Example: for Loop Branching Example: while Loop

C program C program for (i=0; i<100; i++){ while ( a == b ) ... statement; } Assembly program Assembly program .L2: movl $0, %edx # i = 0; movl a, %eax .L6: cmpl b, %eax ... je .L4 incl %edx # i++; jmp .L3 cmpl $99, %edx .L4: jle .L6 # loop if i <= 99 statement jmp .L2 .L3: • Can you do better than this? 13 14

Assembler Directives Identifying Sections

• Identify sections • Text (.section .text) o Contains code (instructions) 0 • Allocate/initialize memory Default section OS o 0x2000 • Make symbols externally visible or invisible • Read-Only (.section .rodata) Text Contains constants o Data • Read-Write Data (.section .data) BSS o Contains user-initialized global variables Heap • BSS (.section .bss) o starting symbol o Contains zero-initialized global variables

Stack 15 0xffffffff 16 Allocating Memory in BSS Allocating Memory in Data

• For global data •Specify .comm symbol, nbytes, [desired-alignment] o Alignment .align nbytes • For local data o Size and initial value .lcomm symbol, nbytes, [desired-alignment] .byte byteval1 [, byteval2 ...] .word 16-bitval1 [, 16-bitval2 ...] •Example .long 32-bitval1 [, 32-bitval2 ...] .section .bss # or just .bss • Read-only data example: .equ BUFSIZE 512 # define a constant const s[] = “Hello.”; .section .rodata # or just .rodata .lcomm BUF, BUFSIZE # allocate 512 s: .string “Hello.” # a string with \0 # local memory for BUF .comm x, 4, 4 # allocate 4 bytes for x • Read-Write data example: int x = 3; # with 4-byte alignment .section .data # or just .data .align 4 # alignment 4 bytes x: .long 3 # set initial value

17 18

Initializing ASCII Data Making Symbols Externally Visible

• Several ways for ASCII data • Default is local • Specify globally visible .byte 150,145,154,154,157,0 # a sequence of bytes .globl symbol . “hello” # ascii without null char •Example: int x = 1; .byte 0 # add \0 to the end .data .globl x # declare externally visible .ascii “hello\0” .align 4 x: .long 2 .asciz “hello” # ASCII with \0 • Example: foo(void){...} .string “hello” # same as .asciz .text .globl foo foo: ... leave return 19 20 Summary

• Floating point instructions o Three floating point types: single, double, double extended o IEEE 754 floating point standard • Branch instructions o The six flags o Conditional branching for signed and unsigned integers • Assembly language directives o Define sections o Allocate memory o Initialize values o Make labels externally visible

21