Orc Opcodes

Opcodes only work with variables of a particular size. In the table below, destination and source indicate the size of the destination and source operands, in bytes. In general, opcodes have a suffix indicating the sizes, "b" for 1-byte operations, "w" for 2-byte operations, and "l" for 4-byte operations. If the source and destination have different sizes, the source size suffix is listed first, then the destination suffix. For example, converting a 1-byte variable to 2-byte can be performed using the "convsbw" opcode.

Signed, unsigned, and saturating operations are indicated by the letters "s", "u", and "s". If signed or unsigned is not indicated, it generally means that the signedness is not relevant to the definition of the opcode, and that the operation on signed or unsigned values will give the same result.

The "select" opcodes divide the bits in the source value into two halves. For "select0", the half that is first in memory order is selected, and the latter half for "select1". In other words, "convwb" is the same as "select0wb" on little-endian systems, and "select1wb" on big-endian systems.

The "merge" opcodes take two values and put them together in memory order.

Accumulating opcodes require an accumulator variable as the destination. Accumulating opcodes start with "acc". These opcodes sum the source values over the entire array, and can be read from the OrcExecutor structure after an execution of an Orc program.

Shift opcodes only work with constants or parameters as the second source value.

For more precise understanding of operations, it is recommended to compile a program for the C target and examine the resulting C source code.

Table of Opcodes

Opcode Dest Size Src 1 Size Src 2 Size Description Pseudo Code
absb 1 1 absolute value (a < 0) ? -a : a
addb 1 1 1 add a + b
addssb 1 1 1 add with signed saturate clamp(a + b)
addusb 1 1 1 add with unsigned saturate clamp(a + b)
andb 1 1 1 bitwise AND a & b
andnb 1 1 1 bitwise AND NOT a & (~b)
avgsb 1 1 1 signed average (a + b + 1)>>1
avgub 1 1 1 unsigned average (a + b + 1)>>1
cmpeqb 1 1 1 compare equal (a == b) ? (~0) : 0
cmpgtsb 1 1 1 compare greater than (a > b) ? (~0) : 0
copyb 1 1 copy a
loadb 1 1 load from memory array[i]
loadoffb 1 1 4S load from memory with offset array[i+offset]
loadupdb 1 1 load upsampled duplicate array[i>>1]
loadupib 1 1 load upsampled interpolate (array[i>>1] + array[(i+1)>>1] + 1)>>1
loadpb 1 1 load parameter or constant scalar
ldresnearb 1 1 4S load, nearest neighbor resampled array[(b+c*i)>>8]
ldresnearl 4 4 4S load, nearest neighbor resampled array[(b+c*i)>>8]
ldreslinb 1 1 4S load, bilinear resampled special
ldreslinl 4 4 4S load, bilinear resampled special
maxsb 1 1 1 signed maximum (a > b) ? a : b
maxub 1 1 1 unsigned maximum (a > b) ? a : b
minsb 1 1 1 signed minimum (a < b) ? a : b
minub 1 1 1 unsigned minimum (a < b) ? a : b
mullb 1 1 1 low bits of multiply a * b
mulhsb 1 1 1 high bits of signed multiply (a * b) >> 8
mulhub 1 1 1 high bits of unsigned multiply (a * b) >> 8
orb 1 1 1 bitwise or a | b
shlb 1 1 1S shift left a << b
shrsb 1 1 1S signed shift right a >> b
shrub 1 1 1S unsigned shift right a >> b
signb 1 1 sign sign(a)
storeb 1 1 store to memory special
subb 1 1 1 subtract a - b
subssb 1 1 1 subtract with signed saturate clamp(a - b)
subusb 1 1 1 subtract with unsigned saturate clamp(a - b)
xorb 1 1 1 bitwise XOR a ^ b
absw 2 2 absolute value (a < 0) ? -a : a
addw 2 2 2 add a + b
addssw 2 2 2 add with signed saturate clamp(a + b)
addusw 2 2 2 add with unsigned saturate clamp(a + b)
andw 2 2 2 bitwise AND a & b
andnw 2 2 2 bitwise AND NOT a & (~b)
avgsw 2 2 2 signed average (a + b + 1)>>1
avguw 2 2 2 unsigned average (a + b + 1)>>1
cmpeqw 2 2 2 compare equal (a == b) ? (~0) : 0
cmpgtsw 2 2 2 compare greater than (a > b) ? (~0) : 0
copyw 2 2 copy a
div255w 2 2 divide by 255 a/255
divluw 2 2 2 saturated unsigned divide 16-bit by 8-bit clamp(a/(b & 255),0,255)
loadw 2 2 load from memory array[i]
loadoffw 2 2 4S load from memory with offset array[i+offset]
loadpw 2 2 load parameter or constant scalar
maxsw 2 2 2 signed maximum (a > b) ? a : b
maxuw 2 2 2 unsigned maximum (a > b) ? a : b
minsw 2 2 2 signed minimum (a < b) ? a : b
minuw 2 2 2 unsigned minimum (a < b) ? a : b
mullw 2 2 2 low bits of multiply a * b
mulhsw 2 2 2 high bits of signed multiply (a * b) >> 16
mulhuw 2 2 2 high bits of unsigned multiply (a * b) >> 16
orw 2 2 2 bitwise or a | b
shlw 2 2 2S shift left a << b
shrsw 2 2 2S signed shift right a >> b
shruw 2 2 2S unsigned shift right a >> b
signw 2 2 sign sign(a)
storew 2 2 store to memory special
subw 2 2 2 subtract a - b
subssw 2 2 2 subtract with signed saturate clamp(a - b)
subusw 2 2 2 subtract with unsigned saturate clamp(a - b)
xorw 2 2 2 bitwise XOR a ^ b
absl 4 4 absolute value (a < 0) ? -a : a
addl 4 4 4 add a + b
addssl 4 4 4 add with signed saturate clamp(a + b)
addusl 4 4 4 add with unsigned saturate clamp(a + b)
andl 4 4 4 bitwise AND a & b
andnl 4 4 4 bitwise AND NOT a & (~b)
avgsl 4 4 4 signed average (a + b + 1)>>1
avgul 4 4 4 unsigned average (a + b + 1)>>1
cmpeql 4 4 4 compare equal (a == b) ? (~0) : 0
cmpgtsl 4 4 4 compare greater than (a > b) ? (~0) : 0
copyl 4 4 copy a
loadl 4 4 load from memory array[i]
loadoffl 4 4 4S load from memory with offset array[i+offset]
loadpl 4 4 load parameter or constant scalar
maxsl 4 4 4 signed maximum (a > b) ? a : b
maxul 4 4 4 unsigned maximum (a > b) ? a : b
minsl 4 4 4 signed minimum (a < b) ? a : b
minul 4 4 4 unsigned minimum (a < b) ? a : b
mulll 4 4 4 low bits of multiply a * b
mulhsl 4 4 4 high bits of signed multiply (a * b) >> 32
mulhul 4 4 4 high bits of unsigned multiply (a * b) >> 32
orl 4 4 4 bitwise or a | b
shll 4 4 4S shift left a << b
shrsl 4 4 4S signed shift right a >> b
shrul 4 4 4S unsigned shift right a >> b
signl 4 4 sign sign(a)
storel 4 4 store to memory special
subl 4 4 4 subtract a - b
subssl 4 4 4 subtract with signed saturate clamp(a - b)
subusl 4 4 4 subtract with unsigned saturate clamp(a - b)
xorl 4 4 4 bitwise XOR a ^ b
loadq 8 8 load from memory array[i]
loadpq 8 8 load parameter or constant scalar
storeq 8 8 store to memory special
splatw3q 8 8 duplicates high 16-bits to lower 48 bits special
copyq 8 8
cmpeqq 8 8 8
cmpgtsq 8 8 8
andq 8 8 8
andnq 8 8 8
orq 8 8 8
xorq 8 8 8
addq 8 8 8
subq 8 8 8
shlq 8 8 8S
shrsq 8 8 8S
shruq 8 8 8S
convsbw 2 1 convert signed to wider a
convubw 2 1 convert unsigned to wider a
splatbw 2 1 duplicates 8 bits to both halfs of 16 bits special
splatbl 4 1 duplicates 8 bits to all parts of 32 bits special
convswl 4 2 convert signed to wider a
convuwl 4 2 convert unsigned to wider a
convslq 8 4 convert signed to wider a
convulq 8 4 convert unsigned to wider a
convwb 1 2 convert signed to narrower a
convhwb 1 2 shift and convert a>>8
convssswb 1 2 convert signed to signed with saturation clamp(a)
convsuswb 1 2 convert signed to unsigned with saturation clamp(a)
convusswb 1 2 convert unsigned to signed with saturation clamp(a)
convuuswb 1 2 convert unsigned to unsigned with saturation clamp(a)
convlw 2 4 convert signed to narrower a
convhlw 2 4 shift and convert a>>16
convssslw 2 4 convert signed to signed with saturation clamp(a)
convsuslw 2 4 convert signed to unsigned with saturation clamp(a)
convusslw 2 4 convert unsigned to signed with saturation clamp(a)
convuuslw 2 4 convert unsigned to unsigned with saturation clamp(a)
convql 4 8 convert signed to narrower a
convsssql 4 8 convert signed to signed with saturation clamp(a)
convsusql 4 8 convert signed to unsigned with saturation clamp(a)
convussql 4 8 convert unsigned to signed with saturation clamp(a)
convuusql 4 8 convert unsigned to unsigned with saturation clamp(a)
mulsbw 2 1 1 multiply signed to wider a * b
mulubw 2 1 1 multiply unsigned to wider a * b
mulswl 4 2 2 multiply signed to wider a * b
muluwl 4 2 2 multiply unsigned to wider a * b
mulslq 8 4 4 multiply signed to wider a * b
mululq 8 4 4 multiply unsigned to wider a * b
accw 2 2 accumulate += a
accl 4 4 accumulate += a
accsadubl 4 1 1 accumulate absolute difference += abs(a - b)
swapw 2 2 endianness byte swap special
swapl 4 4 endianness byte swap special
swapwl 4 4 endianness word swap special
swapq 8 8 endianness byte swap special
swaplq 8 8 endianness long word swap special
select0wb 1 2 select first half special
select1wb 1 2 select second half special
select0lw 2 4 select first half special
select1lw 2 4 select second half special
select0ql 4 8 select first half special
select1ql 4 8 select second half special
mergelq 8 4 4 merge words special
mergewl 4 2 2 merge halfwords special
mergebw 2 1 1 merge bytes special
splitql 4 8 split first/second long words special
splitlw 2 4 split first/second words special
splitwb 1 2 split first/second bytes special
addf 4 4 4 add a + b
subf 4 4 4 subtract a - b
mulf 4 4 4 multiply a * b
divf 4 4 4 divide a / b
sqrtf 4 4 square root sqrt(a)
maxf 4 4 4 maximum max(a,b)
minf 4 4 4 minimum min(a,b)
cmpeqf 4 4 4 compare equal (a == b) ? (~0) : 0
cmpltf 4 4 4 compare less than (a == b) ? (~0) : 0
cmplef 4 4 4 compare less than or equal (a == b) ? (~0) : 0
convfl 4 4 convert float point to integer a
convlf 4 4 convert integer to floating point a
addd 8 8 8 add a + b
subd 8 8 8 subtract a - b
muld 8 8 8 multiply a * b
divd 8 8 8 divide a / b
sqrtd 8 8 square root sqrt(a)
maxd 8 8 8 maximum max(a,b)
mind 8 8 8 minimum min(a,b)
cmpeqd 8 8 8 compare equal (a == b) ? (~0) : 0
cmpltd 8 8 8 compare less than (a == b) ? (~0) : 0
cmpled 8 8 8 compare less than or equal (a == b) ? (~0) : 0
convdl 4 8 convert double point to integer a
convld 8 4 convert integer to double point a
convfd 8 4 convert float to double a
convdf 4 8 convert double to float a
orf 4 4 4 bitwise or a | b
andf 4 4 4 bitwise and a & b
convwf 4 2

In the pseudo code of the above table, abs() indicates absolute value, clamp() indicates that any values outside the destination range are set to the nearest value in the destination range, and sign() evaluates to -1 for values less than 0, 1 for values greater than 0, and 0 for 0.

Rule Coverage

The values for shift operations are not correct in this table.

Opcode Name avx sse mmx altivec neon c64x-c mips riscv lsx lasx c
absb yes yes yes yes yes yes no yes yes yes yes
addb yes yes yes yes yes yes yes yes yes yes yes
addssb yes yes yes yes yes yes no yes yes yes yes
addusb yes yes yes yes yes yes no yes yes yes yes
andb yes yes yes yes yes yes no yes yes yes yes
andnb yes yes yes yes yes yes no yes yes yes yes
avgsb yes yes yes yes yes yes no yes yes yes yes
avgub yes yes yes yes yes yes yes yes yes yes yes
cmpeqb yes yes yes yes yes yes no yes yes yes yes
cmpgtsb yes yes yes yes yes yes no yes yes yes yes
copyb yes yes yes yes yes yes yes yes yes yes yes
loadb yes yes yes yes yes yes yes yes yes yes yes
loadoffb yes yes yes yes yes no no yes yes no yes
loadupdb yes yes yes no yes no no no yes yes yes
loadupib yes yes yes no no no yes no no no yes
loadpb yes yes yes yes yes no yes yes yes yes yes
ldresnearb no no no no no no no no no no yes
ldresnearl no yes yes no no no no no no no yes
ldreslinb no no no no no no no no no no yes
ldreslinl no yes yes no no no no no no no yes
maxsb yes yes yes yes yes yes no yes yes yes yes
maxub yes yes yes yes yes yes no yes yes yes yes
minsb yes yes yes yes yes yes no yes yes yes yes
minub yes yes yes yes yes yes no yes yes yes yes
mullb yes yes yes yes yes no no yes yes yes yes
mulhsb yes yes yes yes yes no no yes yes yes yes
mulhub yes yes yes yes yes no no yes yes yes yes
orb yes yes yes yes yes yes no yes yes yes yes
shlb yes yes yes yes yes no no yes yes yes yes
shrsb yes yes yes yes yes no no yes yes yes yes
shrub yes yes yes yes yes no no yes yes yes yes
signb yes yes no yes yes yes no yes yes yes yes
storeb yes yes yes yes yes yes yes yes yes yes yes
subb yes yes yes yes yes yes yes yes yes yes yes
subssb yes yes yes yes yes no no yes yes yes yes
subusb yes yes yes yes yes no no yes yes yes yes
xorb yes yes yes yes yes yes no yes yes yes yes
absw yes yes yes yes yes yes no yes yes yes yes
addw yes yes yes yes yes yes yes yes yes yes yes
addssw yes yes yes yes yes yes yes yes yes yes yes
addusw yes yes yes yes yes yes no yes yes yes yes
andw yes yes yes yes yes yes no yes yes yes yes
andnw yes yes yes yes yes yes no yes yes yes yes
avgsw yes yes yes yes yes yes no yes yes yes yes
avguw yes yes yes yes yes yes no yes yes yes yes
cmpeqw yes yes yes yes yes yes no yes yes yes yes
cmpgtsw yes yes yes yes yes yes no yes yes yes yes
copyw yes yes yes yes yes yes yes yes yes yes yes
div255w yes yes yes yes yes no no yes yes yes yes
divluw yes yes yes no no no no yes yes yes yes
loadw yes yes yes yes yes yes yes yes yes yes yes
loadoffw yes yes yes yes yes no no yes yes no yes
loadpw yes yes yes yes yes no yes yes yes yes yes
maxsw yes yes yes yes yes yes no yes yes yes yes
maxuw yes yes yes yes yes yes no yes yes yes yes
minsw yes yes yes yes yes yes no yes yes yes yes
minuw yes yes yes yes yes yes no yes yes yes yes
mullw yes yes yes yes yes yes yes yes yes yes yes
mulhsw yes yes yes yes yes yes no yes yes yes yes
mulhuw yes yes yes yes yes yes no yes yes yes yes
orw yes yes yes yes yes yes no yes yes yes yes
shlw yes yes yes yes yes yes no yes yes yes yes
shrsw yes yes yes yes yes yes yes yes yes yes yes
shruw yes yes yes yes yes yes yes yes yes yes yes
signw yes yes yes yes yes yes no yes yes yes yes
storew yes yes yes yes yes yes yes yes yes yes yes
subw yes yes yes yes yes yes yes yes yes yes yes
subssw yes yes yes yes yes yes yes yes yes yes yes
subusw yes yes yes yes yes yes no yes yes yes yes
xorw yes yes yes yes yes yes no yes yes yes yes
absl yes yes yes yes yes yes no yes yes yes yes
addl yes yes yes yes yes yes yes yes yes yes yes
addssl yes yes yes yes yes yes no yes yes yes yes
addusl yes yes yes yes yes yes no yes yes yes yes
andl yes yes yes yes yes yes no yes yes yes yes
andnl yes yes yes yes yes yes no yes yes yes yes
avgsl yes yes yes yes yes yes no yes yes yes yes
avgul yes yes yes yes yes yes no yes yes yes yes
cmpeql yes yes yes yes yes yes no yes yes yes yes
cmpgtsl yes yes yes yes yes yes no yes yes yes yes
copyl yes yes yes yes yes yes yes yes yes yes yes
loadl yes yes yes yes yes yes yes yes yes yes yes
loadoffl yes yes yes yes yes no no yes yes no yes
loadpl yes yes yes yes yes no yes yes yes yes yes
maxsl yes yes yes yes yes yes no yes yes yes yes
maxul yes yes yes yes yes yes no yes yes yes yes
minsl yes yes yes yes yes yes no yes yes yes yes
minul yes yes yes yes yes yes no yes yes yes yes
mulll yes yes yes yes yes yes no yes yes yes yes
mulhsl yes yes no no yes yes no yes yes yes yes
mulhul yes yes no no yes yes no yes yes yes yes
orl yes yes yes yes yes yes no yes yes yes yes
shll yes yes yes yes yes yes no yes yes yes yes
shrsl yes yes yes yes yes yes yes yes yes yes yes
shrul yes yes yes yes yes yes no yes yes yes yes
signl yes yes no yes yes yes no yes yes yes yes
storel yes yes yes yes yes yes yes yes yes yes yes
subl yes yes yes yes yes yes no yes yes yes yes
subssl yes yes yes yes yes yes no yes yes yes yes
subusl yes yes yes yes yes yes no yes yes yes yes
xorl yes yes yes yes yes yes no yes yes yes yes
loadq yes yes yes yes yes yes no yes yes yes yes
loadpq yes yes yes yes yes no no yes yes yes yes
storeq yes yes yes yes yes yes no yes yes yes yes
splatw3q yes yes yes yes yes no no yes yes yes yes
copyq yes yes yes yes yes no no yes yes yes yes
cmpeqq yes yes no yes no no no yes yes yes yes
cmpgtsq yes yes no yes no no no yes yes yes yes
andq yes yes yes yes yes no no yes yes yes yes
andnq yes yes yes yes yes no no yes yes yes yes
orq yes yes yes yes yes no no yes yes yes yes
xorq yes yes yes yes yes no no yes yes yes yes
addq yes yes no yes yes no no yes yes yes yes
subq yes yes no yes yes no no yes yes yes yes
shlq yes yes yes no no no no yes yes yes yes
shrsq yes yes yes no no no no yes yes yes yes
shruq yes yes yes no no no no yes yes yes yes
convsbw yes yes yes yes yes yes yes yes yes yes yes
convubw yes yes yes yes yes yes yes yes yes yes yes
splatbw yes yes yes yes yes no yes yes yes yes yes
splatbl yes yes yes yes yes no no yes yes yes yes
convswl yes yes yes yes yes yes no yes yes yes yes
convuwl yes yes yes yes yes yes no yes yes yes yes
convslq yes yes yes yes yes no no yes yes yes yes
convulq yes yes yes yes yes no no yes yes yes yes
convwb yes yes yes yes yes yes yes yes yes yes yes
convhwb yes yes yes yes yes no no yes yes yes yes
convssswb yes yes yes yes yes yes yes yes yes yes yes
convsuswb yes yes yes yes yes yes yes yes yes yes yes
convusswb yes yes no no no no no yes yes yes yes
convuuswb yes yes yes yes yes no no yes yes yes yes
convlw yes yes yes yes yes yes no yes yes yes yes
convhlw yes yes yes yes yes no no yes yes yes yes
convssslw yes yes yes yes yes yes yes yes yes yes yes
convsuslw yes yes no yes yes no no yes yes yes yes
convusslw yes yes no no no no no yes yes yes yes
convuuslw yes yes no yes yes no no yes yes yes yes
convql yes yes yes yes yes no no yes yes yes yes
convsssql yes yes no no yes no no yes yes yes yes
convsusql yes no no no yes no no yes yes yes yes
convussql yes no no no no no no yes no yes yes
convuusql yes no no no yes no no yes yes yes yes
mulsbw yes yes yes yes yes yes no yes yes yes yes
mulubw yes yes yes yes yes yes no yes yes yes yes
mulswl yes yes yes yes yes yes yes yes yes yes yes
muluwl yes yes yes yes yes yes no yes yes yes yes
mulslq yes yes no yes no no no yes yes yes yes
mululq yes yes no yes no no no yes yes yes yes
accw yes yes yes yes yes yes no yes yes yes yes
accl yes yes yes yes yes yes no yes yes yes yes
accsadubl yes yes yes yes yes yes no yes yes yes yes
swapw yes yes yes yes yes yes yes yes yes yes yes
swapl yes yes yes yes yes yes yes yes yes yes yes
swapwl yes yes yes yes yes no no yes yes yes yes
swapq yes yes yes yes yes no no yes yes yes yes
swaplq yes yes yes yes yes no no yes yes yes yes
select0wb yes yes yes yes yes yes yes yes yes yes yes
select1wb yes yes yes yes yes yes yes yes yes yes yes
select0lw yes yes yes yes yes yes yes yes yes yes yes
select1lw yes yes yes yes yes yes yes yes yes yes yes
select0ql yes yes yes yes yes no no yes yes yes yes
select1ql yes yes yes yes yes no no yes yes yes yes
mergelq yes yes yes yes yes no no yes yes yes yes
mergewl yes yes yes yes yes yes yes yes yes yes yes
mergebw yes yes yes yes yes yes yes yes yes yes yes
splitql yes yes yes yes yes no no yes yes yes yes
splitlw yes yes yes yes yes no yes yes yes yes yes
splitwb yes yes yes yes yes no yes yes yes yes yes
addf yes yes no yes yes yes no yes yes yes yes
subf yes yes no yes yes yes no yes yes yes yes
mulf yes yes no yes yes yes no yes yes yes yes
divf yes yes no yes yes yes no yes yes yes yes
sqrtf yes yes no yes yes yes no yes yes yes yes
maxf yes yes no yes yes yes no yes yes yes yes
minf yes yes no yes yes yes no yes yes yes yes
cmpeqf yes yes no yes yes yes no yes yes yes yes
cmpltf yes yes no yes no yes no yes yes yes yes
cmplef yes yes no yes no yes no yes yes yes yes
convfl yes yes no yes yes yes no yes yes yes yes
convlf yes yes no yes yes yes no yes yes yes yes
addd yes yes no yes yes no no yes yes yes yes
subd yes yes no yes yes no no yes yes yes yes
muld yes yes no yes yes no no yes yes yes yes
divd yes yes no yes yes no no yes yes yes yes
sqrtd yes yes no yes yes no no yes yes yes yes
maxd yes yes no yes no no no yes yes yes yes
mind yes yes no yes no no no yes yes yes yes
cmpeqd yes yes no yes no no no yes yes yes yes
cmpltd yes yes no yes no no no yes yes yes yes
cmpled yes yes no yes no no no yes yes yes yes
convdl yes yes no yes no no no yes yes yes yes
convld yes yes no yes no no no yes yes yes yes
convfd yes yes no yes yes no no yes yes yes yes
convdf yes yes no yes yes no no yes yes yes yes
orf yes yes no no no no no yes yes yes yes
andf yes yes no no no no no yes yes yes yes
convwf yes yes no no no no no no no no yes

The results of the search are