setops.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. // SPDX-License-Identifier: GPL-2.0 or GPL-3.0
  2. // Copyright © 2019 Ariadne Devos
  3. #include <stddef.h>
  4. #include <stdint.h>
  5. #include <sHT/test.h>
  6. #include <sHT/index.h>
  7. #include <sHT/string/setops.h>
  8. #include <string.h>
  9. void
  10. sHT_memcpy16_r2(uint16_t dest[], uint16_t from[], size_t e0, size_t b0, size_t b1)
  11. {
  12. size_t e1 = b1 + (e0 - b0);
  13. size_t i0 = b0;
  14. size_t i1 = b1;
  15. if (sHT_ge(i0, e0))
  16. return;
  17. /*@ loop invariant i0NS: b0 <= i0 < e0;
  18. loop invariant i1NS: i1 - i0 == b1 - b0;
  19. loop invariant dest_sNS: \initialized(dest + (b0 .. i0 - 1));
  20. loop invariant copyINS: memeq16{Here,Here}(dest + b0, from + b1, i0 - b0);
  21. // loop assignsS dest[0 .. e0 - 1];
  22. loop assigns i0, i1, dest[b0 .. e0 - 1];
  23. loop variant e0 - i0; */
  24. do { i0 = sHT_index_nospec(i0, e0);
  25. i1 = sHT_index_nospec(i1, e1);
  26. dest[i0] = from[i1];
  27. i0++, i1++;
  28. } while (sHT_lt(i0, e0));
  29. }
  30. void
  31. sHT_bzero16_r1(uint16_t dest[], size_t e, size_t b)
  32. {
  33. /* TODO: X86 has a CISC instruction to do approximately this */
  34. if (sHT_ge(b, e))
  35. return;
  36. size_t i = b;
  37. /*@ loop invariant iNS: b <= i < e;
  38. loop invariant zeroINS: bzero16{Here}(dest + b, i - b);
  39. // loop assigns dest[0 .. e - 1]
  40. loop assigns i, dest[b .. e - 1];
  41. loop variant e - i; */
  42. do { dest[i = sHT_index_nospec(i, e)] = 0;
  43. i++;
  44. } while (sHT_lt(i, e));
  45. }