procs_wasm.odin 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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" (la, ha: u64, b_: u32) -> i128 {
  15. bits_in_dword :: size_of(u32)*8
  16. b := u32(b_)
  17. input, result: ti_int
  18. input.lo, input.hi = la, ha
  19. if b & bits_in_dword != 0 {
  20. result.lo = 0
  21. result.hi = input.lo << (b-bits_in_dword)
  22. } else {
  23. if b == 0 {
  24. return input.all
  25. }
  26. result.lo = input.lo<<b
  27. result.hi = (input.hi<<b) | (input.lo>>(bits_in_dword-b))
  28. }
  29. return result.all
  30. }
  31. @(link_name="__multi3", linkage="strong")
  32. __multi3 :: proc "contextless" (la, ha, lb, hb: u64) -> i128 {
  33. x, y, r: ti_int
  34. x.lo, x.hi = la, ha
  35. y.lo, y.hi = lb, hb
  36. r.all = i128(x.lo * y.lo) // TODO this is incorrect
  37. r.hi += x.hi*y.lo + x.lo*y.hi
  38. return r.all
  39. }
  40. @(link_name="__udivti3", linkage="strong")
  41. udivti3 :: proc "c" (la, ha, lb, hb: u64) -> u128 {
  42. a, b: ti_uint
  43. a.lo, a.hi = la, ha
  44. b.lo, b.hi = lb, hb
  45. return udivmodti4(a.all, b.all, nil)
  46. }