Skip to the content.

CSETM

example

CSETM은 Conditional Set Mask의 약자입니다. 우리말로 하면 “조건부 마스크 설정” 명령어인데요. 방금 배운 CSET이 참일 때 단백하게 숫자 1을 넣었다면, 이 CSETM 친구는 통이 아주 큽니다. 조건이 맞으면 레지스터의 모든 비트를 1로 꽉 채워버립니다! 컴퓨터의 2진수 세계에서 모든 비트가 1인 숫자는 부호 있는 정수로 -1을 뜻하며, 16진수로는 0xFFFFFFFF가 됩니다.


1. CSETM 명령어의 핵심 구조 (ARM64 기준)

문법 구조는 CSET과 완전히 똑같이 생겼습니다. 끝에 마스크(Mask)를 뜻하는 M이 하나 더 붙었을 뿐이죠.

CSETM ,

⚙️ 실제 작동 메커니즘


2. 왜 1 대신 0xFFFFFFFF(-1)라는 “비트 마스크”를 채우나요?

“친구야, 그냥 1을 채우는 CSET만 있으면 되지, 왜 굳이 모든 비트를 1로 채우는 명령어가 따로 필요해?” 라는 의문이 드실 수 있습니다. 그 이유는 바로 그 다음에 이어질 “비트 연산(AND, OR, NOT)”과 조합하여 초고속 필터링 공장을 돌리기 위해서입니다. 컴퓨터 공학에서 모든 비트가 1인 마스크는 “통과 프리패스 권한”과 같습니다.

💡 비트 마스크의 마법 (AND 연산과의 조합)

어떤 데이터에 0xFFFFFFFF를 AND 연산하면 원본 데이터가 그대로 남고, 0x00000000을 AND 연산하면 무조건 0이 됩니다. 이를 이용하면 앞서 배운 CSEL처럼 거창하게 레지스터 두 개를 저울질할 필요도 없이, “조건이 맞을 때만 이 데이터를 살려라!”라는 필터링을 한 줄로 끝낼 수 있습니다.

// 조건이 맞으면 data 값을 사용하고, 틀리면 0으로 초기화해라if (condition) { result = data; } else { result = 0; }

CMP W0, W1 ; 조건 비교 CSETM W2, EQ ; 조건이 맞으면 W2는 0xFFFFFFFF, 틀리면 0x00000000 AND W3, W4, W2 ; 원본데이터(W4)와 마스크(W2)를 AND 연산하여 W3에 저장!

조건이 참이었다면 W4 AND 0xFFFFFFFF가 되어 W4 내용이 그대로 W3에 쏙 들어갑니다. 반대로 거짓이었다면 W4 AND 0이 되어 W3은 깔끔하게 0이 됩니다. 이 역시 점프(Branch)가 전혀 없는 완벽한 하드웨어 가속 기법입니다.


3. 재미있는 비밀: 사실 CSETM도 CSEL 가문의 변장술이다!

이쯤 되면 눈치채셨겠지만, 이 영리한 CSETM 역시 완전히 새로운 하드웨어가 아니라 CSINV (조건부 비트 반전 선택) 명령어를 보기 좋게 포장해 놓은 별칭(Alias)이랍니다. 하하하! 내부적으로 CSETM W2, EQ를 실행하면 CPU는 사실 이렇게 작동합니다.

CSINV W2, WZR, WZR, EQ

항상 0인 Zero 레지스터(WZR)를 바라보면서, 조건이 참이면 0을 가져오고, 조건이 거짓이면 0의 비트를 완전히 뒤집은(NOT) 값인 0xFFFFFFFF를 만드는 원리입니다. (조건 방향을 살짝 비틀어서 마스크를 뚝딱 만들어냅니다.)

👥 쌍둥이 형제 최종 비교

명령어 조건이 참(True)일 때 조건이 거짓(False)일 때 주 사용 목적
CSET 1 (0x00000001) 0 (0x00000000) true/false 불리언 변수 값 저장, 조건 만족 횟수 카운팅
CSETM -1 (0xFFFFFFFF) 0 (0x00000000) 비트 연산(AND, OR)과 결합하여 데이터 필터링/마스킹

친구야, 제일 처음에 질문하셨던 CMGE 기억하시나요? CMGE가 SIMD(벡터) 세계에서 여러 데이터를 한 번에 비교해 비트 마스크를 만들었던 것처럼, 이 CSETM은 일반 레지스터 세계에서 단일 데이터용 비트 마스크를 만드는 역할을 하는 것입니다. 아키텍처의 세계가 참 일관성 있고 아름답게 연결되어 있죠? CMP부터 시작해서 CMN, CMGE, CNEG, CSEL, CSET, CSETM까지 이어지는 ARM64의 조건부 제어 및 최적화 마법을 완벽하게 관통하셨습니다! 하하하. 혹시 이 놀라운 명령어들의 동작 원리를 직접 눈으로 확인해볼 수 있는 실제 컴파일된 C언어 예제 코드를 타임라인으로 한번 구경해 보고 싶으신가요?