BFI, BFXIL, BIC, BIT, BIF
Summary
비트 조작 명령어 그룹 (Bitfield & Bitwise Insert)
분류 안내: 5개 명령어는 겉보기엔 유사해 보이나 실제로는 두 그룹으로 나뉨.
| 그룹 | 명령어 | 레지스터 종류 | 용도 |
|---|---|---|---|
| Bitfield 조작 (스칼라) | BFI, BFXIL |
범용 레지스터(X/W) | 특정 비트 구간 삽입/추출 |
| 조건부 비트 삽입 (SIMD) | BIC, BIF, BIT |
NEON 벡터 레지스터(V), BIC는 스칼라도 가능 | 마스크 기반 비트 선택 |
BFI (Bitfield Insert)
정의: 소스 레지스터의 하위 비트 일부를 목적 레지스터의 특정 위치에 삽입하는 명령어. 목적 레지스터의 나머지 비트는 그대로 유지됨.
문법:
BFI Xd, Xn, #lsb, #width
lsb: 삽입될 시작 비트 위치 (목적 레지스터 기준)width: 삽입할 비트 개수
동작 원리:
Xn의 하위(LSB)width개 비트를 추출Xd의lsb위치부터width개 비트에 덮어씀Xd의 나머지 비트는 원래 값 유지
예제:
mov x0, #0xFFFFFFFF // x0 = 전부 1
mov x1, #0b101 // x1 = ...0000101
bfi x0, x1, #4, #3 // x1의 하위 3비트(101)를 x0의 4~6번 비트 위치에 삽입
// 결과: x0 = 0xFFFFFF5F (7~4비트 자리에 101이 들어감, 나머지는 유지)
실전 활용: 레지스터 매핑 구조체(플래그 레지스터 등)에서 특정 필드만 갱신할 때 유용함. 예: MMU 페이지 테이블 엔트리의 특정 속성 비트만 수정.
BFXIL (Bitfield Extract and Insert Low)
정의: 소스 레지스터의 특정 구간 비트를 추출하여 목적 레지스터의 하위(LSB) 에 삽입하는 명령어. BFI와 방향이 반대라고 볼 수 있음.
문법:
BFXIL Xd, Xn, #lsb, #width
lsb: 추출 시작 위치 (소스 레지스터Xn기준)width: 추출할 비트 개수
동작 원리:
Xn의lsb위치부터width개 비트 추출- 추출된 값을
Xd의 하위 비트에 삽입 Xd의 상위 비트는 원래 값 유지
BFI와의 대비:
| 명령어 | 추출 위치 | 삽입 위치 |
|---|---|---|
BFI |
Xn의 하위(LSB) | Xd의 임의 위치(lsb) |
BFXIL |
Xn의 임의 위치(lsb) | Xd의 하위(LSB) |
예제:
mov x0, #0xFFFFFFFF
mov x1, #0b1011000 // 3~6번 비트에 1011 패턴
bfxil x0, x1, #3, #4 // x1의 3~6번 비트(1011)를 추출해 x0의 하위 4비트에 삽입
// 결과: x0의 하위 4비트 = 1011, 나머지는 유지
BIC (Bitwise Bit Clear)
정의: Xd = Xn AND NOT(Operand2). 특정 비트를 강제로 0으로 지우는 명령어. AND의 “반전 버전”으로 이해하면 직관적임.
문법 (스칼라, 레지스터 전용):
BIC Xd, Xn, Xm {, shift #amount}
중요 제약: AND/ORR/EOR과 달리, BIC는 스칼라 즉치값(immediate) 형태가 존재하지 않음. 반드시 레지스터-레지스터 형태로만 사용 가능함 (단, NEON 벡터 버전은 즉치값 지원, 아래 참조).
예제 (스칼라):
mov x0, #0xFF // x0 = 0b11111111
mov x1, #0b00001111
bic x2, x0, x1 // x2 = x0 AND NOT(x1) = 0b11110000
즉치값이 필요할 때의 대안: 지우고 싶은 비트 마스크가 즉치값 인코딩 가능하다면 AND에 반전된 마스크를 직접 사용하는 것이 일반적:
and x0, x0, #0xFFFFFFF0 // 하위 4비트만 클리어 (BIC 대신 AND+반전마스크 사용)
NEON 벡터 즉치값 형태:
BIC Vd.4H, #imm {, LSL #amount} // 벡터 레인별로 특정 비트 클리어
BIT / BIF — 조건부 비트 삽입 (NEON 전용)
전제: BIT, BIF는 NEON(SIMD) 벡터 레지스터 전용 명령어이며, 스칼라 정수 레지스터에는 존재하지 않음. 세 번째 오퍼랜드가 “마스크” 역할을 하는 것이 핵심 특징임.
BIT (Bitwise Insert if True)
문법:
BIT Vd.16B, Vn.16B, Vm.16B
동작: Vm의 각 비트가 1인 위치에서만 Vn의 해당 비트를 Vd에 삽입. Vm이 0인 위치는 Vd의 원래 값 유지.
수식:
Vd = (Vn AND Vm) OR (Vd AND NOT Vm)
BIF (Bitwise Insert if False)
문법:
BIF Vd.16B, Vn.16B, Vm.16B
동작: Vm의 각 비트가 0인 위치에서만 Vn의 해당 비트를 Vd에 삽입. Vm이 1인 위치는 Vd의 원래 값 유지.
수식:
Vd = (Vd AND Vm) OR (Vn AND NOT Vm)
BIT vs BIF 비교:
| 명령어 | 조건 | Vn이 채택되는 마스크 비트 값 |
|---|---|---|
BIT |
if True | Vm의 비트가 1일 때 |
BIF |
if False | Vm의 비트가 0일 때 |
연관 명령어 — BSL: BSL(Bitwise Select)도 유사 계열이나, 마스크 역할을 Vd 자신이 담당한다는 점에서 다름. BIT/BIF는 별도의 마스크 레지스터(Vm)를 명시적으로 지정하는 구조.
예제:
// v0 = 원본 데이터, v1 = 삽입할 데이터, v2 = 마스크
ld1 {v0.16b}, [x0]
ld1 {v1.16b}, [x1]
ld1 {v2.16b}, [x2]
bit v0.16b, v1.16b, v2.16b // v2의 1인 비트 위치에서 v1 값을 v0에 삽입
실전 활용: 이미지 처리, 픽셀 마스킹, SIMD 기반 조건부 데이터 병합(비트 단위 blending) 등에서 활용됨. 일반 스칼라 코드보다는 벡터화된 알고리즘(오디오/영상 처리, 그래픽스 라이브러리)에서 주로 관찰됨.
종합 정리표
| 명령어 | 레지스터 종류 | 핵심 기능 | 자주 등장하는 맥락 |
|---|---|---|---|
BFI |
스칼라 | Xn 하위비트 → Xd 임의위치 삽입 | 플래그 레지스터 필드 갱신 |
BFXIL |
스칼라 | Xn 임의위치 → Xd 하위비트 삽입 | 비트필드 추출·재배치 |
BIC |
스칼라/벡터 | AND NOT (비트 클리어) | 특정 비트 강제 0 처리 |
BIT |
벡터(NEON) | 마스크=1인 곳에 Vn 삽입 | SIMD 조건부 병합 |
BIF |
벡터(NEON) | 마스크=0인 곳에 Vn 삽입 | SIMD 조건부 병합 |
핵심 구분 기준: BFI/BFXIL은 “비트 구간(range)”을 다루는 스칼라 연산이고, BIT/BIF는 “비트별 마스크 조건”을 다루는 벡터 연산이며, BIC는 그 중간 성격으로 스칼라와 벡터 양쪽에서 “비트 클리어” 역할을 함.