지난 글에서는 단점일도 FPU 명령어 사용 예제를 살펴보았다. 이번 글에서는 배정밀도 FPU 명령어 사용 예제를 살펴보고자 한다. Double-Precision Floating Point Computation 배정밀도 연산자는 기존 연산자 끝에 s 대신 d 가 붙는 것만 다르다. faddd fsubd fmuld fsmuld (single * single = double, 피연산자는 single 이다.) fdivd fsqrtd double 연산자의 피연산자 레지스터는 반드시 짝수번째 레지스터가 들어가야 한다. %fi 와 %f(i+1) 의 2개 레지스터로 하나의 소수를 표현하기 때문이다. 연산 결과도 double 로 나오므로 짝수번째 레지스터를 사용한다. 데이터 형변환 명령어도 종류가 늘어났다. fitod ..
지난 글까지 실수에서의 산술연산 방법과 FPU의 개념 및 FPU에서 사용 가능한 연산들에 대해 정리하였다. 이번 글에서는 정리한 명령어를 직접 사용해보면서 명령어에 익숙해져보려고 한다. 단정밀도 예제 1 다음 코드를 어셈블리로 컴파일해보자. void main() { static float a = 1.5, b=10.5, c=0.0, d=3.5; if (c == d) c = a+b; else c = a-b; } 간단히 float 형 (단정밀도) 정적 변수 4개를 선언해 값을 할당하고, 비교해서 연산 결과 값을 저장하는 코드이다. 먼저 static 정적 공간에 데이터를 생성해야 하므로, ".data" 섹션을 사용하면 된다. .data 섹션에 단정밀도 공간을 할당하는 방법은 아래와 같이 하면 된다. 선언하는 사..
지난 글에서는 Floating Point 의 개념과 10진 소수를 이진 소수로 상호 변환하는 과정을 정리하였다. 이번 글에서는 Floating Point 간 사칙 연산을 정리하고자 한다. SPARC는 FPU 라고 하는 실수 계산용 arithmetic units (산술 연산 유닛) 이 존재하여, 덧셈/뺄셈/곱셈/나눗셈 기능을 지원한다. 그래서 정수와는 다르게, 곱셈과 나눗셈을 '명령어' 수준으로도 지원한다. 먼저 FPU를 살펴보기 전에, 실수의 산술 연산 과정을 정리해보자. 실수 덧뺄셈 실수의 덧뺄셈은 아래 과정으로 진행된다. 1. significand를 맞춘다. 2. significand 끼리 더해준다. 3. 결과를 Normalize 한다. 4. 기존 자릿수에 맞게 유효숫자를 맞춘 뒤, 필요하다면 다시 ..