Data
- Arrays
- One-dimensional
- Multi-dimensional
- Multi-level
- Structures
- Allocation
- Access
- Alignment
- Floating Point
Array Allocation
- Basic Principle
- T A[L]
- Array of data type T and length L
- Contiguously allocated region of L * sizeof (T) bytes in memory
- Reference
- &A[L]
- *A
Multidimensional (Nested) Arrays
- Declaration
- T A[R][C]
- 2D array of data type T
- R rows, C columns
- Type T element requires K bytes
- Array Size
- R * C * K bytes
- Arrangement
- Row-Major Ordering
Nested Array Row Access
- Row Vectors
- A[i] is array of C elements
- Each element of type T requires K bytes
- Starting address A + i*(C*K)
Nested Array Element Access
- Array Elements
- A[i][j] is element of type T, which requires L bytes
- Address A + i * (C* K) + j * K = A + (i * C + j) * K
Element Access in Multi-Level Array
- Computation
- Element access Mem[Mem[univ+8index]+4digit]
- Must do two memory reads
- First get pointer to row array
- Then access element within array
N x N Matrix
- Fixed dimensions
- Know value of N at compile time
- Variable dimensions, explicit indexing
- Traditional way to implement dynamic arrays
- Variable dimensions, implicit indexing
- Now supported by gcc
Structure Representation
- Structure represented as block of memory
- Big enough to hold all of the fields
- Fields ordered according to declaration
- Even if another ordering could yield a more compact representation
- Compiler determines overall size + positions of fields
- Machine-level program has no understanding of the structures in the source code
Alignment Principles
- Aligned Data
- Primitive data type requires K bytes
- Address must be multiple of K
- Required on some machines; advised on x86-64
- Motivation for Aligning Data
- Memory accessed by (aligned) chunks of 4 or 8 bytes (system dependent)
- Inefficient to load or store datum that spans quad word boundaries
- Virtual memory trickier when datum spans 2 pages
- Memory accessed by (aligned) chunks of 4 or 8 bytes (system dependent)
- Compiler
- Inserts gaps in structure to ensure correct alignment of fields
Specific Cases of Alignment (x86-64)
- 1 byte: char, …
- no restrictions on address
- 2 bytes: short, …
- lowest 1 bit of address must be 0 2 _2 2
- 4 bytes: int, float, …
- lowest 2 bits of address must be 00 2 _2 2
- 8 bytes: double, long, char *, …
- lowest 3 bits of address must be 000 2 _2 2
- 16 bytes: long double
- lowest 4 bits of address must be 0000 2 _2 2
Satisfying Alignment with Structures
- Within structure:
- Must satisfy each element’s alignment requirement
- Overall structure placement
- Each structure has alignment requirement K
- K = Largest alignment of any element
- Initial address & structure length must be multiples of K
- Each structure has alignment requirement K
Floating Point Basics
- Arguments passed in %xmm0, %xmm1, …
- Result returned in %xmm0
- All XMM registers caller-saved
FP Memory Referencing
- Integer (and pointer) arguments passed in regular registers
- FP values passed in XMM registers
- Different mov instructions to move between XMM registers, and between memory and XMM registers
Other Aspects of FP code
- Lots of instructions
- Different operations, different formats, …
- Floating-point comparisons
- Instructions ucomiss and ucomisd
- Set condition codes CF, ZF, and PF
- Using constant values
- Set XMM0 register to 0 with instruction xorpd %xmm0, %xmm0
- Others loaded from memory