fclass.s
Single-precision floating-point classify
The fclass.s instruction examines the value in floating-point register fs1 and writes to integer register xd a 10-bit mask that indicates the class of the floating-point number. The format of the mask is described in the table below. The corresponding bit in xd will be set if the property is true and clear otherwise. All other bits in xd are cleared. Note that exactly one bit in xd will be set. fclass.s does not set the floating-point exception flags.
xd bit | Meaning |
---|---|
0 |
fs1 is \(-\infty\). |
1 |
fs1 is a negative normal number. |
2 |
fs1 is a negative subnormal number. |
3 |
fs1 is \(-0\). |
4 |
fs1 is \(+0\). |
5 |
fs1 is a positive subnormal number. |
6 |
fs1 is a positive normal number. |
7 |
fs1 is \(+\infty\). |
8 |
fs1 is a signaling NaN. |
9 |
fs1 is a quiet NaN. |
Execution
-
IDL
-
Sail
check_f_ok($encoding);
Bits<32> sp_value = f[fs1][31:0];
if (is_sp_neg_inf?(sp_value)) {
X[xd] = 1 << 0;
} else if (is_sp_neg_norm?(sp_value)) {
X[xd] = 1 `<< 1;
} else if (is_sp_neg_subnorm?(sp_value)) {
X[xd] = 1 `<< 2;
} else if (is_sp_neg_zero?(sp_value)) {
X[xd] = 1 `<< 3;
} else if (is_sp_pos_zero?(sp_value)) {
X[xd] = 1 `<< 4;
} else if (is_sp_pos_subnorm?(sp_value)) {
X[xd] = 1 `<< 5;
} else if (is_sp_pos_norm?(sp_value)) {
X[xd] = 1 `<< 6;
} else if (is_sp_pos_inf?(sp_value)) {
X[xd] = 1 `<< 7;
} else if (is_sp_signaling_nan?(sp_value)) {
X[xd] = 1 `<< 8;
} else {
assert(is_sp_quiet_nan?(sp_value), "Unexpected SP value");
X[xd] = 1 `<< 9;
}
{
let rs1_val_X = X(rs1);
let rd_val_S = rs1_val_X [31..0];
F(rd) = nan_box (rd_val_S);
RETIRE_SUCCESS
}