search_amd64.s 831 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // Code generated by command: go run asm2.go -out search_amd64.s -stubs stub_search_amd64.go. DO NOT EDIT.
  2. #include "textflag.h"
  3. // func Search(xs []uint64, k uint64) int16
  4. TEXT ·Search(SB), NOSPLIT, $0-34
  5. MOVQ xs_base+0(FP), AX
  6. MOVQ xs_len+8(FP), CX
  7. MOVQ k+24(FP), DX
  8. // Save n
  9. MOVQ CX, BX
  10. // Initialize idx register to zero.
  11. XORL BP, BP
  12. loop:
  13. // Unroll1
  14. CMPQ (AX)(BP*8), DX
  15. JAE Found
  16. // Unroll2
  17. CMPQ 16(AX)(BP*8), DX
  18. JAE Found2
  19. // Unroll3
  20. CMPQ 32(AX)(BP*8), DX
  21. JAE Found3
  22. // Unroll4
  23. CMPQ 48(AX)(BP*8), DX
  24. JAE Found4
  25. // plus8
  26. ADDQ $0x08, BP
  27. CMPQ BP, CX
  28. JB loop
  29. JMP NotFound
  30. Found2:
  31. ADDL $0x02, BP
  32. JMP Found
  33. Found3:
  34. ADDL $0x04, BP
  35. JMP Found
  36. Found4:
  37. ADDL $0x06, BP
  38. Found:
  39. MOVL BP, BX
  40. NotFound:
  41. MOVL BX, BP
  42. SHRL $0x1f, BP
  43. ADDL BX, BP
  44. SHRL $0x01, BP
  45. MOVL BP, ret+32(FP)
  46. RET