tls.ssa 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # skip amd64_win (pthread and tls not implemented)
  2. thread data $i = align 4 {w 42}
  3. data $fmti = align 1 {b "i%d==%d\n", b 0}
  4. thread data $x = {w 1, w 2, w 3, w 4}
  5. data $fmtx = align 1 {b "*(x+%d)==%d\n", b 0}
  6. export
  7. function w $main() {
  8. @start
  9. %pthr =l alloc8 8
  10. %rval =l alloc8 8
  11. call $pthread_create(l %pthr, l 0, l $thread, l 0)
  12. %t =l load %pthr
  13. call $pthread_join(l %t, l %rval)
  14. %i0 =w loadw thread $i
  15. call $printf(l $fmti, ..., w 0, w %i0)
  16. %i1 =w load %rval
  17. call $printf(l $fmti, ..., w 1, w %i1)
  18. %a0 =l call $xaddr()
  19. %x0 =w load %a0
  20. call $printf(l $fmtx, ..., w 0, w %x0)
  21. %a4 =l call $xaddroff4()
  22. %x4 =w load %a4
  23. call $printf(l $fmtx, ..., w 4, w %x4)
  24. %a8 =l call $xaddroff(l 8)
  25. %x8 =w load %a8
  26. call $printf(l $fmtx, ..., w 8, w %x8)
  27. %xc =l call $xvalcnt(l 3)
  28. call $printf(l $fmtx, ..., w 12, w %xc)
  29. ret 0
  30. }
  31. function l $thread(l %arg) {
  32. @start
  33. %i3 =l add thread $i, 3
  34. storeb 24, %i3
  35. %ret =l loadsw thread $i
  36. ret %ret
  37. }
  38. function l $xaddr() {
  39. @start
  40. ret thread $x
  41. }
  42. function l $xaddroff4() {
  43. @start
  44. %a =l add 4, thread $x
  45. ret %a
  46. }
  47. function l $xaddroff(l %off) {
  48. @start
  49. %a =l add thread $x, %off
  50. ret %a
  51. }
  52. function w $xvalcnt(l %cnt) {
  53. @start
  54. %o =l mul 4, %cnt
  55. %a =l add thread $x, %o
  56. %x =w load %a
  57. ret %x
  58. }
  59. # >>> output
  60. # i0==42
  61. # i1==402653226
  62. # *(x+0)==1
  63. # *(x+4)==2
  64. # *(x+8)==3
  65. # *(x+12)==4
  66. # <<<