Scalar ALU opcodes.
The scalar and vector opcode descriptions follow these conventions.
| Enumerator |
|---|
| kAdds | Floating Point Add.
adds/ADDs dest, src0.ab
dest.xyzw = src0.a + src0.b;
|
| kAddsPrev | Floating Point Add (with Previous).
adds_prev/ADD_PREVs dest, src0.a
dest.xyzw = src0.a + ps;
|
| kMuls | Floating Point Multiply.
muls/MULs dest, src0.ab
dest.xyzw = src0.a * src0.b;
|
| kMulsPrev | Floating Point Multiply (with Previous).
muls_prev/MUL_PREVs dest, src0.a
dest.xyzw = src0.a * ps;
|
| kMulsPrev2 | Scalar Multiply Emulating LIT Operation.
muls_prev2/MUL_PREV2s dest, src0.ab
dest.xyzw =
ps == -FLT_MAX || !isfinite(ps) || !isfinite(src0.b) || src0.b <= 0
? -FLT_MAX : src0.a * ps;
|
| kMaxs | Floating Point Maximum.
maxs/MAXs dest, src0.ab
dest.xyzw = src0.a >= src0.b ? src0.a : src0.b;
|
| kMins | Floating Point Minimum.
mins/MINs dest, src0.ab
dest.xyzw = src0.a < src0.b ? src0.a : src0.b;
|
| kSeqs | Floating Point Set If Equal.
seqs/SETEs dest, src0.a
dest.xyzw = src0.a == 0.0 ? 1.0 : 0.0;
|
| kSgts | Floating Point Set If Greater Than.
sgts/SETGTs dest, src0.a
dest.xyzw = src0.a > 0.0 ? 1.0 : 0.0;
|
| kSges | Floating Point Set If Greater Than Or Equal.
sges/SETGTEs dest, src0.a
dest.xyzw = src0.a >= 0.0 ? 1.0 : 0.0;
|
| kSnes | Floating Point Set If Not Equal.
snes/SETNEs dest, src0.a
dest.xyzw = src0.a != 0.0 ? 1.0 : 0.0;
|
| kFrcs | Floating Point Fractional.
frcs/FRACs dest, src0.a
dest.xyzw = src0.a - floor(src0.a);
|
| kTruncs | Floating Point Truncate.
truncs/TRUNCs dest, src0.a
dest.xyzw = src0.a >= 0 ? floor(src0.a) : -floor(-src0.a);
|
| kFloors | Floating Point Floor.
floors/FLOORs dest, src0.a
dest.xyzw = floor(src0.a);
|
| kExp | Scalar Base 2 Exponent, IEEE.
exp/EXP_IEEE dest, src0.a
dest.xyzw = src0.a == 0.0 ? 1.0 : pow(2, src0.a);
|
| kLogc | Scalar Base 2 Log.
logc/LOG_CLAMP dest, src0.a
float t = src0.a == 1.0 ? 0.0 : log(src0.a) / log(2.0);
dest.xyzw = t == -INF ? -FLT_MAX : t;
Definition log_category.h:29
|
| kLog | Scalar Base 2 IEEE Log.
log/LOG_IEEE dest, src0.a
dest.xyzw = src0.a == 1.0 ? 0.0 : log(src0.a) / log(2.0);
|
| kRcpc | Scalar Reciprocal, Clamp to Maximum.
rcpc/RECIP_CLAMP dest, src0.a
float t = src0.a == 1.0 ? 1.0 : 1.0 / src0.a;
if (t == -INF) t = -FLT_MAX;
else if (t == INF) t = FLT_MAX;
dest.xyzw = t;
|
| kRcpf | Scalar Reciprocal, Clamp to Zero.
Mimics the fixed function pipeline.
rcpf/RECIP_FF dest, src0.a
float t = src0.a == 1.0 ? 1.0 : 1.0 / src0.a;
if (t == -INF) t = -0.0;
else if (t == INF) t = 0.0;
dest.xyzw = t;
|
| kRcp | Scalar Reciprocal, IEEE Approximation.
rcp/RECIP_IEEE dest, src0.a
dest.xyzw = src0.a == 1.0 ? 1.0 : 1.0 / src0.a;
|
| kRsqc | Scalar Reciprocal Square Root, Clamp to Maximum.
rsqc/RECIPSQ_CLAMP dest, src0.a
float t = src0.a == 1.0 ? 1.0 : 1.0 / sqrt(src0.a);
if (t == -INF) t = -FLT_MAX;
else if (t == INF) t = FLT_MAX;
dest.xyzw = t;
|
| kRsqf | Scalar Reciprocal Square Root, Clamp to Zero.
rsqf/RECIPSQ_FF dest, src0.a
float t = src0.a == 1.0 ? 1.0 : 1.0 / sqrt(src0.a);
if (t == -INF) t = -0.0;
else if (t == INF) t = 0.0;
dest.xyzw = t;
|
| kRsq | Scalar Reciprocal Square Root, IEEE Approximation.
rsq/RECIPSQ_IEEE dest, src0.a
dest.xyzw = src0.a == 1.0 ? 1.0 : 1.0 / sqrt(src0.a);
|
| kMaxAs | Floating Point Maximum with Copy To Integer in AR.
maxas dest, src0.ab
movas/MOVAs dest, src0.aa
a0 = (int)clamp(floor(src0.a + 0.5), -256.0, 255.0);
dest.xyzw = src0.a >= src0.b ? src0.a : src0.b;
|
| kMaxAsf | Floating Point Maximum with Copy Truncated To Integer in AR.
maxasf dest, src0.ab
movasf/MOVA_FLOORs dest, src0.aa
a0 = (int)clamp(floor(src0.a), -256.0, 255.0);
dest.xyzw = src0.a >= src0.b ? src0.a : src0.b;
|
| kSubs | Floating Point Subtract.
subs/SUBs dest, src0.ab
dest.xyzw = src0.a - src0.b;
|
| kSubsPrev | Floating Point Subtract (with Previous).
subs_prev/SUB_PREVs dest, src0.a
dest.xyzw = src0.a - ps;
|
| kSetpEq | Floating Point Predicate Set If Equal.
setp_eq/PRED_SETEs dest, src0.a
if (src0.a == 0.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
dest.xyzw = 1.0;
p0 = 0;
}
|
| kSetpNe | Floating Point Predicate Set If Not Equal.
setp_ne/PRED_SETNEs dest, src0.a
if (src0.a != 0.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
dest.xyzw = 1.0;
p0 = 0;
}
|
| kSetpGt | Floating Point Predicate Set If Greater Than.
setp_gt/PRED_SETGTs dest, src0.a
if (src0.a > 0.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
dest.xyzw = 1.0;
p0 = 0;
}
|
| kSetpGe | Floating Point Predicate Set If Greater Than Or Equal.
setp_ge/PRED_SETGTEs dest, src0.a
if (src0.a >= 0.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
dest.xyzw = 1.0;
p0 = 0;
}
|
| kSetpInv | Predicate Counter Invert.
setp_inv/PRED_SET_INVs dest, src0.a
if (src0.a == 1.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
if (src0.a == 0.0) {
dest.xyzw = 1.0;
} else {
dest.xyzw = src0.a;
}
p0 = 0;
}
|
| kSetpPop | Predicate Counter Pop.
setp_pop/PRED_SET_POPs dest, src0.a
if (src0.a - 1.0 <= 0.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
dest.xyzw = src0.a - 1.0;
p0 = 0;
}
|
| kSetpClr | Predicate Counter Clear.
setp_clr/PRED_SET_CLRs dest
dest.xyzw = FLT_MAX;
p0 = 0;
|
| kSetpRstr | Predicate Counter Restore.
setp_rstr/PRED_SET_RESTOREs dest, src0.a
if (src0.a == 0.0) {
dest.xyzw = 0.0;
p0 = 1;
} else {
dest.xyzw = src0.a;
p0 = 0;
}
|
| kKillsEq | Floating Point Pixel Kill If Equal.
kills_eq/KILLEs dest, src0.a
if (src0.a == 0.0) {
dest.xyzw = 1.0;
discard;
} else {
dest.xyzw = 0.0;
}
|
| kKillsGt | Floating Point Pixel Kill If Greater Than.
kills_gt/KILLGTs dest, src0.a
if (src0.a > 0.0) {
dest.xyzw = 1.0;
discard;
} else {
dest.xyzw = 0.0;
}
|
| kKillsGe | Floating Point Pixel Kill If Greater Than Or Equal.
kills_ge/KILLGTEs dest, src0.a
if (src0.a >= 0.0) {
dest.xyzw = 1.0;
discard;
} else {
dest.xyzw = 0.0;
}
|
| kKillsNe | Floating Point Pixel Kill If Not Equal.
kills_ne/KILLNEs dest, src0.a
if (src0.a != 0.0) {
dest.xyzw = 1.0;
discard;
} else {
dest.xyzw = 0.0;
}
|
| kKillsOne | Floating Point Pixel Kill If One.
kills_one/KILLONEs dest, src0.a
if (src0.a == 1.0) {
dest.xyzw = 1.0;
discard;
} else {
dest.xyzw = 0.0;
}
|
| kSqrt | Scalar Square Root, IEEE Approximation.
sqrt/SQRT_IEEE dest, src0.a
dest.xyzw = sqrt(src0.a);
|
| kMulsc0 | mulsc/MUL_CONST_0 dest, src0.a, src1.a
|
| kMulsc1 | mulsc/MUL_CONST_1 dest, src0.a, src1.a
|
| kAddsc0 | addsc/ADD_CONST_0 dest, src0.a, src1.a
|
| kAddsc1 | addsc/ADD_CONST_1 dest, src0.a, src1.a
|
| kSubsc0 | subsc/SUB_CONST_0 dest, src0.a, src1.a
|
| kSubsc1 | subsc/SUB_CONST_1 dest, src0.a, src1.a
|
| kSin | Scalar Sin.
sin/SIN dest, src0.a
dest.xyzw = sin(src0.a);
|
| kCos | Scalar Cos.
cos/COS dest, src0.a
dest.xyzw = cos(src0.a);
|
| kRetainPrev | retain_prev/RETAIN_PREV dest
|