procs_wasm.odin 809 B

12345678910111213141516171819202122232425262728293031323334353637383940
  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. @(link_name="__ashlti3", linkage="strong")
  9. __ashlti3 :: proc "contextless" (a: i128, b_: u32) -> i128 {
  10. bits_in_dword :: size_of(u32)*8
  11. b := u32(b_)
  12. input, result: ti_int
  13. input.all = a
  14. if b & bits_in_dword != 0 {
  15. result.lo = 0
  16. result.hi = input.lo << (b-bits_in_dword)
  17. } else {
  18. if b == 0 {
  19. return a
  20. }
  21. result.lo = input.lo<<b
  22. result.hi = (input.hi<<b) | (input.lo>>(bits_in_dword-b))
  23. }
  24. return result.all
  25. }
  26. @(link_name="__multi3", linkage="strong")
  27. __multi3 :: proc "contextless" (a, b: i128) -> i128 {
  28. x, y, r: ti_int
  29. x.all = a
  30. y.all = b
  31. r.all = i128(x.lo * y.lo) // TODO this is incorrect
  32. r.hi += x.hi*y.lo + x.lo*y.hi
  33. return r.all
  34. }