C
✅ Compare And Swap. Atomically compares the value at a memory address with Ws; if equal, writes Wt to that address. Either way, the OLD memory value is returned into Ws. Replaces an entire LDXR/CMP/STXR retry loop with one instruction. Suffix variants control memory ordering: CASA (acquire), CASL (release), CASAL (both) — the same A/L/AL suffix pattern applies to the whole LSE family below.
✅ 비교 후 교환. 메모리 주소의 값을 Ws와 원자적으로 비교하여, 같으면 그 주소에 Wt를 씁니다. 어느 쪽이든 원래 메모리 값이 Ws에 반환됩니다. LDXR/CMP/STXR 재시도 루프 전체를 명령어 하나로 대체합니다. 접미사로 메모리 순서를 제어합니다: CASA(획득), CASL(해제), CASAL(둘 다) — 이 A/L/AL 접미사 규칙은 아래 LSE 계열 전체에 동일하게 적용됩니다.
Syntax
CAS <Ws>, <Wt>, [<Xn|SP>]
Example
CAS W0, W1, [X19] // *X19 == W0 이면 *X19 = W1, 항상 원래값을 W0에 반환
✅ Compare and Branch if Not Zero. Branches to a label if the register is nonzero, without affecting the condition flags.
✅ 비교 후 0이 아니면 분기합니다. 조건 플래그에 영향을 주지 않고, 레지스터 값이 0이 아니면 지정한 라벨로 분기합니다.
Syntax
CBNZ <Wt|Xt>, <label>
Example
CBNZ X0, loop
✅ Compare and Branch if Zero. Branches to a label if the register equals zero, without affecting the condition flags.
✅ 비교 후 0이면 분기합니다. 조건 플래그에 영향을 주지 않고, 레지스터 값이 0이면 지정한 라벨로 분기합니다.
Syntax
CBZ <Wt|Xt>, <label>
Example
CBZ X0, done
✅ Conditional Compare Negative. Same as CCMP but performs a CMN-style (addition-based) comparison when the condition is true.
✅ 조건부 음수 비교. CCMP와 동일하지만, 조건이 참일 때 CMN 방식(덧셈 기반)으로 비교합니다.
Syntax
CCMN <Wn|Xn>, <Wm|Xm>, #<nzcv>, <cond>
Example
CCMN X0, X1, #0b0100, EQ
✅ Conditional Compare. If the given condition is true, performs a normal CMP and updates NZCV accordingly; if false, sets NZCV directly to the given 4-bit immediate instead. Used to evaluate compound boolean conditions (e.g. ‘a > 0 && b < 10’) without branching.
✅ 조건부 비교. 주어진 조건이 참이면 일반 CMP처럼 비교하여 NZCV를 갱신하고, 거짓이면 대신 주어진 4비트 즉시값을 NZCV에 그대로 씁니다. 분기 없이 복합 논리 조건(‘a > 0 && b < 10’ 같은)을 평가할 때 사용합니다.
Syntax
CCMP <Wn|Xn>, <Wm|Xm>, #<nzcv>, <cond>
Example
CMP X0, #0
CCMP X1, #10, #0b0000, GT // X0>0 이면서 X1<10 인지 검사
B.LT both_conditions_true
✅ Conditional Increment. If the condition is true, Rd = Rn + 1; otherwise Rd = Rn. An alias of CSINC that reads more naturally at the call site than spelling out CSINC with a duplicated register.
✅ 조건부 증가. 조건이 참이면 Rd = Rn + 1, 거짓이면 Rd = Rn을 대입합니다. CSINC의 별칭(alias)으로, 레지스터를 중복 기입하는 CSINC보다 호출부에서 의도가 더 잘 드러납니다.
Syntax
CINC <Wd|Xd>, <Wn|Xn>, <cond>
Example
CMP X0, X1
CINC X2, X3, GT // X0 > X1 이면 X2 = X3 + 1, 아니면 X2 = X3
✅ Conditional Invert. If the condition is true, Rd = ~Rn (bitwise NOT); otherwise Rd = Rn. An alias of CSINV.
✅ 조건부 비트 반전. 조건이 참이면 Rd = ~Rn(비트 NOT), 거짓이면 Rd = Rn을 대입합니다. CSINV의 별칭입니다.
Syntax
CINV <Wd|Xd>, <Wn|Xn>, <cond>
Example
CMP X0, X1
CINV X2, X3, EQ
✅ Clear Exclusive. Manually clears the exclusive-access monitor set by a prior LDXR/LDAXR without performing a store. Used when an LDXR was issued but the code decides to abandon the atomic attempt (e.g. taking an early-exit branch) instead of following through with STXR.
✅ 배타적 감시 해제. 이전 LDXR/LDAXR로 설정된 배타적 접근 감시 상태를 실제 저장 없이 수동으로 해제합니다. LDXR을 실행했지만 이후 STXR로 이어가지 않고 원자적 시도를 포기해야 할 때(예: 조기 종료 분기를 타는 경우) 사용합니다.
Syntax
CLREX
Example
CLREX // LDXR 이후 STXR 없이 루틴을 빠져나갈 때
✅ Count Leading Sign bits. Counts the number of bits following the sign bit that are identical to the sign bit (i.e. how many bits before the value ‘changes’), and writes the count to the destination register.
✅ 선행 부호 비트 개수. 부호 비트와 동일한 값이 그 뒤로 몇 개나 이어지는지(즉 값이 ‘바뀌기’ 전까지의 비트 수)를 세어 대상 레지스터에 저장합니다.
먼저 동작을 숫자로 확인
X1 = 0b1111 1111 1111 0110 ... (앞쪽에 1이 쭉 이어지다가 어딘가서 바뀜)
CLS는 부호비트(맨 앞 1비트) 다음부터, 그 부호비트와 “같은” 값이 몇 개 연속되는지를 세요.- 즉 “값이 바뀌기 직전까지 몇 비트가 낭비(?)되고 있는가”를 알려줌.
실전 목적 1: “이 숫자, 더 작은 타입에 넣어도 안전한가?” 체크
int64_t x = 5; // 64비트를 다 쓸 필요 없는 작은 값
-
5를 64비트로 저장하면 사실 상위 61비트가 전부 부호비트(0)와 똑같은 낭비 공간이에요.CLS X0, X1하면 결과가 61(또는 그 근처) 같은 큰 값이 나오고, 이걸 보고: -
“이 값은 상위 비트가 다 낭비되고 있으니,
int8_t나int16_t로 압축해도 정보 손실이 없겠구나” 라고 런타임에 즉시 판단할 수 있음. -
실제로 컴파일러 최적화(값 범위 좁혀서 레지스터 폭 줄이기)나 동적 타입 언어의 정수 압축(예: Python/JS 내부 구현에서 작은 정수를 특수 태그로 압축하는 기법)에 이런 카운트가 쓰여요.
실전 목적 2: 오버플로우 여유(Headroom) 계산
int64_t a, b;
int64_t sum = a + b; // 오버플로우 안 나겠지?
- 덧셈하기 전에
a와b각각의CLS값을 보면, “이 두 수를 더해도 부호비트가 안 뒤집힐 만큼 여유가 있는가”를 미리 가늠할 수 있어요. - 나눗셈/곱셈 전에 결과가 오버플로우 안 할지 빠르게 사전 체크하는 트릭으로 씁니다.
실전 목적 3: 부호 있는 값의 “선행 0/1 압축” — 데이터 인코딩
네트워크 패킷이나 파일 포맷에서 가변 길이 정수 인코딩(varint 계열) 할 때, “이 숫자를 표현하는 데 실제로 몇 비트가 필요한가”를 빨리 알아야 해요. 부호 없는 값이면 CLZ(Count Leading Zeros)를 쓰지만, 부호 있는 값이면 CLS가 그 역할을 해요.
CLZ와의 관계로 정리
| 니모닉 | 대상 | 세는 것 |
|---|---|---|
| CLZ (Count Leading Zeros) | Unsigned | 맨 앞부터 이어지는 0의 개수 |
| CLS (Count Leading Sign bits) | Signed | 부호비트 다음부터 이어지는, 부호비트와 같은 값의 개수 |
- 둘 다 목적은 동일: “이 숫자, 실제로 몇 비트나 의미 있게 쓰고 있나?”
- 다만 부호 없는 값은 그냥 0의 개수만 보면 되고,
- 부호 있는 값은 부호비트를 기준으로 “일치하는 구간”을 봐야 하니
CLS가 따로 존재하는 거예요. - 음수는 앞쪽이 1로 채워지니까요 — 2의 보수 표현 특성 상.
Syntax
CLS <Wd|Xd>, <Wn|Xn>
Example
CLS X0, X1
✅ Count Leading Zeros. Counts the number of consecutive zero bits starting from the most significant bit, and writes the count to the destination register.
✅ 선행 0 개수. 최상위 비트부터 연속으로 이어지는 0 비트의 개수를 세어 대상 레지스터에 저장합니다.
Syntax
CLZ <Wd|Xd>, <Wn|Xn>
Example
CLZ X0, X1 // X1=0x0F... 이면 앞쪽 0의 개수 반환
✅ Compare Equal (vector). Per-lane: compares two vectors (or a vector and zero) and sets every bit of the destination lane to 1 if equal, or 0 if not - producing a mask usable with BSL/BIT/BIF or AND.
✅ 같음 비교(벡터). 레인별로 두 벡터(또는 벡터와 0)를 비교해서, 같으면 해당 레인 전체를 1로, 다르면 0으로 채웁니다. 이렇게 만든 마스크는 BSL/BIT/BIF나 AND와 함께 씁니다.
Syntax
CMEQ <Vd>.<T>, <Vn>.<T>, <Vm>.<T> or CMEQ <Vd>.<T>, <Vn>.<T>, #0
Example
CMEQ V0.4S, V1.4S, V2.4S // 레인별로 같으면 0xFFFFFFFF, 다르면 0
✅ Compare Greater than or Equal, signed (vector). Per-lane signed comparison (>=), producing an all-1s/all-0s mask.
✅ 벡터 비교(크거나 같음(>=), 부호 있음). 레인별로 부호 있는 값끼리 크거나 같은지 비교하여 마스크를 만듭니다.
Syntax
CMGE <Vd>.<T>, <Vn>.<T>, <Vm>.<T>
Example
CMGE V0.4S, V1.4S, V2.4S
✅ Compare Greater Than, signed (vector). Per-lane signed comparison, producing an all-1s/all-0s mask like CMEQ.
✅ 벡터 비교(초과, 부호 있음). 레인별로 부호 있는 값끼리 비교하여, CMEQ처럼 전체-1/전체-0 마스크를 만듭니다.
Syntax
CMGT <Vd>.<T>, <Vn>.<T>, <Vm>.<T>
Example
CMGT V0.4S, V1.4S, V2.4S
✅ Compare Higher, unsigned (vector). Per-lane unsigned greater-than comparison, producing an all-1s/all-0s mask. Use this instead of CMGT when the lanes hold unsigned values.
✅ 벡터 비교(더 높음, 부호 없음). 레인별로 부호 없는 값끼리 초과 비교하여 마스크를 만듭니다. 레인이 부호 없는 값일 때는 CMGT 대신 이걸 씁니다.
Syntax
CMHI <Vd>.<T>, <Vn>.<T>, <Vm>.<T>
Example
CMHI V0.16B, V1.16B, V2.16B
✅ Compare Higher or Same, unsigned (vector). Per-lane unsigned greater-or-equal comparison, producing an all-1s/all-0s mask.
✅ 벡터 비교(더 높거나 같음, 부호 없음). 레인별로 부호 없는 값끼리 이상 비교하여 마스크를 만듭니다.
Syntax
CMHS <Vd>.<T>, <Vn>.<T>, <Vm>.<T>
Example
CMHS V0.16B, V1.16B, V2.16B
✅ Compare Negative. Adds two operands and updates the condition flags without storing the result; equivalent to comparing against a negative value. Alias for ADDS with a discarded destination.
✅ 음수 비교. 두 피연산자를 더하여 조건 플래그만 갱신하고 결과는 버립니다. 음수와 비교하는 것과 동일한 효과이며, 결과를 버리는 ADDS의 별칭입니다. (두 값을 더했을 때 결과가 0인지 음수인지 등을 비교하는 명령어)
Syntax
CMN <Wn|Xn>, <Wm|Xm> or CMN <Wn|Xn>, #<imm>
Example
CMN X0, #1 // X0 == -1 인지 검사하는 것과 동일
✅ Compare. Compares two operands by subtracting them and updates the condition flags.
✅ 비교합니다. 두 피연산자를 뺀 결과로 조건 플래그를 갱신하며, 결과값 자체는 저장하지 않습니다.
Syntax
CMP <Wn|Xn>, <Wm|Xm> or CMP <Wn|Xn>, #<imm>
Example
CMP X0, X1
CMP W2, #0
✅ Conditional Negate. If the condition is true, Rd = -Rn (two’s-complement negate); otherwise Rd = Rn. An alias of CSNEG - useful for a branchless abs()-style computation together with a sign check.
✅ 조건부 부호 반전. 조건이 참이면 Rd = -Rn(2의 보수 부호 반전), 거짓이면 Rd = Rn을 대입합니다. CSNEG의 별칭이며, 부호 검사와 함께 쓰면 분기 없는 abs() 계산에 유용합니다.
Syntax
CNEG <Wd|Xd>, <Wn|Xn>, <cond>
Example
CMP X0, #0
CNEG X0, X0, MI // X0가 음수(MI)면 부호를 뒤집어 절댓값처럼 만듦
✅ Conditional Select. Writes one of two source registers to the destination depending on the condition flags, without branching (branchless if/else).
✅ 조건부 선택. 분기 없이 조건 플래그에 따라 두 소스 레지스터 중 하나를 대상 레지스터에 씁니다(분기 없는 if/else).
Syntax
CSEL <Wd|Xd>, <Wn|Xn>, <Wm|Xm>, <cond>
Example
CSEL X0, X1, X2, GT // X0 = (X1 > X2) ? X1 : X2 (after a prior CMP)
✅ Conditional Set. Sets the destination register to 1 if the condition holds, or 0 otherwise, based on the condition flags.
✅ 조건부 설정. 조건 플래그를 기준으로 조건이 참이면 대상 레지스터를 1로, 아니면 0으로 설정합니다.
Syntax
CSET <Wd|Xd>, <cond>
Example
CSET X0, EQ
✅ Conditional Set Mask. If the condition is true, Rd = all-1s (0xFFFF…); otherwise Rd = 0. An alias of CSINV using XZR for both source registers - the scalar counterpart of what CMEQ/CMGT produce per-lane in NEON, handy for building a branchless mask.
✅ 조건부 마스크 설정. 조건이 참이면 Rd = 전체-1(0xFFFF…), 거짓이면 Rd = 0을 대입합니다. 양쪽 소스에 XZR을 쓰는 CSINV의 별칭이며, NEON의 CMEQ/CMGT가 레인별로 만드는 마스크를 스칼라로 흉내낼 때, 분기 없는 마스크를 만들 때 유용합니다.
Syntax
CSETM <Wd|Xd>, <cond>
Example
CMP X0, X1
CSETM X2, EQ // 같으면 X2 = 0xFFFFFFFFFFFFFFFF, 다르면 X2 = 0
✅ Conditional Select Increment. Writes Xn to the destination if the condition is true, otherwise writes (Xm + 1). CSET is built from this instruction (CSINC with XZR, XZR and the inverted condition).
✅ 조건부 선택 증가. 조건이 참이면 Xn을, 거짓이면 (Xm + 1)을 대상 레지스터에 씁니다. CSET 명령어가 바로 이것(XZR, XZR과 반전된 조건)의 별칭으로 만들어집니다.
Syntax
CSINC <Wd|Xd>, <Wn|Xn>, <Wm|Xm>, <cond>
Example
CSINC X0, X1, X2, EQ // X0 = (조건참) ? X1 : X2+1
✅ Conditional Select Invert. Writes Xn to the destination if the condition is true, otherwise writes the bitwise NOT of Xm.
✅ 조건부 선택 반전. 조건이 참이면 Xn을, 거짓이면 Xm의 비트 반전값을 대상 레지스터에 씁니다.
Syntax
CSINV <Wd|Xd>, <Wn|Xn>, <Wm|Xm>, <cond>
Example
CSINV X0, X1, X2, EQ // X0 = (조건참) ? X1 : ~X2
✅ Conditional Select Negate. Writes Xn to the destination if the condition is true, otherwise writes the two’s-complement negation of Xm.
✅ 조건부 선택 부호반전. 조건이 참이면 Xn을, 거짓이면 Xm의 2의 보수(음수화)를 대상 레지스터에 씁니다.
Syntax
CSNEG <Wd|Xd>, <Wn|Xn>, <Wm|Xm>, <cond>
Example
CSNEG X0, X1, X2, EQ // X0 = (조건참) ? X1 : -X2 (예: abs() 구현에 사용)