On 6/29/24 06:44, Jeff Law wrote: >> +;; fclass instruction output bitmap >> +;; 0 negative infinity >> +;; 1 negative normal number. >> +;; 2 negative subnormal number. >> +;; 3 -0 >> +;; 4 +0 >> +;; 5 positive subnormal number. >> +;; 6 positive normal number. >> +;; 7 positive infinity >> +;; 8 signaling NaN. >> +;; 9 quiet NaN >> +(define_insn "fclass<ANYF:mode>" >> + [(set (match_operand:SI 0 "register_operand" "=r") >> + (unspec:SI [(match_operand:ANYF 1 "register_operand" " f")] >> + UNSPEC_FCLASS))] >> + "TARGET_HARD_FLOAT" >> + "fclass.<fmt>\t%0,%1" >> + [(set_attr "type" "fcmp") >> + (set_attr "mode" "<UNITMODE>")]) > So I realize the result only has 10 bits of output, but I think would it > make more sense to use X rather than SI for the result. When we use > SImode on rv64 we have to deal with potential extensions. In this case > we know the values are properly extended, so we could just claim it's > DImode and I think everything would "just work" and we wouldn't have to > worry about unnecessary sign extensions creeping in.
Indeed the perils of sign extension on RV are not lost on me and this is exactly how I started. But my md syntax foo/bar is, lets just say a work in progress :-) I started with + "fclass<ANYF:mode><X:mode>" so its invocation became + emit_insn (gen_fclass<ANYF:mode><X:mode> (tmp, operands[1])); which then led to expander itself needing X in the definition lest we get duplicate definitions due to X's variants. +(define_expand "isnormal<ANYF:mode><X:mode>2" + [(set (match_operand:X 0 "register_operand" "=r") + (unspec:X [(match_operand:ANYF 1 "register_operand" " f")] + UNSPEC_ISNORMAL))] + "TARGET_HARD_FLOAT" But this was not getting recognized as a well known pattern: CODE_FOR_isnormalxx was not getting generated. Keeping it as following did make it work. +(define_expand "isnormal<ANYF:mode>2" Any ideas on how I can keep this and then adjust rest of patterns. Would it help to make it define_insn *name ? >> +;; TODO: isinf is a bit tricky as it require trimodal return >> +;; 1 if 0x80, -1 if 0x1, 0 otherwise > It shouldn't be terrible, but it's not trivial either. > > bext t0, a0, 0 > neg t0 > bext t1, a0, 7 > czero.nez res, t0, t1 > snez t1, t1 > add a0, a1, a0 > > Or something reasonably close to that. I wrote the "C" code and saw what compiler would do ;-) for the baseline isa build. andi a5,a0,128 bne a5,zero,.L7 slli a5,a0,63 srai a0,a5,63 ret .L7: li a0,1 ret But again labels are hard (for me ) in md. > Of course that depends on zicond and zbs. So we probably want the > expansion to not depend on those extensions, but generate code that is > easily recognized and converted into that kind of a sequence. Is this a common enough paradigm: {bimodal,trimodal} values based on {2,3} conditions. If so we could do a helper for baseline and then optimization. Otherwise I can just hack up isinf conditional to zicond and zbs based on your code above - after all both of these extensions are likely to be fairly common going fwd. Thx for the quick feedback. -Vineet