c-arith.scm 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Mike Sperber, Marcus Crestani
  3. (define-local-syntax (define-c-arith-binop-generator id c-op)
  4. `(define-c-generator ,id #t
  5. (lambda (call port indent)
  6. (simple-c-primop ,c-op call port))))
  7. (define-c-arith-binop-generator + "+")
  8. (define-c-arith-binop-generator - "-")
  9. (define-c-arith-binop-generator * "*")
  10. (define-c-arith-binop-generator quotient "/")
  11. (define-c-arith-binop-generator un+ "+")
  12. (define-c-arith-binop-generator un- "-")
  13. (define-c-arith-binop-generator un* "*")
  14. (define-c-arith-binop-generator unquotient "/")
  15. (define-c-arith-binop-generator fl+ "+")
  16. (define-c-arith-binop-generator fl- "-")
  17. (define-c-arith-binop-generator fl* "*")
  18. (define-c-arith-binop-generator fl/ "/")
  19. (define-c-generator small* #t
  20. (lambda (call port indent)
  21. (format port "PS_SMALL_MULTIPLY(")
  22. (c-value (call-arg call 0) port)
  23. (format port ", ")
  24. (c-value (call-arg call 1) port)
  25. (format port ")")))
  26. (define-c-arith-binop-generator remainder "%")
  27. (define-c-arith-binop-generator unremainder "%")
  28. (define-c-arith-binop-generator bitwise-and "&")
  29. (define-c-arith-binop-generator bitwise-ior "|")
  30. (define-c-arith-binop-generator bitwise-xor "^")
  31. (define-c-generator ashl #t
  32. (lambda (call port indent)
  33. (generate-shift call port indent "LEFT" "<<" #f)))
  34. (define-c-generator ashr #t
  35. (lambda (call port indent)
  36. (generate-shift call port indent "RIGHT" ">>" #f)))
  37. (define-c-generator lshr #t
  38. (lambda (call port indent)
  39. (generate-shift call port indent "RIGHT_LOGICAL" ">>" #t)))
  40. (define (generate-shift call port indent macro c-op logical?)
  41. (cond ((= 1 (call-exits call))
  42. ; PS_SHIFT_??? is a C macro that handles overshifting even if C doesn't
  43. (indent-to port indent)
  44. (format port "PS_SHIFT_~A(" macro)
  45. (if logical? (format port "(unsigned long)"))
  46. (c-value (call-arg call 1) port)
  47. (format port ", ")
  48. (c-value (call-arg call 2) port)
  49. (format port ", ")
  50. (c-variable (car (lambda-variables (call-arg call 0))) port)
  51. (format port ")"))
  52. ((and (literal-node? (call-arg call 1))
  53. (>= (literal-value (call-arg call 1)) pre-scheme-integer-size))
  54. (format port "0L"))
  55. (else
  56. (if logical?
  57. (format port "(long)(((unsigned long)")
  58. (format port "(("))
  59. (c-value (call-arg call 0) port)
  60. (format port ")~A" c-op)
  61. (c-value (call-arg call 1) port)
  62. (format port ")"))))
  63. (define-c-generator bitwise-not #t
  64. (lambda (call port indent)
  65. (simple-c-primop "~" call port)))
  66. (define-local-syntax (define-c-comp-binop-generator id c-op)
  67. `(define-c-generator ,id #t
  68. (lambda (call port indent)
  69. (simple-c-primop ,c-op call port))))
  70. (define-c-comp-binop-generator = "==")
  71. (define-c-comp-binop-generator < "<" )
  72. (define-c-comp-binop-generator fl= "==")
  73. (define-c-comp-binop-generator fl< "<" )
  74. (define-c-comp-binop-generator un= "==")
  75. (define-c-comp-binop-generator un< "<" )
  76. (define-c-comp-binop-generator char=? "==")
  77. (define-c-comp-binop-generator char<? "<" )
  78. (define-c-generator ascii->char #t
  79. (lambda (call port indent)
  80. (display "((char) " port)
  81. (c-value (call-arg call 0) port)
  82. (display ")" port)))
  83. (define-c-generator char->ascii #t
  84. (lambda (call port indent)
  85. (display "((unsigned char) " port)
  86. (c-value (call-arg call 0) port)
  87. (display ")" port)))
  88. (define-c-generator unsigned->integer #t
  89. (lambda (call port indent)
  90. (display "((long) " port)
  91. (c-value (call-arg call 0) port)
  92. (display ")" port)))
  93. (define-c-generator integer->unsigned #t
  94. (lambda (call port indent)
  95. (display "((unsigned long) " port)
  96. (c-value (call-arg call 0) port)
  97. (display ")" port)))
  98. ;(define-c-generator sign-extend #t
  99. ; (lambda (call port indent)
  100. ; (display "((long) " port)
  101. ; (c-value (call-arg call 0) port)
  102. ; (display ")" port)))
  103. ;
  104. ;(define-c-generator zero-extend #t
  105. ; (lambda (call port indent)
  106. ; (display "((unsigned long) " port)
  107. ; (c-value (call-arg call 0) port)
  108. ; (display ")" port)))