FMSUB
Summary
FMSUB는 Floating-point Multiply-Subtract (부동소수점 곱하고 빼기)의 약자입니다.
1. FMSUB 명령어의 본질과 공식
FMSUB는 앞서 배운 FMADD와 마찬가지로 일반 사무직(낱개 레지스터, S나 D) 소속입니다. 단 한 줄, 단 1클럭 만에 두 실수를 곱한 뒤 다른 수에서 빼버리는 마법을 부리는데, 공식이 아주 독특합니다.
- 동작 공식: S0 = S3 - (S1 * S2)
- 문법 구조 (ARM64):
FMSUB S0, S1, S2, S3 ; S1과 S2를 곱한 값을 ‘S3에서 빼서’ S0에 저장해라!
⚠️ 주의! 뒤에서 앞으로 뺍니다! 보통 Subtract라고 하면 (S1 * S2) - S3 일 것 같지만, 하드웨어 규칙은 맨 뒤에 있는 레지스터(S3)에서 곱한 결과값을 빼는 구조입니다. 이 순서를 거꾸로 생각해서 코드를 분석하면 완전히 엉뚱한 결론이 나기 때문에, 꼭 기억해야 할 핵심 포인트.
2. 🔄 혼동 방지! FMSUB vs FMLS 전격 비교 판넬
- FMSUB (일반 사무직 소속 낱개 연산):
- 낱개의 실수 1쌍만 계산합니다. (S 혹은 D 레지스터 사용)
- 목적지와 재료 레지스터가 다 따로 있어서 총 4개의 레지스터가 필요합니다.
- 공식: S0 = S3 - (S1 * S2)
- FMLS (특수부대 SIMD 소속 대량 병렬 연산):
- 여러 개의 실수를 한 방에 병렬 계산합니다. (V 벡터 레지스터 사용)
- 목적지 레지스터가 기존 누적값 역할까지 동시에 하므로 총 3개의 레지스터만 씁니다.
- 공식: V0 = V0 - (V1 * V2)
3. 언제 주로 사용하나요?
수학 공식이나 물리 법칙을 컴퓨터 코드로 옮기다 보면 “어떤 기준값에서 오차나 변화량을 빼는 구조”인 $Y = C - (A \times B)$ 형태를 정말 자주 만나게 됩니다.
- PID 제어 알고리즘: 목표치에서 현재 제어 입력 변화량을 뺄 때
- 그래픽스 광원 연산: 전체 밝기 세기에서 거리 감쇠 효과(거리 * 감쇠율)를 빼서 최종 밝기를 구할 때
만약 FMSUB 명령어가 없다면 CPU는 곱하기(FMUL) 따로 하고, 부호 바꾸고(FNEG), 더하기(FADD) 하는 번거로운 과정을 거쳐야 하지만, FMSUB 한 줄이면 하드웨어 융합 회로가 오차(반올림 에러)를 단 1회로 줄이면서 빛의 속도로 계산을 끝내줍니다.
🧱 융합 연산(Fused) 최종 마침표 판넬
4대 천왕을 깔끔한 공식
| 니모닉 | 소속 무대 | 실제 작동하는 수학 공식 | 하드웨어 내부의 비밀 포인트 |
|---|---|---|---|
| FMADD | 일반 레지스터 (S, D) | $Xd = (Xn \times Xm) + Xa$ | 곱하고 더하기 (가장 널리 쓰이는 기본형) |
| FMSUB | 일반 레지스터 (S, D) | $Xd = Xa - (Xn \times Xm)$ | 뒤의 값(Xa)에서 곱한 값을 빼는 반전 구조! |
| FMLA | SIMD 벡터 레지스터 (V) | $Vd = Vd + (Vn \times Vm)$ | 대량의 데이터를 동시에 곱하고 누적 더하기 |
| FMLS | SIMD 벡터 레지스터 (V) | $Vd = Vd - (Vn \times Vm)$ | 대량의 데이터를 동시에 곱하고 누적 빼기 |