3.8: Logical Operators
- Page ID
- 28489
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\dsum}{\displaystyle\sum\limits} \)
\( \newcommand{\dint}{\displaystyle\int\limits} \)
\( \newcommand{\dlim}{\displaystyle\lim\limits} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\(\newcommand{\longvect}{\overrightarrow}\)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)Most programmers have seen logical operators in HLL for Boolean data types. As was covered earlier in this text, there are often two form of these operators, the logical (or short-circuiting) operators and the bitwise operators. MIPS only implements the bitwise operators, but they are called logical operators. Since all Boolean operations can be implemented with only 3 operations, the AND, OR, and NOT operations, this sections will present these 3 operations. In addition the XOR operation will be included for convenience because it is often easier to state a logical expression using XOR than to do so using AND, OR, and NOT. See the problems at the end of the chapter to see how to implement logical operations using these 4 basic logic operations.
The logic operators covered are:
andoperator, which has three formats. The first format is the only real format of this operator. The operator does a bit-wise AND of Rs and Rt and stores the result Rd register. The format and meaning of this operator is:format:
and Rd, Rs, Rtmeaning:
Rd <- Rs AND RtThe second format of the
andoperator is a pseudo instruction. In this case the 3rd operator is immediate value, and so this is just a short hand for implementing theandioperator. The format, meaning, and translation of the pseudo operators is as follows:format:
and Rt, Rs, Immediatemeaning:
Rt <- Rs AND Immediatetranslation:
andi Rt, Rs, ImmediateThe third format of the
andoperator is also a pseudo instruction, and strange in that only logical operators have this format. In this instruction, Rs and Rt are assumed to be the same register, and the 3rd operator is immediate value The format, meaning, and translation of the pseudo operators is as follows:format:
and Rs, Immediatemeaning:
Rs <- Rs AND Immediatetranslation:
andi Rs, Rs, Immediateandioperator. The operator does a bit-wise AND of Rs and an immediate value, and stores the result Rt register. The format and meaning of this operator is:format:
andi Rt, Rs, Immediatemeaning:
Rt <- Rs AND ImmediateThe shorthand with a single register also applies to the andi instruction.
format:
andi Rs, Immediatemeaning:
Rs <- Rs AND Immediatetranslation:
andi Rs, Rs, Immediateoroperator, which has three formats. The first format is the only real format of this operator. The operator does a bit-wise OR of Rs and Rt and stores the result Rd register. The format and meaning of this operator is:format:
or Rd, Rs, Rtmeaning:
Rd <- Rs OR RtThe second format of the
andoperator is a pseudo instruction. In this case the 3rd operator is immediate value, and so this is just a short hand for implementing theorioperator. The format, meaning, and translation of the pseudo operators is as follows:format:
or Rt, Rs, Immediatemeaning:
Rt <- Rs OR Immediatetranslation:
ori Rt, Rs, ImmediateThe shorthand with a single register also applies to the or instruction.
format:
or Rs, Immediatemeaning:
Rs <- Rs OR Immediatetranslation:
andi Rs, Rs, Immediateorioperator. The operator does a bit-wise OR of Rs and an immediate value, and stores the result Rt register. The format and meaning of this operator is:format:
ori Rt, Rs, Immediatemeaning:
Rt <- Rs OR ImmediateThe shorthand with a single register also applies to the ori instruction.
format:
ori Rs, Immediatemeaning:
Rs <- Rs OR Immediatetranslation:
ori Rs, Rs, Immediatexoroperator, which has three formats. The first format is the only real format of this operator. The operator does a bit-wise OR of Rs and Rt and stores the result Rd register. The format and meaning of this operator is:format:
xor Rd, Rs, Rtmeaning:
Rd <- Rs XOR RtThe second format of the and operator is a pseudo instruction. In this case the 3rd operator is immediate value, and so this is just a short hand for implementing the
orioperator. The format, meaning, and translation of the pseudo operators is as follows:format:
xor Rt, Rs, Immediatemeaning:
Rt <- Rs XOR Immediatetranslation:
xori Rt, Rs, ImmediateThe shorthand with a single register also applies to the or instruction.
format:
xor Rs, Immediatemeaning:
Rs <- Rs AND Immediatetranslation:
xori Rs, Rs, Immediateorioperator. The operator does a bit-wise OR of Rs and an immediate value, and stores the result Rt register. The format and meaning of this operator is:format:
xori Rt, Rs, Immediatemeaning:
Rt <- Rs XOR ImmediateThe shorthand with a single register also applies to the xori instruction.
format:
xori Rs, Immediatemeaning:
Rs <- Rs XOR Immediatetranslation:
xori Rs, Rs, Immediatenotoperator. The operator does a bit-wise NOT (bit inversion) of Rs, and stores the result Rt register. The format and meaning of this operator is:format:
not Rs, Rtmeaning:
Rs <- NOT(Rt)translation:
nor Rs, Rt, $zero
In addition to the real operators, there are a number of pseudo sub operators, which use 32-bit immediate values. The 32-bit values are handled exactly as with the add instructions, with a sign extension out to 32 bits.


