On Thu, 2023-11-23 at 17:14 +0800, chenglulu wrote:
> When I look at this code and compare it to our scalar implementation, it
> seems
>
> that our scalar implementation still lacks an "lround".
Should be "lroundeven". We don't have an instruction for lround :(.
I tried this but it does not work:
-(define_int_iterator LRINT [UNSPEC_FTINT UNSPEC_FTINTRM UNSPEC_FTINTRP])
+(define_int_iterator LRINT
+ [UNSPEC_FTINT UNSPEC_FTINTRM UNSPEC_FTINTRP UNSPEC_FTINTRNE])
(define_int_attr lrint_pattern [(UNSPEC_FTINT "lrint")
(UNSPEC_FTINTRM "lfloor")
- (UNSPEC_FTINTRP "lceil")])
+ (UNSPEC_FTINTRP "lceil")
+ (UNSPEC_FTINTRNE "lroundeven")])
(define_int_attr lrint_submenmonic [(UNSPEC_FTINT "")
(UNSPEC_FTINTRM "rm")
- (UNSPEC_FTINTRP "rp")])
+ (UNSPEC_FTINTRP "rp")
+ (UNSPEC_FTINTRNE "rne")])
The problem is "lroundevenMN2" is not a standard pattern name. The SIMD
version of ftintrne in patch 1 only works because we are expanding
"roundevenM2" (it's a standard pattern name) to UNSPEC_SIMD_FRINTRNE,
and then a define_insn can match (fix (UNSPEC_SIMD_FRINTRNE op)). But
for non-SIMD we don't have roundevenM2.
--
Xi Ruoyao <[email protected]>
School of Aerospace Science and Technology, Xidian University