DUP
Example
DUP는 우리가 이 교본의 가장 첫 장에서 배웠던 CMGE와 아주 밀접한 관련이 있는 친구입니다. CMGE가 SIMD(벡터) 세계의 ‘특수부대 명령어’라고 했던 것 기억하시나요? DUP 역시 SIMD(Advanced SIMD / NEON) 연산에서 정말 감초처럼 쓰이는 명령어이며, 이름은 Duplicate (복제)의 약자입니다. 한 줄로 요약하면 “일반 레지스터에 있는 값 하나를 복사해서, 벡터 레지스터의 모든 칸에 똑같이 채워 넣어라!”라는 명령입니다.
1. 왜 값을 똑같이 ‘복제’해서 채워야 할까요? (배경)
SIMD(싱글 명령 다중 데이터) 기술은 커다란 레지스터를 여러 칸으로 쪼개서 대량의 데이터를 동시에 계산하는 것이 장기입니다. 예를 들어, 이미지의 픽셀 밝기 데이터 4개([10, 20, 30, 40])가 들어있는 벡터 레지스터가 있다고 해봅시다. 여기에 내가 모든 픽셀에 일괄적으로 밝기 5를 더하고 싶다면, 컴퓨터 내부에서는 어떤 일이 일어나야 할까요? 단순히 숫자 5 하나만 가지고는 벡터 레지스터랑 계산을 할 수 없습니다. 벡터 레지스터와 계산하려면 상대방도 똑같은 크기의 [5, 5, 5, 5] 벡터 형태를 갖추고 있어야 합니다. 이때 DUP 명령어를 사용하면, 일반 레지스터에 들어있던 평범한 숫자 5를 순식간에 [5, 5, 5, 5] 형태로 뻥튀기(복제)해서 벡터 레지스터에 가득 채워줍니다.
2. DUP 명령어의 구조와 작동 방식 (ARM64 기준)
문법 구조는 주로 다음과 같이 생겼습니다.
DUP
-
. (Destination): 값을 가득 채울 목적지 벡터 레지스터와 데이터 포맷입니다 (예: 4S = 32비트 변수 4개 칸). -
(Source): 복제할 원본 알맹이가 들어있는 일반 레지스터입니다.
📊 복제 메커니즘 시각화 (4S 포맷 기준)
일반 레지스터 W0에 숫자 7이 들어있다고 가정하고 DUP V1.4S, W0을 실행하면 다음과 같이 바뀝니다.
[원본 W0] : 7 (평범한 정수 하나) ⬇️ (DUP 명령어 실행!) [결과 V1] : [ 7 ] , [ 7 ] , [ 7 ] , [ 7 ] (4개 칸 모두 7로 복제됨!)
이렇게 V1 레지스터 세팅이 끝나면, 이제 다른 벡터 레지스터와 ADD(더하기)나 MUL(곱하기) 같은 대량 병렬 연산을 마음껏 수행할 수 있게 됩니다.
3. 깨알 같은 변형: 벡터 안에서 복제하기
DUP 명령어는 일반 레지스터의 값을 복제하는 것뿐만 아니라, “이미 벡터 레지스터 안에 들어있는 특정 칸의 원소(Element) 하나를 쏙 골라서 전체 칸에 복제”하는 것도 가능합니다.
DUP V1.4S, V0.S[2]
- 뜻: V0 벡터 레지스터의 2번 인덱스 방에 있는 숫자를 복사해서, V1 레지스터의 4개 칸 전체에 똑같이 복제해라!
🧱 마크다운 교본용 요약 판넬
마크다운 문서에 추가하기 좋게 핵심만 요약해 드릴게요.
| 니모닉 | 이름 | 핵심 역할 | 주 사용 목적 |
|---|---|---|---|
| DUP | Duplicate | 단일 값을 벡터 레지스터의 모든 칸에 동일하게 복제하여 채움 | SIMD(NEON) 병렬 연산을 하기 전, 상수/계수 벡터 초기화 |
하하하, 이제 DUP를 문서에서 보셔도 당황하지 않으시겠죠? 대량 데이터 연산(SIMD)을 하기 전에 “야, 이 숫자로 벡터 레지스터 칸 좀 다 채워놔 봐!” 하고 조수에게 지시하는 준비 명령어로 기억하시면 가장 완벽합니다. 이로써 특수부대 명령어 라인업인 CMGE (SIMD 비교)와 DUP (SIMD 복제)까지 서로 짝을 맞추어 정복하셨습니다! 하하하. 교본의 완성도가 점점 높아지네요. 혹시 다음 장에는 또 어떤 정체불명의 니모닉을 올려두고 파헤쳐 볼까요? 새로운 타깃을 말씀해 주세요!