conaddr.ssa 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # test amd64 addressing modes
  2. export
  3. function w $f0(l %o) {
  4. @start
  5. %addr =l add $a, %o
  6. %char =w loadub %addr
  7. ret %char
  8. }
  9. export
  10. function w $f1(l %o) {
  11. @start
  12. %o1 =l mul %o, 1
  13. %addr =l add 10, %o1
  14. %char =w loadub %addr
  15. ret %char
  16. }
  17. export
  18. function w $f2(l %o1, l %o2) {
  19. @start
  20. %o22 =l mul %o2, 2
  21. %o =l add %o1, %o22
  22. %addr =l add $a, %o
  23. %char =w loadub %addr
  24. ret %char
  25. }
  26. export
  27. function l $f3(l %o) {
  28. @start
  29. %addr =l add %o, $a
  30. ret %addr
  31. }
  32. export
  33. function $f4() {
  34. @start
  35. storel $p, $p
  36. ret
  37. }
  38. export
  39. function $writeto0() {
  40. @start
  41. storel 0, 0
  42. ret
  43. }
  44. # >>> driver
  45. # #include <stdlib.h>
  46. # #include <signal.h>
  47. # char a[] = "qbe rocks";
  48. # void *p;
  49. # int ok;
  50. # extern unsigned f0(long), f1(long), f2(long, long);
  51. # extern char *f3(long);
  52. # extern void f4(), writeto0();
  53. # void h(int sig, siginfo_t *si, void *unused) {
  54. # ok += si->si_addr == 0;
  55. # exit(!(ok == 6));
  56. # }
  57. # int main() {
  58. # struct sigaction sa = {.sa_flags=SA_SIGINFO, .sa_sigaction=h};
  59. # sigemptyset(&sa.sa_mask); sigaction(SIGSEGV, &sa, 0);
  60. # ok += f0(2) == 'e';
  61. # ok += f1((long)a-5) == 'o';
  62. # ok += f2(4, 2) == 's';
  63. # ok += *f3(0) == 'q';
  64. # f4();
  65. # ok += p == &p;
  66. # writeto0(); /* will segfault */
  67. # }
  68. # <<<