MIPS Logical Instruction
MIPS 논리 연산 명령어
- 논리 연산은 기본적으로 같은 Bit-Position끼리 연산을 수행하게 된다.
- \(\texttt{and, or, nor}\)
- \(\texttt{andi, ori}\)
- \(\texttt{sll, srl, sra}\)
- \(\texttt{sllv, srlv, srav}\)
※ Logical Operator Usage (논리 연산자의 관용적인 활용 사례)
AND 연산 : 어떤 Bit 값을 Masking(감추는)하는데에 사용된다.
OR 연산 : 두 Bit 값을 Combine(혼합)하는데에 사용된다. (각각, 상위 bit와 하위 bit가 0인 값들끼리의 OR 연산)
NOR 연산 : 본래 NOR 연산은 OR 연산 후 NOT 연산을 수행한다. 하지만 관용적으로 \(\texttt{\$zero}\) 레지스터와 함께 사용되어 Bit 값을 반전시키는 데에 사용된다.
Shift Operation (비트 이동 연산)
- 피연산자 부호의 유무에 따라 산술 Shift 연산, 논리 Shift 연산으로 나뉜다.
- 피연산자의 Bit를 이동시키는 방향에 따라 Shift-Left 연산, Shift-Right 연산으로 나뉜다.
Arithmetic Shift 연산 : 부호가 있는 수치에 대한 Shift 연산이다. Signed Shift라고도 부른다.
Logical Shift 연산 : 부호가 없는 수치에 대한 Shift 연산이다. Unsigned Shift라고도 부른다.
Shift-Left 연산 : 모든 Bit들을 왼쪽으로 한 칸 이동시키는 연산으로, 2를 곱하는 것과 같은 효과를 낸다. (오른편에 새로 생기는 Bit는 0으로 채운다.)
Shift-Right 연산 : 모든 Bit들을 오른쪽으로 한 칸 이동시키는 연산으로, 2로 나누는 것과 같은 효과를 낸다. (오른쪽에서 밀려나는 Floor value가 생긴다. 이로 인해 Right-Shift 연산이 수행된 결과값은 2를 나눈 값보다 같거나 작은 값을 취하게 된다.)
Logical Shift-Left 연산 : MSB부터 없어지며, LSB는 0으로 채워진다.
Logical Shift-Right 연산 : LSB부터 없어지며, MSB는 0으로 채워진다.
Arithmetic Shift-Left 연산 : MSB부터 없어지며, LSB는 0으로 채워진다.
Arithmetic Shift-Right 연산 : LSB부터 없어지며, MSB에는 Sign-Extend가 일어난다.
※ Shift-Left 연산의 경우 산술/논리 연산에 따라 차이점이 없어, Instruction 상에서도 구분할 필요가 없다.
※ Shift-Right 연산의 경우 산술 연산과 논리 연산의 구동 방식에 차이가 있어 Instruction 상에서 구분이 필요하다.
따라서, Shift-Right 연산(\(\texttt{sra, srl}\))은 따로 존재하지만, Shift-Left 연산(\(\texttt{sll}\))은 단일 형태로 존재한다.
\(\texttt{and, or, nor}\) Instruction (R-Format)
and RD, RS, RT # $RD ← $RS & $RT
or RD, RS, RT # $RD ← $RS | $RT
nor RD, RS, RT # $RD ← NOT($RS | $RT)
- \(\texttt{RS}\)와 \(\texttt{RT}\)에 대한 AND, OR, NOR 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RS}\) : Source 레지스터 (첫 번째 피연산자)
- \(\texttt{RT}\) : Source 레지스터 (두 번째 피연산자, S다음이라서 T이다.)
\(\texttt{andi, ori}\) Instruction (I-Format)
andi RD, RS, immediateConstant # $RD ← $RS & Constant
ori RD, RS, immediateConstant # $RD ← $RS | Constant
- \(\texttt{RS}\)와 \(\texttt{immediateConstant}\)에 대한 AND, OR 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RS}\) : Source 레지스터 (피연산자 레지스터)
- \(\texttt{immediateConstant}\) : 상숫값 (피연산자 상수, 실제 정숫값이 위치한다.)
- 일반적으로 I-Format을 통한 연산에서는 2의 보수에 기초한 Sign-Extend가 기본값으로 설정되어 진행되지만, 논리 연산(\(\texttt{andi, ori, xori}\))은 Bit-by-Bit 연산이기 때문에 \(\texttt{immediateConstant}\)에는 앞부분 Bit를 0으로 채우는 Zero-Extension이 수행된다.
\(\texttt{sll, srl, sra}\) Instruction (R-Format)
sll RD, RT, SHAMT # $RD ← $RT << SHAMT (Don't Care)
srl RD, RT, SHAMT # $RD ← $RT >> SHAMT (Logical)
sra RD, RT, SHAMT # $RD ← $RT >> SHAMT (Arithmatic -> Sign-Extended)
- \(\texttt{RT}\)에 \(\texttt{SHAMT}\) 만큼의 Shift 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RT}\) : Source 레지스터 (피연산자 레지스터)
- \(\texttt{SHAMT}\) : Shift Amount (Shift 연산을 수행할 횟수, 상수 표현, 5Bit 이하의 값)
\(\texttt{sllv, srlv, srav}\) Instruction (R-Format)
sllv RD, RT, RS # $RD ← $RT << RS (Don't Care)
srlv RD, RT, RS # $RD ← $RT >> RS (Logical)
srav RD, RT, RS # $RD ← $RT >> RS (Arithmatic -> Sign-Extended)
- \(\texttt{RT}\)에 \(\texttt{RS}\) 만큼의 Shift 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- Postfix "\(\texttt{v}\)"는 Variable을 의미한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RT}\) : Source 레지스터 (피연산자 레지스터)
- \(\texttt{RS}\) : Shift Amount값을 저장한 레지스터 (Shift 연산을 수행할 횟수, 변수 표현, 5Bit 이하의 값)
- SHAMT값을 변수로 전달했으므로, Instruction Field내의 SHAMT 필드의 값은 0으로 저장된다.
Bounds Check Shortcut (경계값 검사 테크닉)
- Signed Number \(\texttt{X}\)에 대해 \(\texttt{0} \leq \texttt{X} \leq \texttt{Y}\)와 같은 비교연산을 수행할 때, \(\texttt{X}\)를 Unsigned Number로 간주하고 \(\texttt{X < Y}\) 비교연산만 수행하는 방법이다.
- 2의 보수 체계에서 음수의 MSB는 항상 1인데, 이를 Unsigned Number로 간주하게 되면 굉장히 큰 수(MSB가 1인 부호없는 수)가 되어 결국엔 비교식의 논리와 같아지는 형태로 만드는 기술이다.
- \(\texttt{0} \leq \texttt{X(signed)} \leq \texttt{Y} \iff \texttt{X(unsigned) < Y}\)
MIPS Logical Instruction
MIPS 논리 연산 명령어
- 논리 연산은 기본적으로 같은 Bit-Position끼리 연산을 수행하게 된다.
- \(\texttt{and, or, nor}\)
- \(\texttt{andi, ori}\)
- \(\texttt{sll, srl, sra}\)
- \(\texttt{sllv, srlv, srav}\)
※ Logical Operator Usage (논리 연산자의 관용적인 활용 사례)
AND 연산 : 어떤 Bit 값을 Masking(감추는)하는데에 사용된다.
OR 연산 : 두 Bit 값을 Combine(혼합)하는데에 사용된다. (각각, 상위 bit와 하위 bit가 0인 값들끼리의 OR 연산)
NOR 연산 : 본래 NOR 연산은 OR 연산 후 NOT 연산을 수행한다. 하지만 관용적으로 \(\texttt{\$zero}\) 레지스터와 함께 사용되어 Bit 값을 반전시키는 데에 사용된다.
Shift Operation (비트 이동 연산)
- 피연산자 부호의 유무에 따라 산술 Shift 연산, 논리 Shift 연산으로 나뉜다.
- 피연산자의 Bit를 이동시키는 방향에 따라 Shift-Left 연산, Shift-Right 연산으로 나뉜다.
Arithmetic Shift 연산 : 부호가 있는 수치에 대한 Shift 연산이다. Signed Shift라고도 부른다.
Logical Shift 연산 : 부호가 없는 수치에 대한 Shift 연산이다. Unsigned Shift라고도 부른다.
Shift-Left 연산 : 모든 Bit들을 왼쪽으로 한 칸 이동시키는 연산으로, 2를 곱하는 것과 같은 효과를 낸다. (오른편에 새로 생기는 Bit는 0으로 채운다.)
Shift-Right 연산 : 모든 Bit들을 오른쪽으로 한 칸 이동시키는 연산으로, 2로 나누는 것과 같은 효과를 낸다. (오른쪽에서 밀려나는 Floor value가 생긴다. 이로 인해 Right-Shift 연산이 수행된 결과값은 2를 나눈 값보다 같거나 작은 값을 취하게 된다.)
Logical Shift-Left 연산 : MSB부터 없어지며, LSB는 0으로 채워진다.
Logical Shift-Right 연산 : LSB부터 없어지며, MSB는 0으로 채워진다.
Arithmetic Shift-Left 연산 : MSB부터 없어지며, LSB는 0으로 채워진다.
Arithmetic Shift-Right 연산 : LSB부터 없어지며, MSB에는 Sign-Extend가 일어난다.
※ Shift-Left 연산의 경우 산술/논리 연산에 따라 차이점이 없어, Instruction 상에서도 구분할 필요가 없다.
※ Shift-Right 연산의 경우 산술 연산과 논리 연산의 구동 방식에 차이가 있어 Instruction 상에서 구분이 필요하다.
따라서, Shift-Right 연산(\(\texttt{sra, srl}\))은 따로 존재하지만, Shift-Left 연산(\(\texttt{sll}\))은 단일 형태로 존재한다.
\(\texttt{and, or, nor}\) Instruction (R-Format)
and RD, RS, RT # $RD ← $RS & $RT
or RD, RS, RT # $RD ← $RS | $RT
nor RD, RS, RT # $RD ← NOT($RS | $RT)
- \(\texttt{RS}\)와 \(\texttt{RT}\)에 대한 AND, OR, NOR 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RS}\) : Source 레지스터 (첫 번째 피연산자)
- \(\texttt{RT}\) : Source 레지스터 (두 번째 피연산자, S다음이라서 T이다.)
\(\texttt{andi, ori}\) Instruction (I-Format)
andi RD, RS, immediateConstant # $RD ← $RS & Constant
ori RD, RS, immediateConstant # $RD ← $RS | Constant
- \(\texttt{RS}\)와 \(\texttt{immediateConstant}\)에 대한 AND, OR 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RS}\) : Source 레지스터 (피연산자 레지스터)
- \(\texttt{immediateConstant}\) : 상숫값 (피연산자 상수, 실제 정숫값이 위치한다.)
- 일반적으로 I-Format을 통한 연산에서는 2의 보수에 기초한 Sign-Extend가 기본값으로 설정되어 진행되지만, 논리 연산(\(\texttt{andi, ori, xori}\))은 Bit-by-Bit 연산이기 때문에 \(\texttt{immediateConstant}\)에는 앞부분 Bit를 0으로 채우는 Zero-Extension이 수행된다.
\(\texttt{sll, srl, sra}\) Instruction (R-Format)
sll RD, RT, SHAMT # $RD ← $RT << SHAMT (Don't Care)
srl RD, RT, SHAMT # $RD ← $RT >> SHAMT (Logical)
sra RD, RT, SHAMT # $RD ← $RT >> SHAMT (Arithmatic -> Sign-Extended)
- \(\texttt{RT}\)에 \(\texttt{SHAMT}\) 만큼의 Shift 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RT}\) : Source 레지스터 (피연산자 레지스터)
- \(\texttt{SHAMT}\) : Shift Amount (Shift 연산을 수행할 횟수, 상수 표현, 5Bit 이하의 값)
\(\texttt{sllv, srlv, srav}\) Instruction (R-Format)
sllv RD, RT, RS # $RD ← $RT << RS (Don't Care)
srlv RD, RT, RS # $RD ← $RT >> RS (Logical)
srav RD, RT, RS # $RD ← $RT >> RS (Arithmatic -> Sign-Extended)
- \(\texttt{RT}\)에 \(\texttt{RS}\) 만큼의 Shift 연산을 수행한 결과를 \(\texttt{RD}\)에 저장한다.
- Postfix "\(\texttt{v}\)"는 Variable을 의미한다.
- \(\texttt{RD}\) : 목적지 레지스터 (연산 결과를 저장)
- \(\texttt{RT}\) : Source 레지스터 (피연산자 레지스터)
- \(\texttt{RS}\) : Shift Amount값을 저장한 레지스터 (Shift 연산을 수행할 횟수, 변수 표현, 5Bit 이하의 값)
- SHAMT값을 변수로 전달했으므로, Instruction Field내의 SHAMT 필드의 값은 0으로 저장된다.
Bounds Check Shortcut (경계값 검사 테크닉)
- Signed Number \(\texttt{X}\)에 대해 \(\texttt{0} \leq \texttt{X} \leq \texttt{Y}\)와 같은 비교연산을 수행할 때, \(\texttt{X}\)를 Unsigned Number로 간주하고 \(\texttt{X < Y}\) 비교연산만 수행하는 방법이다.
- 2의 보수 체계에서 음수의 MSB는 항상 1인데, 이를 Unsigned Number로 간주하게 되면 굉장히 큰 수(MSB가 1인 부호없는 수)가 되어 결국엔 비교식의 논리와 같아지는 형태로 만드는 기술이다.
- \(\texttt{0} \leq \texttt{X(signed)} \leq \texttt{Y} \iff \texttt{X(unsigned) < Y}\)