tasm2.nim 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. discard """
  2. targets: "c cpp"
  3. disabled: "arm64"
  4. """
  5. import std/strutils
  6. block: # bug #23114
  7. func ccopy_x86_asm(ctl: uint64, x: var uint64, y: uint64) =
  8. asm """
  9. testq %[ctl], %[ctl]
  10. cmovnzq %[y], %[x]
  11. : [x] "+r" (`x`)
  12. : [ctl] "r" (`ctl`), [y] "r" (`y`)
  13. : "cc"
  14. """
  15. func ccopy_x86_emit(ctl: uint64, x: var uint64, y: uint64) =
  16. {.emit:[
  17. """
  18. asm volatile(
  19. "testq %[ctl], %[ctl]\n"
  20. "cmovnzq %[y], %[x]\n"
  21. : [x] "+r" (""", x, """)
  22. : [ctl] "r" (""", ctl, """), [y] "r" (""", y, """)
  23. : "cc"
  24. );"""].}
  25. let x = 0x1111111'u64
  26. let y = 0xFFFFFFF'u64
  27. block:
  28. let ctl = 1'u64
  29. var a0 = x
  30. ctl.ccopy_x86_asm(a0, y)
  31. var a1 = x
  32. ctl.ccopy_x86_emit(a1, y)
  33. doAssert a0.toHex() == "000000000FFFFFFF"
  34. doAssert a0 == a1
  35. block:
  36. let ctl = 0'u64
  37. var a0 = x
  38. ctl.ccopy_x86_asm(a0, y)
  39. var a1 = x
  40. ctl.ccopy_x86_emit(a1, y)
  41. doAssert a0.toHex() == "0000000001111111"
  42. doAssert a0 == a1