gencall 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/bin/rc
  2. {switch($objtype){
  3. case mips
  4. echo TEXT $i'(SB)', 1, '$0'
  5. echo MOVW R1, '0(FP)'
  6. echo MOVW '$'$n, R1
  7. echo SYSCALL
  8. if(~ $i _SEEK || ~ $i nsec) {
  9. echo 'MOVW $-1,R5
  10. BNE R1,R5,4(PC)
  11. MOVW a+0(FP),R5
  12. MOVW R1,0(R5)
  13. MOVW R1,4(R5)'
  14. }
  15. echo RET
  16. case mips2
  17. echo TEXT $i'(SB)', 1, '$0'
  18. echo MOVW R1, '0(FP)'
  19. echo MOVW '$'$n, R1
  20. echo ADD '$4',R29
  21. echo SYSCALL
  22. echo ADD '$-4',R29
  23. echo RET
  24. case spim
  25. echo TEXT $i'(SB)', 1, '$0'
  26. echo MOVW R1, '0(FP)'
  27. echo MOVW '$'$n, R1
  28. echo ADD '$4',R29
  29. echo SYSCALL
  30. echo ADD '$-4',R29
  31. if(~ $i _SEEK || ~ $i nsec) { # untested so far - geoff
  32. echo 'MOVW $-1,R5
  33. BNE R1,R5,4(PC)
  34. MOVW a+0(FP),R5
  35. MOVW R1,0(R5)
  36. MOVW R1,4(R5)'
  37. }
  38. echo RET
  39. case 386
  40. echo TEXT $i'(SB)', 1, '$0'
  41. echo MOVL '$'$n, AX
  42. echo INT '$'64
  43. if(~ $i _SEEK || ~ $i nsec) {
  44. echo 'CMPL AX,$-1
  45. JNE 4(PC)
  46. MOVL a+0(FP),CX
  47. MOVL AX,0(CX)
  48. MOVL AX,4(CX)'
  49. }
  50. echo RET
  51. case amd64
  52. if(~ $i _SEEK)
  53. echo TEXT __SEEK'(SB)', 1, '$0'
  54. if not
  55. echo TEXT $i'(SB)', 1, '$0'
  56. #
  57. # For architectures which pass the first argument
  58. # in a register, if the system call takes no arguments
  59. # there will be no 'a0+0(FP)' reserved on the stack.
  60. #
  61. if(! ~ $i nsec)
  62. echo MOVQ RARG, 'a0+0(FP)'
  63. echo MOVQ '$'$n, RARG
  64. echo SYSCALL
  65. echo RET
  66. case sparc
  67. echo TEXT $i'(SB)', 1, '$0'
  68. echo MOVW R7, '0(FP)'
  69. echo MOVW '$'$n, R7
  70. echo TA R0
  71. if(~ $i _SEEK || ~ $i nsec) {
  72. echo 'CMP R7,$-1
  73. BNE 4(PC)
  74. MOVW a+0(FP),R8
  75. MOVW R7,0(R8)
  76. MOVW R7,4(R8)'
  77. }
  78. echo RETURN
  79. case arm
  80. echo TEXT $i'(SB)', 1, '$0'
  81. echo MOVW R0, '0(FP)'
  82. echo MOVW '$'$n, R0
  83. echo SWI 0
  84. if(~ $i _SEEK || ~ $i nsec) {
  85. echo 'CMP $-1,R0
  86. BNE 4(PC)
  87. MOVW a+0(FP),R1
  88. MOVW R0,0(R1)
  89. MOVW R0,4(R1)'
  90. }
  91. echo RET
  92. case power
  93. echo TEXT $i'(SB)', 1, '$0'
  94. echo MOVW R3, '0(FP)'
  95. echo MOVW '$'$n, R3
  96. echo SYSCALL
  97. if(~ $i _SEEK || ~ $i nsec) {
  98. echo 'CMP R3,$-1
  99. BNE 4(PC)
  100. MOVW a+0(FP),R8
  101. MOVW R3,0(R8)
  102. MOVW R3,4(R8)'
  103. }
  104. echo RETURN
  105. case power64
  106. if(~ $i _SEEK)
  107. echo TEXT __SEEK'(SB)', 1, '$0'
  108. if not
  109. echo TEXT $i'(SB)', 1, '$0'
  110. echo MOVD R3, '0(FP)'
  111. echo MOVW '$'$n, R3
  112. echo SYSCALL
  113. echo RETURN
  114. }} > $i.s
  115. $AS $i.s