Hi Richard,
On 2021/11/20 下午5:02, Richard Henderson wrote:
+#define FCMP_LT 0x0001 /* fp0 < fp1 */
+#define FCMP_EQ 0x0010 /* fp0 = fp1 */
+#define FCMP_UN 0x0100 /* unordered */
+#define FCMP_GT 0x1000 /* fp0 > fp1 */
Any reason why these bits are not sequential?
I think this is consistent with the description in Table 9, and the
FCMP_GT is need 0x7.
In get_fcmp_flags(int cond) the param 'cond' is table 9 COND >> 1,
table 9
COND True Condition
0x2 LT
0x4 EQ
0x6 EQ LT
0x8 UN
0x10 GT LT
...
COND >> 1 Flags
0x1 FCMP_LT FCMP_LT 0x1
0x2 FCMP_EQ FCMP_EQ 0x2
0x3 FCMP_EQ | FCMP_LT
0x4 FCMP_UN FCMP_UN 0x4
0x8 FCMP_GT | FCMP_LT FCMP_GT 0x7
...
so our definitions :
#define FCMP_LT 0x1 /* fp0 < fp1 */
#define FCMP_EQ 0x2 /* fp0 = fp1 */
#define FCMP_UN 0x4 /* unordered */
#define FCMP_GT 0x7 /* fp0 > fp1 */
get_fcmp_flags:
/* bit0(signaling/quiet) bit1(lt) bit2(eq) bit3(un) bit4(neq) */
static uint32_t get_fcmp_flags(int cond)
{
uint32_t flags = 0;
if (cond & 0x1) {
flags |= FCMP_LT;
}
if (cond & 0x2) {
flags |= FCMP_EQ;
}
if (cond & 0x4) {
flags |= FCMP_UN;
}
if (cond & 0x8) {
flags |= FCMP_GT | FCMP_LT;
}
return flags;
}
If not .
We should like:
#define FCMP_LT 0x1 /* fp0 < fp1 */
#define FCMP_EQ 0x2 /* fp0 = fp1 */
#define FCMP_UN 0x3 /* unordered */
#define FCMP_GT 0x4 /* fp0 > fp1 */
static uint32_t get_fcmp_flags(int cond)
{
uint32_t flags = 0;
if (cond & 0x1) {
flags |= FCMP_LT;
}
if (cond & 0x2) {
flags |= FCMP_EQ;
}
if (cond & 0x3) {
flags |= FCMP_UN;
}
if (cond & 0x4) {
flags |= FCMP_GT;
}
return flags;
}
Is this right?
Thanks
Song Gao