procs_wasm.odin 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #+build wasm32, wasm64p32
  2. package runtime
  3. @(private="file")
  4. ti_int :: struct #raw_union {
  5. using s: struct { lo, hi: u64 },
  6. all: i128,
  7. }
  8. @(private="file")
  9. ti_uint :: struct #raw_union {
  10. using s: struct { lo, hi: u64 },
  11. all: u128,
  12. }
  13. @(link_name="__ashlti3", linkage="strong")
  14. __ashlti3 :: proc "contextless" (a: i128, b: u32) -> i128 {
  15. bits :: 64
  16. input: ti_int = ---
  17. result: ti_int = ---
  18. input.all = a
  19. if b & bits != 0 {
  20. result.lo = 0
  21. result.hi = input.lo << (b-bits)
  22. } else {
  23. if b == 0 {
  24. return a
  25. }
  26. result.lo = input.lo<<b
  27. result.hi = (input.hi<<b) | (input.lo>>(bits-b))
  28. }
  29. return result.all
  30. }
  31. __ashlti3_unsigned :: proc "contextless" (a: u128, b: u32) -> u128 {
  32. return cast(u128)__ashlti3(cast(i128)a, b)
  33. }
  34. @(link_name="__mulddi3", linkage="strong")
  35. __mulddi3 :: proc "contextless" (a, b: u64) -> i128 {
  36. r: ti_int
  37. bits :: 32
  38. mask :: ~u64(0) >> bits
  39. r.lo = (a & mask) * (b & mask)
  40. t := r.lo >> bits
  41. r.lo &= mask
  42. t += (a >> bits) * (b & mask)
  43. r.lo += (t & mask) << bits
  44. r.hi = t >> bits
  45. t = r.lo >> bits
  46. r.lo &= mask
  47. t += (b >> bits) * (a & mask)
  48. r.lo += (t & mask) << bits
  49. r.hi += t >> bits
  50. r.hi += (a >> bits) * (b >> bits)
  51. return r.all
  52. }
  53. @(link_name="__multi3", linkage="strong")
  54. __multi3 :: proc "contextless" (a, b: i128) -> i128 {
  55. x, y, r: ti_int
  56. x.all = a
  57. y.all = b
  58. r.all = __mulddi3(x.lo, y.lo)
  59. r.hi += x.hi*y.lo + x.lo*y.hi
  60. return r.all
  61. }
  62. @(link_name="__udivti3", linkage="strong")
  63. udivti3 :: proc "c" (la, ha, lb, hb: u64) -> u128 {
  64. a, b: ti_uint
  65. a.lo, a.hi = la, ha
  66. b.lo, b.hi = lb, hb
  67. return udivmodti4(a.all, b.all, nil)
  68. }
  69. @(link_name="__lshrti3", linkage="strong")
  70. __lshrti3 :: proc "c" (a: i128, b: u32) -> i128 {
  71. bits :: 64
  72. input, result: ti_int
  73. input.all = a
  74. if b & bits != 0 {
  75. result.hi = 0
  76. result.lo = input.hi >> (b - bits)
  77. } else if b == 0 {
  78. return a
  79. } else {
  80. result.hi = input.hi >> b
  81. result.lo = (input.hi << (bits - b)) | (input.lo >> b)
  82. }
  83. return result.all
  84. }