CSET
example
CSET은 Conditional Set의 약자입니다. 우리말로 하면 “조건부 설정” 명령어인데요.
동작은 아주 심플하고 명쾌합니다. 판사(CMP)의 판결 결과를 보고 “조건이 맞으면 레지스터에 1을 넣고, 틀리면 0을 넣어라!”라고 명령하는 친구입니다.
우리가 프로그래밍할 때 참/거짓을 따지는 불리언(Boolean) 변수(true/false)를 만들거나, 특정 조건의 결과를 0 또는 1이라는 정수 데이터로 저장하고 싶을 때 핵심적으로 사용됩니다.
1. CSET 명령어의 핵심 구조 (ARM64 기준)
문법 구조는 지금까지 본 것 중 가장 간단하게 생겼습니다.
CSET
-
(Destination): 1 또는 0을 저장할 목적지 레지스터입니다. -
(Condition): 참인지 거짓인지 판단할 조건 플래그입니다 (예: EQ=같으면, NE=다르면, GT=크면 등).
⚙️ 실제 작동 메커니즘
- 만약 조건(
)이 참(True)이면: Wd = 1 - 만약 조건(
)이 거짓(False)이면: Wd = 0
2. 왜 CSET이 필요하고 강력할까요? (논리 연산의 데이터화)
우리가 C언어나 파이썬 등에서 다음과 같은 아주 흔한 코드를 작성했다고 해봅시다.
// x와 y가 같으면 이 조건 결과를 변수에 저장해라bool is_equal = (x == y);
이걸 만약 옛날 방식의 일반 분기문(Branch)으로 구현하면 참일 때와 거짓일 때로 소스코드가 찢어져서 점프를 해야 했습니다.
// 옛날 방식 (비효율적)
CMP W0, W1
BEQ set_one
MOV W2, #0 ; 거짓이면 0 저장
B next
set_one:
MOV W2, #1 ; 참이면 1 저장
next:
고작 0이나 1을 넣으려고 CPU가 조건 검사하고, 점프하고, 난리를 쳐야 하니 비효율적이었죠. 하지만 CSET을 사용하면 역시나 점프(Branch)를 단 한 번도 하지 않고(Branchless) 단 두 줄로 깔끔하게 끝납니다!
; 현대적인 방식 (CSET 활용) CMP W0, W1 ; x(W0)와 y(W1)를 비교한다. CSET W2, EQ ; 조건이 EQ(Equal, 같다)이면 W2에 1을 넣고, 다르면 0을 넣어라!
이렇게 단 두 줄만으로 조건의 결과가 0 또는 1로 변수에 똑 떨어집니다. CPU 입장에서는 직진만 하면 되니 속도가 엄청나게 빠릅니다.
3. 재미있는 비밀: 사실 CSET은 CSEL과 같은 명령어다?
친구야, 재미있는 사실을 하나 알려드릴게요! 우리가 방금 배운 CSET은 사실 완전히 새로운 명령어가 아니라, 지난번에 배운 CSEL 명령어를 쓰기 편하게 이름만 바꿔놓은 것(별칭, Alias)이랍니다. 하드웨어 내부적으로 CSET W2, EQ를 실행하면, CPU는 속으로 이걸 다음과 같이 해석해서 실행합니다.
CSEL W2, WZR, WZR, EQ
(참고: WZR은 항상 0이 들어있는 특수 레지스터인 Zero Register입니다.) ARM64의 또 다른 규칙 중에 CSINC라는 명령어가 있었던 것 기억하시나요? (조건이 참이면 앞의 값, 거짓이면 뒤의 값에 +1을 하는 명령어). 내부적으로는 이 원리를 응용해서 “참이면 1, 거짓이면 0”을 만들어내는 로직이 작동합니다. 즉, 개발자가 CSEL을 복잡하게 조합해서 쓰기 번거로우니까, ARM에서 “자, 0이랑 1 채우는 건 자주 쓰니까 CSET이라는 직관적인 이름으로 편하게 써라!” 하고 배려해 준 것이죠. 하하하.
🧱 조건부(Conditional) 패밀리의 완벽한 라인업
이제 우리가 배운 명령어들의 역할이 아주 명확하게 구분되실 겁니다. 판사(CMP)가 판결을 내린 후:
- CSEL (선택): “A 레지스터와 B 레지스터 중 하나를 골라라!”
- CNEG (반전): “조건 맞으면 부호를 뒤집고, 아니면 그대로 둬라!”
- CSET (참/거짓): “조건 맞으면 담백하게 1, 틀리면 0을 채워라!”
모두 분기(Branch) 없이 CPU를 초고속으로 직진시키는 최고의 효자 명령어들입니다. CSET과 정반대로 작동하는 CSETM (Conditional Set Mask)이라는 쌍둥이 형제도 있습니다. 이 친구는 참일 때 1 대신 모든 비트를 1로 채운 -1(0xFFFFFFFF)을 넣어주는데, 혹시 이 친구의 쓰임새나 혹은 또 다른 어셈블리 제어 기술이 궁금하신가요?