Advertisement
BumbleBritches57

Untitled

Oct 22nd, 2017
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.99 KB | None | 0 0
  1. unsigned int BranchlessABS(signed long long Value)
  2. {
  3.     unsigned long long Result;  // the result goes here
  4.     signed long long const Mask = Value >> sizeof(unsigned long long) * CHAR_BIT - 1;
  5.  
  6.     Result = (Value + Mask) ^ Mask;
  7.     return Result;
  8. }
  9.  
  10. unsigned long long BranchlessAbsolute(const signed long long Value) {
  11.     unsigned long long Result = 0ULL;
  12.     unsigned long long const Mask = Value >> sizeof(unsigned long long) * CHAR_BIT - 1;
  13.     Result = (Value + Mask) ^ Mask;
  14.     return Result;
  15. }
  16.  
  17. I rewrote your version to be more descriptive, and to use the same sized ints I was, Your version is called BranchlessABS, My version is called BranchlessAbsolute.
  18.  
  19. Here's the results for the compiling.
  20.  
  21. ARM64 GCC 6.3:
  22.  
  23. BranchlessABS(long long):
  24.  add x1, x0, x0, asr 63
  25.  eor x0, x1, x0, asr 63
  26.  ret
  27. BranchlessAbsolute(long long):
  28.  add x1, x0, x0, asr 63
  29.  eor x0, x1, x0, asr 63
  30.  ret
  31.  
  32. x86_64 Clang 5.0:
  33.  
  34. BranchlessABS(long long): # @BranchlessABS(long long)
  35.  mov rax, rdi
  36.  sar rax, 63
  37.  add edi, eax
  38.  xor edi, eax
  39.  mov eax, edi
  40.  ret
  41. BranchlessAbsolute(long long): # @BranchlessAbsolute(long long)
  42.  mov rcx, rdi
  43.  sar rcx, 63
  44.  lea rax, [rdi + rcx]
  45.  xor rax, rcx
  46.  ret
  47.  
  48. MIPS64 GCC 5.4:
  49.  
  50. BranchlessABS(long long):
  51.  dsra $2,$4,63
  52.  daddu $4,$4,$2
  53.  xor $2,$4,$2
  54.  j $31
  55.  sll $2,$2,0
  56.  
  57. BranchlessAbsolute(long long):
  58.  dsra $2,$4,63
  59.  daddu $4,$4,$2
  60.  j $31
  61.  xor $2,$4,$2
  62.  
  63. Why does my version consistently use one less instruction than yours, and why do they use different shifting instructions?
  64.  
  65. Here's the link to the online compiler: https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAKxAEZSBnVAV2OUxAHIBSAJgGY8AO2QAbZlgDU3fgGFReALaEGAOgQzs3AAwBBPoJHipM2QwLoFAI3Wad%2BvcyEM8wIZnSThBSVdEB9AEMrBghvSQA3AEp7bgB2ACFY7QBOJxc3Dy8hH2IZBMlJAHoiyQIETEliTAZmUR9gVBrJCurpPR0U8LRnH0VAhgBraX4AEUiRrX5sSRcAL0xUADMwnKjJACpJWQAJXQAlfwSASQAVSQBaSVp85IcU4hHxiAjpXgL%2BofXuAFYZz8Gtw6qWqBFYQiqQP0cVGd3SrncnnCViCIVWPmisUSyS6S0kLxGskk2hiwJSnVB4MuEShFMwYOIEJp/CSHRhcOcCKyyN4qNC4UxbNZ9zweIJpmJpPu8WFnTpDIhAD9XnwCjcWTj4rDgfdKYzIrT2Tr4ZkkTlJNY%2BejIlKZTi9RDgqFMRq2aNOFFSKIuD9OKQhFxtH7UFxZKrVbMWGxKgZaH6CIGPZ7BnQUqoUnF%2BHFtJm4ileD9CykvVwACx%2BgOcIOkEOcP0MEDaUgJqse0hwWBINCKAAOeFEmDIFAg3b7A%2BIIGAcV4pCW/YIg4bECsidIVmEgWIAE8uHHSN3FJgcgB5ISiHet0hYfpCYAD1f4arIAh4CI1VeYAAemGQzAXu79bxMG9S8CGIJQAM9awG0gT1UB7F9UGcLgLmPfh6yjdg6FIAB3QITwQ44hCWWs4ygn0K1XWtPwADgANguOjS0kYBkGQSQ4lUXh8VwQgSDefh6G2VBe37QcBNoKJ40TKJkxAXhtFUbReDo3h81UnNSy0/gS04ct/Sorh60bZsZPbGBEBQESx0HchKFHMSJzEfDgB%2BbQmznepF0oFdL3XIRNwvPcDyPAhT3PB9MBvO8OEvR8fxfN8G0vL8fz/WK9yAkDqzAiDWygvAQngOCELwJDktQ9DGEwjhJN030DMvaj6MY5jnNvSQfiUpSePwIhHljUhhNE8cBN4KTTPyuSFKU9y5vm%2BbS10/TK2rWtjKbFsg09DtLIc8c7JHazHJATdFCY4A6P4Dz5285dV38wKAP3ETDxPM8L2ra8XPvOK8CfRL3xS79f3/ThMpyYDV1yxQzOg4qa1K8qULQjDWCwuqQIa1bgy4A4AFkmJYtjJDo1R%2BB6iBeP6iShtkY7RoMfgJq2pNSBTGaFq5ualpAlbDLrRgTNZnaLIgLsGds4d9sHEBlB7BgfiY2dbuIJdfOrR7t2ekL3oiuKop%2B2Kvv%2BhLXyB6tUtBjLAMh7L43A2H8q9QqYIgErEOQzhKrR6M6HIzhsYF/HjgABQAZSJ1j2K65iqb6/jBuGmyBoEUsWZk6bFO57nebLSimqMoXNsz3TeALtai5Fz03zVsqA1LIA%3D
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement