On 11/30/21 9:22 AM, gaosong wrote:
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?
...
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?
No. You're not converting anything here.
I think you should simply replace "0x" with "0b" so that the bits of FCMP are more
compact. I assume that's what you were originally thinking.
#define FCMP_LT 0b0001 /* fp0 < fp1 */
#define FCMP_EQ 0b0010 /* fp0 = fp1 */
#define FCMP_UN 0b0100 /* unordered */
#define FCMP_GT 0b1000 /* fp0 > fp1 */
or identically with the form (1 << 0), (1 << 1), etc.
r~