conaddr.ssa 1.2 KB

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