简体   繁体   中英

How to truncate float values in XMM register

How to get only the integer part of float? So, I have a float array: x[4] = {5.0, 13.0, 25.0, 41.0}; I'm putting it in xmm0 and then I'm making sqrt of it. I need one more command which will help to take only int part of this sqrt. For example sqrt of 5 will be 2.236068 and I need just 2.0 in an answer
Code:

__asm 
        {
            movups xmm0, x
            sqrtps xmm0, xmm0
            //here need some command
            movups x, xmm0
        }

Using roundps is the easiest. The rounding mode table is somewhere else but you need rounding mode 3 (towards zero).

Converting to an integer and back only works if the input is guaranteed to be in some range (about 0 to 4.6e18 because of the square root). You could do this with cvttps2dq and cvtdq2ps . That will only require SSE2, roundps requires SSE4.1. You can use cvtps2dq only if the rounding mode is set to truncate, which it usually isn't, so you'd have to change+restore it.

There is an SO question some of whose answers address the topic:

There also is a paper discussing the float to int conversion issue, specifically mentioning the second answer ( no plagiarism implied ).

The major Windows compilers (at least) come with so-called intrinsics ( highly optimized inlined functions ) that might be of interest, eg. MSVC and Intel (float to int: p. 42; float floor(float) function and likes: p. 135) .

Caveat

This is a researched answer. I have not personally used the referenced techniques.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM