User's Manual

238 Index
AMD Athlon Processor x86 Code Optimization
22007E/0November 1999
Instruction
Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Control Unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Decoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Dispatch and Execution Resources. . . . . . . . . . . . . . . . . 187
Short Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Short Lengths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Arithmetic, 64-Bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Execution Unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Operand, Consider Sign . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Pipeline Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Pipeline Stages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Scheduler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Use 32-Bit Data Types for Integer Code . . . . . . . . . . . . . . 13
L
L2 Cache Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
LEA Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Load/Store Pipeline Operations . . . . . . . . . . . . . . . . . . . . . 151
Load-Execute Instructions . . . . . . . . . . . . . . . . . . . . . . . . .9
, 34
Floating-Point Instructions . . . . . . . . . . . . . . . . . . . . .10
, 35
Integer Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Load-Store Unit (LSU) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Local Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Local Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
, 31, 56
Loop Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Loops
Deriving Loop Control For Partially Unrolled . . . . . . . . . 70
Generic Loop Hoisting . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Minimize Pointer Arithmetic. . . . . . . . . . . . . . . . . . . . . . . 73
Partial Loop Unrolling . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
REP String with Low Variable Counts . . . . . . . . . . . . . . . 85
Unroll Small Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Unrolling Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
M
Memory
Pushing Memory Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Size and Alignment Issues . . . . . . . . . . . . . . . . . . . . . . .8
, 45
Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Memory Type Range Register (MTRR) . . . . . . . . . . . . . . . 171
Capability Register Format . . . . . . . . . . . . . . . . . . . . . . . 174
Default Type Register Format . . . . . . . . . . . . . . . . . . . . . 175
Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Fixed-Range Register Format . . . . . . . . . . . . . . . . . . . . . 182
MSR Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
MTRRs and PAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Overlapping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Variable-Range MTRR Register Format . . . . . . . . . . . . 183
MMX Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Block Copies and Block Fills . . . . . . . . . . . . . . . . . . . . . . 115
Integer-Only Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
MOVQ Instruction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
PAND to Find Absolute Value in 3DNow! Code. . . . . . . 119
PCMP Instead of 3DNow! PFCMP . . . . . . . . . . . . . . . . . 114
PCMPEQD to Set an MMX Register. . . . . . . . . . . . . . . . 119
PMADDWD Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . 111
PREFETCHNTA/T0/T1/T2 Instruction . . . . . . . . . . . . . . . 47
PXOR Instruction . . . . . . . . . . . . . . . . . . . . . . .113
, 118119
MOVZX and MOVSX Instructions . . . . . . . . . . . . . . . . . . . . 73
MSR Access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Multiplication
Alternative Code When Multiplying by a Constant . . . . 81
Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Multiplies over Divides, Floating Point. . . . . . . . . . . . . . 97
Muxing Constructs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
N
Newton-Raphson Reciprocal. . . . . . . . . . . . . . . . . . . . . . . . 109
Newton-Raphson Reciprocal Square Root . . . . . . . . . . . . 111
O
Operands. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Largest Possible Operand Size, Repeated String. . . . . . 84
Optimization Star. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
P
Page Attribute Table (PAT). . . . . . . . . . . . . . . . . 171, 177178
Parallelism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
PerfCtr MSR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
PerfEvtSel MSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Performance-Monitoring Counters. . . . . . . . . . . 161
, 168169
Pipeline and Execution Unit Resources Overview. . . . . . 141
Pointers
De-referenced Arguments. . . . . . . . . . . . . . . . . . . . . . . . . 31
Use Array-Style Code Instead . . . . . . . . . . . . . . . . . . . . . 15
Population Count Function. . . . . . . . . . . . . . . . . . . . . . . . . . 91
Predecode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Prefetch
Determing Distance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Prototypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
R
Recursive Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Register Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Register Reads and Writes, Partial . . . . . . . . . . . . . . . . . . . 37
REP Prefix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
, 8485
S
Scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
SHLD Instruction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
SHR Instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Signed Words to Floating-Point Conversion . . . . . . . . . . . 113
Square Root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Stack
Alignment Considerations . . . . . . . . . . . . . . . . . . . . . . . . 54
Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Store-to-Load Forwarding . . . . . . . . . . . . . . . . . . 18
, 51, 5354
Stream of Packed Unsigned Bytes . . . . . . . . . . . . . . . . . . . 125
String Instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Structure (Struct). . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
28, 56
Subexpressions, Explicitly Extract Common . . . . . . . . . . . 26
Superscalar Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Switch Statement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
, 24