News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests

Main Menu

x64 abs() function

Started by fearless, August 30, 2023, 06:17:23 AM

Previous topic - Next topic

fearless

Came across this post online for a x86 version of abs() function - https://helloacm.com/optimized-abs-function-in-assembly/

cdq
xor eax, edx
sub eax, edx

Just wondering if anyone knows the equivalent in x64 asm?



jj2007

  mov rax, -1234567890123456789
  cqo
  xor rax, rdx
  sub rax, rdx

fearless


Caché GB

#3
Here are a few techniques for finding the absolute |u| of a real4 and real8 value in assembly language.

_fabsf(val) for real4 / float
.data

  align 16
  g_XMAbsMaskps              oword  07FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFFh

.code

     local  absfVal:real4

          movss  xmm0, FLT4(-19.2345)

            mov  eax, 80000000h
           movd  xmm1, eax
         shufps  xmm1, xmm1, 0
         andnps  xmm1, xmm0
          movss  absfVal, xmm1              ; _fabsf(val)

; or

          movss  xmm0, FLT4(-28.2345)

            mov  eax, 07FFFFFFFh
           movd  xmm1, eax
         shufps  xmm1, xmm1, 0
          andps  xmm1, xmm0
          movss  absfVal, xmm1              ; _fabsf(val)

; or even better

          movss  xmm0, FLT4(-37.2345)

          andps  xmm0, g_XMAbsMaskps        ; "align 16" g_XMAbsMaskps oword  07FFFFFFF7FFFFFFF7FFFFFFF7FFFFFFFh
          movss  absfVal, xmm0              ; _fabsf(val)


 _fabs(val) for real8 / double
.data

  align 16
  g_XMabsMaskpd              oword  07FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFh

.code

     local  absdVal:real8

           movd  xmm0, FLT8(-46.2345)

            mov  rax, 08000000000000000h
           movd  xmm1, rax
         pshufd  xmm1, xmm1, 01000100y ; 044h
         andnps  xmm1, xmm0
           movd  absdVal, xmm1              ; _fabs(val)

; or

           movd  xmm0, FLT8(-55.2345)

            mov  rax, 07FFFFFFFFFFFFFFFh
           movd  xmm1, rax
         pshufd  xmm1, xmm1, 01000100y ; 044h
          andps  xmm1, xmm0
           movd  absdVal, xmm1              ; _fabs(val)

; or even better

           movd  xmm0, FLT8(-64.2345)

          andps  xmm0, g_XMabsMaskpd        ; "align 16" g_XMabsMaskpd oword  07FFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFh
           movd  absdVal, xmm0              ; _fabs(val)

Caché GB's 1 and 0-nly language:MASM

Caché GB

#4
And yes thanks JJ. learnt another mnemonic,  cqo - convert qword to oword (x64 only)
Caché GB's 1 and 0-nly language:MASM