- Executable and Linkable Format
- Standard binary format for object files
- One unified format for
-> Relocatable object files(.o)
-> Executable object files(a.out)
-> Shared object files(.so)
- 각 Architecture에 대해 elf.h 파일을 가짐
ex
- ARM: arch/arm/include/asm/elf.h
- AARCH64: arch/arm64/include/asm/elf.h
- if/else statements
- for loops
- while loops
- arrays
- function calls
-> APCS에서 따로 확인
- Assembly code 는 반복문은 항상 do/while로 해석하여 실행함
- Single Instruction Multiple Data
- ARM에서 SIMD 연산을 지원하기 위한 NEON
NEON에서 SIMD 연산
- V0에서 4개의 프리시젼에 저장
- V0에서 4개의 프리시전 가져옴
- V1에서 4개의 프리시전 가져와 ADD 연산
- VLA(Vector Length Agnostic)
-> Vector Length(VL): 128에서 2048bits 까지 지원하는 하드웨어 구현- 동적으로 가능한 vector length로 사용될 수 있도록 지원
- VLA는 새로운 ISA를 정의하거나 하지 않고, 하드웨어에서 알아서 지원
- SVE는 새로운 instruction 을 가지는 별도 extension
- 원래 HPC나 서버를 타겟으로 사용했는데, AI 가 인기를 끌면서 media/image processing에 많이 사용됨
- Software-managed speculative vectorization 으로 명시적으로 프로그래머가 병렬 연산용으로 만든 loop가 아니어도 자동으로 vector 화 가능
- predicate register를 이용하여 각 lane에 적용
- 부분 vector를 처리하여 scalar loop header를 없앰
- First Faulting Load를 지원하는 register를 이용하여 여러 페이지에 걸친 벡터 연산 지원
- ARM Procedure Call Standard
- 서로 다른 컴파일러에서 생성된 object code들도 규칙을 지키면 함께 link 가능
- APCS를 통해 high-level language 와 assembly 코드 간 procedure 호출 가능
- Use of registers
- Use of stack
- Format of stack-based data structure
- Mechanism for argument passing
//func()는 Callee, int a 와 int b는 Parameters void func(int a, int b){ } int main(void){ //여기서 func()는 Caller, 100과 200은 Arguments func(100,200) }
- By registers
- By Stack
- By Memory
- 처음 4개의 argument R0~R3 4개의 레지스터로 전달
- 나머지 parameter는 stack에 역순으로 push 되어 전달
- 따라서 4개 이하의 parameter를 사용하는 것이 효율적
- 처음 8개의 argument R0~R7 8개의 레지스터로 전달
- 따라서 8개 이하의 parameter를 사용하는 것이 효율적
- 1word 이하: R0
- 2~4word 의 긴 값: R0-R1, R0-R2, R0-R3