The assembler's instruction set consists of a main instruction set and a floating-point instruction set. This chapter describes the main instruction set; Chapter 4 describes the floating-point instruction set. For details on the instruction set beyond the scope of this manual, refer to the Alpha Architecture Reference Manual.
The assembler's main instruction set contains the following classes of instructions:
Tables in this chapter show the format of each instruction in the main instruction set. The tables list the instruction names and the forms of operands that can be used with each instruction. The specifiers used in the tables to identify operands have the following meanings:
Operand Specifier | Description |
address
|
A symbolic expression whose effective value is used as an address. |
b_reg
|
Base register. An integer register containing a base address to which is added an offset (or displacement) value to produce an effective address. |
d_reg
|
Destination register. An integer register that receives a value as a result of an operation. |
d_reg/s_reg
|
One integer register that is used as both a destination register and a source register. |
label
|
A label that identifies a location in a program. |
no_operands
|
No operands are specified. |
offset
|
An immediate value that is added to the contents of a base register to calculate an effective address. |
palcode
|
A value that determines the operation performed by a PALcode instruction. |
s_reg, s_reg1, s_reg2
|
Source registers whose contents are to be used in an operation. |
val_expr
|
An expression whose value is used as an absolute value. |
val_immed
|
An immediate value that is to be used in an operation. |
jhint
|
An address operand that provides a hint of where a
jmp
or
jsr
instruction will transfer control.
|
rhint
|
An immediate operand that provides software with a hint about
how a
ret
or
jsr_coroutine
instruction is used.
|
Load and store instructions load immediate values and move data between memory and general registers. This section describes the general-purpose load and store instructions supported by the assembler.
Table 3-1
lists the mnemonics and operands for instructions that
perform load and store operations.
The table
is divided into groups of instructions.
The operands specified within a particular group
apply to all of the instructions contained in that group.
Instruction | Mnemonic | Operands |
Load Address
Load Byte Load Byte Unsigned Load Word Load Word Unsigned Load Sign Extended Longword Load Sign Extended Longword Locked Load Quadword Load Quadword Locked Load Quadword Unaligned Unaligned Load Word Unaligned Load Word Unsigned Unaligned Load Word Unsigned Unaligned Load Longword |
lda ldb ldbu ldw ldwu ldl ldl_l ldq ldq_l ldq_u uldw uldwu uldl uldq |
d_reg, address
|
Load Address High
Load Global Pointer |
ldah ldgp |
d_reg, offset(b_reg)
|
Load Immediate Longword
Load Immediate Quadword |
ldil
ldiq |
d_reg, val_expr
|
Store Byte
Store Word Store Longword Store Longword Conditional Store Quadword Store Quadword Conditional Store Quadword Unaligned Unaligned Store Word Unaligned Store Longword Unaligned Store Quadword |
stb
stw stl stl_c stq stq_c stq_u ustw ustl ustq |
s_reg, address
|
Table Notes:
Section 3.1.1 describes the operations performed by load instructions and Section 3.1.2 describes the operations performed by store instructions.
Load instructions move values (addresses, values of expressions, or contents of memory locations) into registers. For all load instructions, the effective address is the 64-bit twos-complement sum of the contents of the index register and the sign-extended offset.
Instructions whose address operands contain symbolic labels imply an index register, which the assembler determines. Some assembler load instructions can produce multiple machine-code instructions (see Section C.4).
Note
Load instructions can generate many code sequences for which the linker must fix the address by resolving external data items.
Table 3-2 describes the operations performed by load instructions.
Instruction | Description |
Load Address
(lda )
|
Loads the destination register with the effective address of the specified data item. |
Load Byte
(ldb )
|
Loads the least significant byte of the destination register with
the contents of the byte specified by the effective address.
Because the loaded byte is a signed value, its sign bit is replicated
to fill the other bytes in the destination register.
(The assembler uses temporary registers
AT
and
t9
for this instruction.)
|
Load Byte Unsigned
(ldbu )
|
Loads the least significant byte of the destination register with
the contents of the byte specified by the effective address.
Because the loaded byte is an unsigned value, the other bytes of
the destination register are cleared to zeros.
(The assembler uses temporary registers
AT
and
t9
for this instruction
- unless the setting of the
.arch
directive or the
-arch
flag on the
cc
or
as
command line causes the assembler to generate a single machine
instruction in response to the
ldbu
command.)
|
Load Word
(ldw )
|
Loads the two least significant bytes of the destination register
with the contents of the word specified by the effective address.
Because the loaded word is a signed value, its sign bit is replicated
to fill the other bytes in the destination register.
If the effective address is not evenly divisible by two,
a data-alignment exception may be signaled.
(The assembler uses temporary registers
|
Load Word Unsigned
(ldwu )
|
Loads the two least significant bytes of the destination register with
the contents of the word specified by the effective address.
Because the loaded word is an unsigned value, the other bytes of the
destination register are cleared to zeros.
If the effective address is not evenly divisible by two, a data
alignment exception may be signaled.
(The assembler uses temporary registers
|
Load Sign Extended Longword
(ldl )
|
Loads the four least significant bytes of the destination register
with the contents of the longword specified by the effective address.
Because the loaded longword is a signed value, its sign bit is
replicated to fill the other bytes in the destination register.
If the effective address is not evenly divisible by four, a data-alignment exception is signaled. |
Load Sign Extended Longword Locked
(ldl_l )
|
Loads the four least significant bytes of the destination register
with the contents of the longword specified by the effective address.
Because the loaded longword is a signed value, its sign bit is
replicated to fill the other bytes in the destination register.
If the effective address is not evenly divisible by four, a data-alignment exception is signaled.
If an
If the per-processor lock flag is still set when a
|
Load Quadword
(ldq )
|
Loads the destination register with the contents of the quadword
specified by the effective address.
All bytes of the register are replaced with the contents of
the loaded quadword.
If the effective address is not evenly divisible by eight, a data-alignment exception is signaled.
If a
|
|
|
Load Quadword Locked
(ldq_l )
|
Loads the destination register with the contents of the quadword
specified by the effective address.
All bytes of the register are replaced with the contents of the
loaded quadword.
If the effective address is not evenly divisible by eight,
a data-alignment exception is signaled.
If an
If the per-processor lock flag is still set when a
|
Load Quadword Unaligned
(ldq_u )
|
Loads the destination register with the contents of the quadword specified by the effective address (with the three low-order bits cleared). The address does not have to be aligned on an 8-byte boundary; it can be any byte address. |
Unaligned Load Word
(uldw )
|
Loads the two least significant bytes of the destination register with
the word at the specified address.
The address does not have to be aligned on a 2-byte boundary;
it can be any byte address.
Because the loaded word is a signed value, its sign bit is
replicated to fill the other bytes in the destination register.
(The assembler uses temporary registers
AT ,
t9 ,
and
t10
for this instruction.)
|
|
|
Unaligned Load Word Unsigned
(uldwu )
|
Loads the two least significant bytes of the destination
register with the word at the specified address.
The address does not have to be aligned on a 2-byte boundary;
it can be any byte address.
Because the loaded word is an unsigned value, the other bytes of
the destination register are cleared to zeros.
(The assembler uses temporary registers
AT ,
t9 ,
and
t10
for this instruction.)
|
Unaligned Load Longword
(uldl )
|
Loads the four least significant bytes of the destination
register with the longword at the specified address.
The address does not have to be aligned on a 4-byte boundary;
it can be any byte address in memory.
(The assembler uses temporary registers
AT ,
t9 ,
and
t10
for this instruction.)
|
Unaligned Load Quadword
(uldq )
|
Loads the destination register with the quadword at the
specified address.
The address does not have to be aligned on an 8-byte boundary;
it can be any byte address in memory.
(The assembler uses temporary registers
AT ,
t9 ,
and
t10
for this instruction.)
|
Load Address High
(ldah )
|
Loads the destination register with the effective address of the specified data item. In computing the effective address, the signed constant offset is multiplied by 65536 before adding to the base register. The signed constant must be in the range -32768 to 32767. |
Load Global Pointer
(ldgp )
|
Loads the destination register with the global pointer value for the
procedure. The sum of the base register and the sign-extended offset
specifies the address of the
ldgp
instruction.
|
Load Immediate Longword
(ldil )
|
Loads the destination register with the value of an expression that can be computed at assembly time. The value is converted to canonical longword form before being stored in the destination register; bit 31 is replicated in bits 32 though 63 of the destination register. (See Appendix B for additional information on canonical forms.) |
Load Immediate Quadword
(ldiq )
|
Loads the destination register with the value of an expression that can be computed at assembly time. |
For all store instructions, the effective address is the 64-bit twos-complement sum of the contents of the index register and the sign-extended 16-bit offset.
Instructions whose address operands contain symbolic labels imply an index register, which the assembler determines. Some assembler store instructions can produce multiple machine-code instructions (see Section C.4).
Table 3-3 describes the operations performed by store instructions.
Instruction | Description |
Store Byte
(stb )
|
Stores the least significant byte of the source register
in the memory location specified by the effective address.
(The assembler uses temporary registers
AT ,
t9 ,
and
t10
for this instruction
- unless the setting of the
.arch
directive or the
-arch
flag on the
cc
or
as
command line causes the assembler to generate a single machine
instruction in response to the
stb
command.)
|
Store Word
(stw )
|
Stores the two least significant bytes of the source register in the
memory location specified by the effective address.
If the effective address is not evenly divisible by two,
a data-alignment exception may be signaled.
(The assembler uses temporary registers
|
Store Longword
(stl )
|
Stores the four least significant bytes of the source register in
the memory location specified by the effective address.
If the effective address is not evenly divisible by four, a data-alignment exception is signaled. |
Store Longword Conditional
(stl_c )
|
Stores the four least significant bytes of the source register in
the memory location specified by the effective address, if the lock
flag is set.
The lock flag is returned in the source register and is then set
to zero.
If the effective address is not evenly divisible by four, a data-alignment exception is signaled. |
Store Quadword
(stq )
|
Stores the contents of the source register in the
memory location specified by the effective address.
If the effective address is not evenly divisible by eight, a data-alignment exception is signaled. |
Store Quadword Conditional
(stq_c )
|
Stores the contents of the source register in the memory
location specified by the effective address, if the lock flag is set.
The lock flag is returned in the source register and is then set
to zero.
If the effective address is not evenly divisible by eight, a data-alignment exception is signaled. |
Store Quadword Unaligned
(stq_u )
|
Stores the contents of the source register in the memory location specified by the effective address (with the three low-order bits cleared). |
Unaligned Store Word
(ustw )
|
Stores the two least significant bytes of the source
register in the memory location specified by the effective address.
The address does not have to be aligned on a 2-byte boundary;
it can be any byte address.
(The assembler uses temporary registers
AT ,
t9 ,
t10 ,
t11 ,
and
t12
for this instruction.)
|
Unaligned Store Longword
(ustl )
|
Stores the four least significant bytes of the source register in
the memory location specified by the effective address.
The address does not have to be aligned on a 4-byte boundary;
it can be any byte address.
(The assembler uses temporary registers
AT ,
t9 ,
t10 ,
t11 ,
and
t12
for this instruction.)
|
Unaligned Store Quadword
(ustq )
|
Stores the contents of the source register in a memory location
specified by the effective address.
The address does not have to be aligned on an 8-byte boundary;
it can be any byte address.
(The assembler uses temporary registers
AT ,
t9 ,
t10 ,
t11 ,
and
t12
for this instruction.)
|
Arithmetic instructions perform arithmetic operations on values in registers. (Floating-point arithmetic instructions are described in Section 4.3.)
Table 3-4 lists the mnemonics and operands for instructions that perform arithmetic operations. The table is divided into groups of instructions. The operands specified within a particular group apply to all of the instructions contained in that group.
Instruction | Mnemonic | Operands |
Clear | clr |
d_reg
|
Absolute Value Longword
Absolute Value Quadword Negate Longword (without overflow) Negate Longword (with overflow) Negate Quadword (without overflow) Negate Quadword (with overflow) Sign-Extension Byte Sign-Extension Longword Sign-Extension Word |
absl
absq negl neglv negq negqv sextb sextl sextw |
|
Add Longword (without overflow)
Add Longword (with overflow) Add Quadword (without overflow) Add Quadword (with overflow) Scaled Longword Add by 4 Scaled Quadword Add by 4 Scaled Longword Add by 8 Scaled Quadword Add by 8 Multiply Longword (without overflow) Multiply Longword (with overflow) Multiply Quadword (without overflow) Multiply Quadword (with overflow) Subtract Longword (without overflow) Subtract Longword (with overflow) Subtract Quadword (without overflow) Subtract Quadword (with overflow) Scaled Longword Subtract by 4 Scaled Quadword Subtract by 4 Scaled Longword Subtract by 8 Scaled Quadword Subtract by 8 Unsigned Quadword Multiply High Divide Longword Divide Longword Unsigned Divide Quadword Divide Quadword Unsigned Longword Remainder Longword Remainder Unsigned Quadword Remainder Quadword Remainder Unsigned |
addl
addlv addq addqv s4addl s4addq s8addl s8addq mull mullv mulq mulqv subl sublv subq subqv s4subl s4subq s8subl s8subq umulh divl divlu divq divqu reml remlu remq remqu |
s_reg1, s_reg2, d_reg
or d_reg/s_reg1, s_reg2
or s_reg1, val_immed, d_reg
or d_reg/s_reg1, val_immed
|
Table 3-5 describes the operations performed by arithmetic instructions.
Instruction | Description |
Clear
(clr )
|
Sets the contents of the destination register to zero. |
Absolute Value Longword
(absl )
|
Computes the absolute value of the contents of the source register and places the result in the destination register. If the value in the source register is -2147483648, an overflow exception is signaled. |
Absolute Value Quadword
(absq )
|
Computes the absolute value of the contents of the source register and places the result in the destination register. If the value in the source register is -9223372036854775808, an overflow exception is signaled. |
Negate Longword (without overflow)
(negl )
|
Negates the integer contents of the four least significant bytes in the source register and places the result in the destination register. An overflow occurs if the value in the source register is -2147483648, but the overflow exception is not signaled. |
Negate Longword (with overflow)
(neglv )
|
Negates the integer contents of the four least significant bytes in the source register and places the result in the destination register. If the value in the source register is -2147483648, an overflow exception is signaled. |
Negate Quadword (without overflow)
(negq )
|
Negates the integer contents of the source register and places the result in the destination register. An overflow occurs if the value in the source register is -2147483648, but the overflow exception is not signaled. |
Negate Quadword (with overflow)
(negqv )
|
Negates the integer contents of the source register and places the result in the destination register. An overflow exception is signaled if the value in the source register is -9223372036854775808. |
Sign-Extension Byte
(sextb )
|
Moves the least significant byte of the source register into the least significant byte of the destination register. Because the moved byte is a signed value, its sign bit is replicated to fill the other bytes in the destination register. |
Sign-Extension Word
(sextw )
|
Moves the two least significant bytes of the source register into the two least significant bytes of the destination register. Because the moved word is a signed value, its sign bit is replicated to fill the other bytes in the destination register. |
Sign-Extension Longword
(sextl )
|
Moves the four least significant bytes of the source register into the four least significant bytes of the destination register. Because the moved longword is a signed value, its sign bit is replicated to fill the other bytes in the destination register. |
Add Longword (without overflow)
(addl )
|
Computes the sum of two signed 32-bit values. This
instruction adds the contents of
s_reg1
to the contents of
s_reg2
or the immediate value and then places the result in the destination
register. Overflow exceptions never occur.
|
Add Longword (with overflow)
(addlv )
|
Computes the sum of two signed 32-bit values.
This instruction adds the contents of
s_reg1
to the contents of
s_reg2
or the immediate value and then places the result in the destination
register. If the result cannot be represented as a signed
32-bit number, an overflow exception is signaled.
|
Add Quadword (without overflow)
(addq )
|
Computes the sum of two signed 64-bit values. This
instruction adds the contents of
s_reg1
to the contents of
s_reg2
or the immediate value and then places the result in the destination
register. Overflow exceptions never occur.
|
Add Quadword (with overflow)
(addqv )
|
Computes the sum of two signed 64-bit values.
This instruction adds the contents of
s_reg1
to the contents of
s_reg2
or the immediate value and then places the result in the destination
register. If the result cannot be represented as a signed
64-bit number, an overflow exception is signaled.
|
Scaled Longword Add by 4
(s4addl )
|
Computes the sum of two signed 32-bit values.
This instruction scales (multiplies) the contents of
s_reg1
by four and then adds the contents of
s_reg2
or the immediate value.
The result is stored in the destination register.
Overflow exceptions never occur.
|
Scaled Quadword Add by 4
(s4addq )
|
Computes the sum of two signed 64-bit values.
This instruction scales (multiplies) the contents of
s_reg1
by four and then adds the contents of
s_reg2
or the immediate value.
The result is stored in the destination register.
Overflow exceptions never occur.
|
Scaled Longword Add by 8
(s8addl )
|
Computes the sum of two signed 32-bit values.
This instruction scales (multiplies) the contents of
s_reg1
by eight and then adds the contents of
s_reg2
or the immediate value.
The result is stored in the destination register.
Overflow exceptions never occur.
|
Scaled Quadword Add by 8
(s8addq )
|
Computes the sum of two signed 64-bit values.
This instruction scales (multiplies) the contents of
s_reg1
by eight and then adds the contents of
s_reg2
or the immediate value.
The result is stored in the destination register.
Overflow exceptions never occur.
|
Multiply Longword (without overflow)
(mull )
|
Computes the product of two signed 32-bit values.
This instruction places either the 32-bit product of
s_reg1
and
s_reg2
or the immediate value in the destination register.
Overflows are not reported.
|
Multiply Longword (with overflow)
(mullv )
|
Computes the product of two signed 32-bit values.
This instruction places either the 32-bit product of
s_reg1
and
s_reg2
or the immediate value in the destination register.
If an overflow occurs, an overflow exception is signaled.
|
Multiply Quadword (without overflow)
(mulq )
|
Computes the product of two signed 64-bit values.
This instruction places either the 64-bit product of
s_reg1
and
s_reg2
or the immediate value in the destination
register. Overflow is not reported.
|
Multiply Quadword (with overflow)
(mulqv )
|
Computes the product of two signed 64-bit values.
This instruction places either the 64-bit product of
s_reg1
and
s_reg2
or the immediate value in the destination register.
If an overflow occurs, an overflow exception is signaled.
|
Subtract Longword (without overflow)
(subl )
|
Computes the difference of two signed 32-bit values.
This instruction subtracts either the contents of
s_reg2
or an immediate value from the contents of
s_reg1
and then places the result in the destination register.
Overflow exceptions never happen.
|
Subtract Longword (with overflow)
(sublv )
|
Computes the difference of two signed 32-bit values.
This instruction subtracts either the contents of
s_reg2
or an immediate value from the contents of
s_reg1
and then places the result in the destination register.
If the true result's sign differs from the destination register's
sign, an overflow exception is signaled.
|
Subtract Quadword (without overflow)
(subq )
|
Computes the difference of two signed 64-bit values.
This instruction subtracts the contents of
s_reg2
or an immediate value from the contents of
s_reg1
and then places the result in the destination register.
Overflow exceptions never occur.
|
Subtract Quadword (with overflow)
(subqv )
|
Computes the difference of two signed 64-bit values.
This instruction subtracts the contents of
s_reg2
or an immediate value from the contents of
s_reg1
and then places the result in the destination register.
If the true result's sign differs from the destination register's
sign, an overflow exception is signaled.
|
Scaled Longword Subtract by 4
(s4subl )
|
Computes the difference of two signed 32-bit values.
This instruction subtracts the contents of
s_reg2
or the immediate value from the scaled (by 4) contents of
s_reg1 .
The result is stored in the destination register.
Overflow exceptions never occur.
|
Scaled Quadword Subtract by 4
(s4subq )
|
Computes the difference of two signed 64-bit values.
This instruction subtracts the contents of
s_reg2
or the immediate value from the scaled (by 4) contents of
s_reg1 .
The result is stored in the destination register.
Overflow exceptions never occur.
|
Scaled Longword Subtract by 8
(s8subl )
|
Computes the difference of two signed 32-bit values.
This instruction subtracts the contents of
s_reg2
or the immediate value from the scaled (by 8) contents of
s_reg1 .
The result is stored in the destination register.
Overflow exceptions never occur.
|
Scaled Quadword Subtract by 8
(s8subq )
|
Computes the difference of two signed 64-bit values.
This instruction subtracts the contents of
s_reg2
or the immediate value from the scaled (by 8) contents of
s_reg1 .
The result is stored in the destination register.
Overflow exceptions never occur.
|
Unsigned Quadword Multiply High
(umulh )
|
Computes the product of two unsigned 64-bit values. This instruction
multiplies the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the high-order 64 bits of the
128-bit product in the destination register.
|
Divide Longword
(divl )
|
Computes the quotient of two signed 32-bit values.
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the quotient in the
destination register.
The
|
Divide Longword Unsigned
(divlu )
|
Computes the quotient of two unsigned 32-bit values.
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the quotient in the destination
register.
If the divisor is zero, an exception is signaled and a
|
Divide Quadword
(divq )
|
Computes the quotient of two signed 64-bit values.
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the quotient in the destination
register.
The
|
Divide Quadword Unsigned
(divqu )
|
Computes the quotient of two unsigned 64-bit values.
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the quotient in the destination
register.
If the divisor is zero, an exception is signaled and a
|
Longword Remainder
(reml )
|
Computes the remainder of the division of two signed 32-bit values.
The remainder
reml(i,j)
is defined as
i-(j*divl(i,j)) ,
where
j != 0 .
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or by the immediate value and then places the remainder in the
destination register.
The
For divide-by-zero, an error is signaled and a
|
Longword Remainder Unsigned
(remlu )
|
Computes the remainder of the division of two unsigned 32-bit values.
The remainder
remlu(i,j)
is defined as
i-(j*divlu(i,j)) ,
where
j != 0 .
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the remainder in the
destination register.
For divide-by-zero, an error is signaled and a
|
Quadword Remainder
(remq )
|
Computes the remainder of the division of two signed 64-bit values.
The remainder
remq(i,j)
is defined as
i-(j*divq(i,j))
where
j != 0 .
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the remainder in the destination
register.
The
For divide-by-zero, an error is signaled and a
|
Quadword Remainder Unsigned
(remqu )
|
Computes the remainder of the division of two unsigned 64-bit values.
The remainder
remqu(i,j)
is defined as
i-(j*divqu(i,j))
where
j != 0 .
This instruction divides the contents of
s_reg1
by the contents of
s_reg2
or the immediate value and then places the remainder in the destination
register.
For divide-by-zero, an error is signaled and a
|
Logical and shift instructions perform logical operations and shifts on values in registers.
Table 3-6
lists the mnemonics and operands for instructions that
perform logical and shift operations.
The table is divided into groups of instructions.
The operands specified within a particular group apply to
all of the instructions contained in that group.
Instruction | Mnemonic | Operands |
Logical Complement - NOT | not |
s_reg, d_reg
or d_reg/s_reg
or val_immed, d_reg
|
Logical Product - AND
Logical Sum - OR Logical Sum - OR Logical Difference - XOR Logical Product with Complement - ANDNOT Logical Product with Complement - ANDNOT Logical Sum with Complement - ORNOT Logical Equivalence - XORNOT Logical Equivalence - XORNOT Shift Left Logical Shift Right Logical Shift Right Arithmetic |
and
bis or xor bic andnot ornot eqv xornot sll srl sra |
s_reg1, s_reg2, d_reg
or d_reg/s_reg1, s_reg2
or s_reg1, val_immed, d_reg
or d_reg/s_reg1, val_immed
|
Table 3-7 describes the operations performed by logical and shift instructions.
Instruction | Description |
Logical Complement - NOT
(not )
|
Computes the Logical NOT of a value. This instruction
performs a complement operation on the contents of
s_reg1
and places the result in the destination register.
|
Logical Product - AND
(and )
|
Computes the Logical AND of two values. This instruction
performs an AND operation between the contents of
s_reg1
and either the contents of
s_reg2
or the immediate value and then places the result in the
destination register.
|
Logical Sum - OR
(bis )
|
Computes the Logical OR of two values. This instruction
performs an OR operation between the contents of
s_reg1
and either the contents of
s_reg2
or the immediate value and then places the result in the
destination register.
|
Logical Sum - OR
(or )
|
Synonym for
bis .
|
Logical Difference - XOR
(xor )
|
Computes the XOR of two values. This instruction
performs an XOR operation between the contents of
s_reg1
and either the contents of
s_reg2
or the immediate value and then places the result in the destination
register.
|
Logical Product with Complement - ANDNOT
(bic )
|
Computes the Logical AND of two values. This instruction
performs an AND operation between the contents of
s_reg1
and the ones complement of either the contents of
s_reg2
or the immediate value and then places the result in
the destination register.
|
Logical Product with Complement - ANDNOT
(andnot )
|
Synonym for
bic .
|
Logical Sum with Complement - ORNOT
(ornot )
|
Computes the logical OR of two values. This instruction
performs an OR operation between the contents of
s_reg1
and the ones complement of either the contents of
s_reg2
or the immediate value and then places the result in the destination
register.
|
Logical Equivalence - XORNOT
(eqv )
|
Computes the logical XOR of two values. This instruction
performs an XOR operation between the contents of
s_reg1
and the ones complement of either the contents of
s_reg2
or the immediate value and then places the result in
the destination register.
|
Logical Equivalence - XORNOT
(xornot )
|
Synonym for
eqv .
|
Shift Left Logical
(sll )
|
Shifts the contents of a register left (toward the sign bit) and
inserts zeros in the vacated bit positions. Register
s_reg1
contains the value to be shifted, and either the contents of
s_reg2
or the immediate value specifies the shift count. If
s_reg2
or the immediate value is greater than 63 or less than zero,
s_reg1
shifts by the result of the following AND operation:
s_reg2
AND 63.
|
Shift Right Logical
(srl )
|
Shifts the contents of a register to the right (toward the least
significant bit) and inserts zeros in the vacated bit positions.
Register
s_reg1
contains the value to be shifted, and either the contents of
s_reg2
or the immediate value specifies the shift count. If
s_reg2
or the immediate value is greater than 63 or less than zero,
s_reg1
shifts by the result of the result of the following AND operation:
s_reg2
AND 63.
|
Shift Right Arithmetic
(sra )
|
Shifts the contents of a register to the right (toward the least
significant bit) and inserts the sign bit in the vacated bit position.
Register
s_reg1
contains the value to be shifted, and either the contents of
s_reg2
or the immediate value specifies the shift count. If
s_reg2
or the immediate value is greater than 63 or less than zero,
s_reg1
shifts by the result of the following AND operation:
s_reg2
AND 63.
|
Relational instructions compare values in registers.
Table 3-8
lists the mnemonics and operands for instructions that
perform relational operations.
Each of the instructions listed in the table
can take an operand in any of the forms shown.
Instruction | Mnemonic | Operands |
Compare Signed Quadword Equal
Compare Signed Quadword Less Than Compare Signed Quadword Less Than or Equal Compare Unsigned Quadword Less Than Compare Unsigned Quadword Less Than or Equal |
cmpeq
cmplt cmple cmpult cmpule |
s_reg1, s_reg2, d_reg
or d_reg/s_reg1, s_reg2
or s_reg1, val_immed, d_reg
or d_reg/s_reg1, val_immed
|
Table 3-9 describes the operations performed by relational instructions.
Instruction | Description |
Compare Signed Quadword Equal
(cmpeq )
|
Compares two 64-bit values. If the value in
s_reg1
equals the value in
s_reg2
or the immediate value, this instruction sets the destination register
to one; otherwise, it sets the destination register to zero.
|
Compare Signed Quadword Less Than
(cmplt )
|
Compares two signed 64-bit values. If the value in
s_reg1
is less than the value in
s_reg2
or the immediate value, this instruction sets the destination register
to one; otherwise, it sets the destination register to zero.
|
Compare Signed Quadword Less Than or Equal
(cmple )
|
Compares two signed 64-bit values. If the value in
s_reg1
is less than or equal to the value in
s_reg2
or the immediate value, this instruction sets the destination register
to one; otherwise, it sets the destination register to zero.
|
Compare Unsigned Quadword Less Than
(cmpult )
|
Compares two unsigned 64-bit values. If the value in
s_reg1
is less than either the value in
s_reg2
or the immediate value, this instruction sets the destination
register to one; otherwise, it sets the destination register to zero.
|
Compare Unsigned Quadword Less Than or Equal
(cmpule )
|
Compares two unsigned 64-bit values. If the value in
s_reg1
is less than or equal to either the value in
s_reg2
or the immediate value, this instruction sets the destination
register to one; otherwise, it sets the destination register to zero.
|
Move instructions move data between registers.
Table 3-10 lists the mnemonics and operands for instructions that perform move operations. The table is divided into groups of instructions. The operands specified within a particular group apply to all of the instructions contained in that group.
Instruction | Mnemonic | Operands |
Move | mov |
s_reg, d_reg
or val_immed, d_reg
|
Move if Equal to Zero
Move if Not Equal to Zero Move if Less Than Zero Move if Less Than or Equal to Zero Move if Greater Than Zero Move if Greater Than or Equal to Zero Move if Low Bit Clear Move if Low Bit Set |
cmoveq
cmovne cmovlt cmovle cmovgt cmovge cmovlbc cmovlbs |
s_reg1, s_reg2, d_reg
or d_reg/s_reg1, s_reg2
or s_reg1, val_immed, d_reg
or d_reg/s_reg1, val_immed
|
Table 3-11 describes the operations performed by move instructions.
Instruction | Description |
Move
(mov )
|
Moves the contents of the source register or the immediate value to the destination register. |
Move if Equal to Zero
(cmoveq )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the contents of
s_reg1
is equal to zero.
|
Move if Not Equal to Zero
(cmovne )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the contents of
s_reg1
is not equal to zero.
|
Move if Less Than Zero
(cmovlt )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the contents of
s_reg1
is less than zero.
|
Move if Less Than or Equal to Zero
(cmovle )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the contents of
s_reg1
is less than or equal to zero.
|
Move if Greater Than Zero
(cmovgt )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the contents of
s_reg1
is greater than zero.
|
Move if Greater Than or Equal to Zero
(cmovge )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the contents of
s_reg1
is greater than or equal to zero.
|
Move if Low Bit Clear
(cmovlbc )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the low-order
bit of
s_reg1
is equal to zero.
|
Move if Low Bit Set
(cmovlbs )
|
Moves the contents of
s_reg2
or the immediate value to the destination register if the low-order
bit of
s_reg1
is not equal to zero.
|
Control instructions change the control flow of an assembly program. They affect the sequence in which instructions are executed by transferring control from one location in a program to another.
Table 3-12 lists the mnemonics and operands for instructions that perform control operations. The table is divided into groups of instructions. The operands specified within a particular group apply to all of the instructions contained in that group.
Instruction | Mnemonic | Operands |
Branch if Equal to Zero
Branch if Not Equal to Zero Branch if Less Than Zero Branch if Less Than or Equal to Zero Branch if Greater Than Zero Branch if Greater Than or Equal to Zero Branch if Low Bit is Clear Branch if Low Bit is Set |
beq
bne blt ble bgt bge blbc blbs |
s_reg, label
|
Branch
Branch to Subroutine |
br
bsr |
d_reg, label
or label
|
Jump
Jump to Subroutine |
jmp jsr |
d_reg, (s_reg), jhint
or d_reg, (s_reg)
or (s_reg), jhint
or (s_reg)
or d_reg, address
or address
|
Return from Subroutine
Jump to Subroutine Return |
ret
jsr_coroutine |
d_reg, (s_reg), rhint
or d_reg, (s_reg)
or d_reg, rhint
or d_reg
or (s_reg), rhint
or (s_reg)
or rhint
or no_operands
|
Table Notes:
Table 3-13 describes the operations performed by control instructions. For all branch instructions described in the table, the branch destinations must be defined in the source being assembled, not in an external source file.
Instruction | Description |
Branch if Equal to Zero
(beq )
|
Branches to the specified label if the contents of the source register is equal to zero. |
Branch if Not Equal to Zero
(bne )
|
Branches to the specified label if the contents of the source register is not equal to zero. |
Branch if Less Than Zero
(blt )
|
Branches to the specified label if the contents of the source register is less than zero. The comparison treats the source register as a signed 64-bit value. |
Branch if Less Than or Equal to Zero
(ble )
|
Branches to the specified label if the contents of the source register is less than or equal to zero. The comparison treats the source register as a signed 64-bit value. |
Branch if Greater Than Zero
(bgt )
|
Branches to the specified label if the contents of the source register is greater than zero. The comparison treats the source register as a signed 64-bit value. |
Branch if Greater Than or Equal to Zero
(bge )
|
Branches to the specified label if the contents of the source register is greater than or equal to zero. The comparison treats the source register as a signed 64-bit value. |
Branch if Low Bit is Clear
(blbc )
|
Branches to the specified label if the low-order bit of the source register is equal to zero. |
Branch if Low Bit is Set
(blbs )
|
Branches to the specified label if the low-order bit of the source register is not equal to zero. |
Branch
(br )
|
Branches unconditionally to the specified label.
If a destination register is specified, the address of the
instruction following the
br
instruction is stored in that register.
|
Branch to Subroutine
(bsr )
|
Branches unconditionally to the specified label and stores the return
address in the destination register. If a destination register is not
specified, register
$26
(ra )
is used.
|
Jump
(jmp )
|
Unconditionally jumps to a specified location. A symbolic address or
the source register specifies the target location. If a destination
register is specified, the address of the instruction following the
jmp
instruction is stored in the specified register.
|
Jump to Subroutine
(jsr )
|
Unconditionally jumps to a specified location and stores the return
address in the destination register. If a destination register is not
specified, register
$26
(ra )
is used. A symbolic address or the source
register specifies the target location. The instruction
jsr
procname
transfers to
procname
and saves the return address in register
$26 .
|
Return from Subroutine
(ret )
|
Unconditionally returns from a subroutine. If a destination register
is specified, the address of the instruction following the
ret
instruction is stored in the specified register. The source register
contains the return address. If the source register is not specified,
register
$26
(ra )
is used.
If a hint is not specified, a hint value of one is used.
|
Jump to Subroutine Return
(jsr_coroutine )
|
Unconditionally returns from a subroutine and stores the return
address in the destination register. If a destination register is not
specified, register
$26
(ra )
is used. The source register contains
the target address. If the source register is not specified, register
$26
(ra )
is used.
|
All jump instructions
(jmp, jsr, ret, jsr_coroutine
)
perform identical operations.
They differ only in hints to possible branch-prediction logic.
See the
Alpha Architecture Reference Manual
for information about branch-prediction logic.
Byte-manipulation instructions perform byte operations on values in registers.
Table 3-14
lists the mnemonics and operands for instructions that
perform byte-manipulation operations.
Each of the instructions listed in the table
can take an operand in any of the forms shown.
Instruction | Mnemonic | Operands |
|
||
Compare Byte
Extract Byte Low Extract Word Low Extract Longword Low Extract Quadword Low Extract Word High Extract Longword High Extract Quadword High Insert Byte Low Insert Word Low Insert Longword Low Insert Quadword Low Insert Word High Insert Longword High Insert Quadword High Mask Byte Low Mask Word Low Mask Longword Low Mask Quadword Low Mask Word High Mask Longword High Mask Quadword High Zero Bytes Zero Bytes NOT |
cmpbge
extbl extwl extll extql extwh extlh extqh insbl inswl insll insql inswh inslh insqh mskbl mskwl mskll mskql mskwh msklh mskqh zap zapnot |
s_reg1, s_reg2, d_reg
or d_reg/s_reg1, s_reg2
or s_reg1, val_immed, d_reg
or d_reg/s_reg1, val_immed
|
Table 3-15
describes the operations performed by byte-manipulation instructions.
Instruction | Description |
Compare Byte
(cmpbge )
|
Performs eight parallel unsigned byte comparisons between
corresponding bytes of register
s_reg1
and
s_reg2
or the immediate value.
A bit is set in the destination register if a byte in
s_reg1
is greater than or equal to the corresponding byte in
s_reg2
or the immediate value.
The results of the comparisons are stored in the eight low-order bits of the destination register; bit 0 of the destination register corresponds to byte 0 and so forth. The 56 high-order bits of the destination register are cleared. |
Extract Byte Low
(extbl )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts the low-order byte into the destination register.
The seven high-order bytes of the destination register are cleared
to zeros. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Extract Word Low
(extwl )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts the two low-order bytes and stores them in the
destination register.
The six high-order bytes of the destination register are cleared
to zeros.
Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Extract Longword Low
(extll )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts the four low-order bytes and stores them in the
destination register. The four high-order bytes of the destination
register are cleared to zeros.
Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Extract Quadword Low
(extql )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts all eight bytes and stores them in the destination
register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Extract Word High
(extwh )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts the two low-order bytes and stores them in the
destination register.
The six high-order bytes of the destination register are cleared
to zeros.
Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Extract Longword High
(extlh )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts the four low-order bytes and stores them in the
destination register.
The four high-order bytes of the destination register are cleared
to zeros.
Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Extract Quadword High
(extqh )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts zeros into the vacated bit positions,
and then extracts all eight bytes and stores them in the destination
register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Byte Low
(insbl )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts the byte into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Word Low
(inswl )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts the word into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Longword Low
(insll )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts the longword into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Quadword Low
(insql )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts the quadword into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Quadword Low
(insql )
|
Shifts the register
s_reg1
left by 0-7 bytes, inserts the quadword into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Word High
(inswh )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts the word into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Longword High
(inslh )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts the longword into a field of zeros, and then
places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Insert Quadword High
(insqh )
|
Shifts the register
s_reg1
right by 0-7 bytes, inserts the quadword into a field of zeros, and
then places the result in the destination register. Bits 0-2 of register
s_reg2
or the immediate value specify the shift count.
|
Mask Byte Low
(mskbl )
|
Sets a byte in register
s_reg1
to zero and stores the result in the destination register. Bits 0-2
of register
s_reg2
or the immediate value specify the offset of the byte.
|
Mask Word Low
(mskwl )
|
Sets a word in register
s_reg1
to zero and stores the result in the destination register. Bits 0-2
of register
s_reg2
or the immediate value specify the offset of the word.
|
Mask Longword Low
(mskll )
|
Sets a longword in register
s_reg1
to zero and stores the result in the destination register. Bits 0-2
of register
s_reg2
or the immediate value specify the offset of the longword.
|
Mask Quadword Low
(mskql )
|
Sets a quadword in register
s_reg1
to zero and stores the result in the destination register.
Bits 0-2 of register
s_reg2
or the immediate value specify the offset of the quadword.
|
Mask Word High
(mskwh )
|
Sets a word in register
s_reg1
to zero and stores the result in the destination register. Bits 0-2
of register
s_reg2
or the immediate value specify the offset of the word.
|
Mask Longword High
(msklh )
|
Sets a longword in register
s_reg1
to zero and stores the result in the destination register. Bits 0-2
of register
s_reg2
or the immediate value specify the offset of the longword.
|
Mask Quadword High
(mskqh )
|
Sets a quadword in register
s_reg1
to zero and stores the result in the destination register. Bits
0-2 of register
s_reg2
or the immediate value specify the offset of the quadword.
|
Zero Bytes
(zap )
|
Sets selected bytes of register
s_reg1
to zero and places the result in the destination register. Bits 0-7
of register
s_reg2
or an immediate value specify the bytes to be cleared to zeros.
Each bit corresponds to one byte in register
s_reg1 ;
for example, bit 0 corresponds to byte 0.
A bit with a value of one indicates its corresponding byte should be
cleared to zeros.
|
Zero Bytes NOT
(zapnot )
|
Sets selected bytes of register
s_reg1
to zero and places the result in the destination register. Bits 0-7
of register
s_reg2
or an immediate value specify the bytes to be cleared to zeros.
Each bit corresponds to one byte in register
s_reg1 ;
for example, bit 0 corresponds to byte 0. A bit with a value of
zero indicates its corresponding byte should be cleared to zeros.
|
Special-purpose instructions perform miscellaneous tasks.
Table 3-16
lists the mnemonics and operands for instructions that
perform special operations.
The table is divided into groups of instructions.
The operands specified within a particular group apply to
all of the instructions contained in that group.
Instruction | Mnemonic | Operands |
Call Privileged Architecture Library | call_pal |
palcode
|
Architecture Mask | amask |
s_reg, d_reg
or val_immed, d_reg
|
Prefetch Data
Prefetch Data, Modify Intent |
fetch
fetch_m |
offset(b_reg)
|
Read Process Cycle Counter
Implementation Version |
rpcc
implver |
d_reg
|
No Operation
Universal No Operation Trap Barrier Exception Barrier Memory Barrier Write Memory Barrier |
nop
unop trapb excb mb wmb |
no_operands
|
Table 3-17 describes the operations performed by special-purpose instructions.
Instruction | Description |
Call Privileged Architecture Library
(call_pal )
|
Unconditionally transfers control to the exception
handler. The
palcode
operand is interpreted by software conventions.
|
Architecture Mask
(amask )
|
The value of the contents of
s_reg
or the immediate value represent a mask of architectural
extensions that are being requested.
Bits are cleared if they correspond to architectural extensions
that are present, and the result is placed in the destination
register.
|
Prefetch Data
(fetch )
|
Indicates that the 512-byte block of data specified by the effective address should be moved to a faster-access part of the memory hierarchy. |
Prefetch Data, Modify Intent
(fetch_m )
|
Indicates that the 512-byte block of data specified by the effective address should be moved to a faster-access part of the memory hierarchy. In addition, this instruction is a hint that part or all of the data may be modified. |
Read Process Cycle Counter
(rpcc )
|
Returns the contents of the process cycle counter in the destination register. |
Implementation Version
(implver )
|
A small integer is placed in the destination register. This integer specifies the major implementation version of the processor on which it is executed. This information can be used to make code-scheduling or tuning decisions. The returned small integer can have the values 0 or 1. 1 indicates an EV5 Alpha chip (21164). 0 indicates EV4, EV45, LCA, and LCA-45 Alpha chips (that is, 21064, 21064A, 21066, 21068, and 21066A, respectively). |
No Operation
(nop )
|
Has no effect on the machine state. |
Universal No Operation
(unop )
|
Has no effect on the machine state. |
Trap Barrier
(trapb )
|
Guarantees that all previous arithmetic instructions are completed,
without incurring any
arithmetic traps, before any instructions after the
trapb
instruction are issued.
|
Exception Barrier
(excb )
|
Guarantees that all previous instructions complete any
exception-related behavior or rounding-mode behavior before any
instructions after the
excb
instruction are issued.
|
Memory Barrier
(mb )
|
Used to serialize access to memory. See the Alpha Architecture Reference Manual for addition information on memory barriers. |
Write Memory Barrier
(wmb )
|
Guarantees that all previous store instructions access memory
before any store instructions issued after the
wmb
instruction.
|