Raymond Toy pushed to branch issue-425-correctly-rounded-math-functions at cmucl / cmucl

Commits:

5 changed files:

Changes:

  • src/code/irrat.lisp
    ... ... @@ -63,6 +63,8 @@
    63 63
     
    
    64 64
     ;;; Please refer to the Unix man pages for details about these routines.
    
    65 65
     
    
    66
    +#+core-math
    
    67
    +(progn
    
    66 68
     ;;; Trigonometric.
    
    67 69
     (def-math-rtn ("cr_sin" %sin) 1)
    
    68 70
     (def-math-rtn ("cr_cos" %cos) 1)
    
    ... ... @@ -91,6 +93,39 @@
    91 93
     
    
    92 94
     (def-math-rtn ("cr_log1p" %log1p) 1)
    
    93 95
     (def-math-rtn ("cr_expm1" %expm1) 1)
    
    96
    +)
    
    97
    +
    
    98
    +#-core-math
    
    99
    +(progn
    
    100
    +;;; Trigonometric.
    
    101
    +(def-math-rtn ("fdlibm_sin" %sin) 1)
    
    102
    +(def-math-rtn ("fdlibm_cos" %cos) 1)
    
    103
    +(def-math-rtn ("fdlibm_tan" %tan) 1)
    
    104
    +(def-math-rtn ("fdlibm_atan" %atan) 1)
    
    105
    +(def-math-rtn ("__ieee754_atan2" %atan2) 2)
    
    106
    +(def-math-rtn ("__ieee754_asin" %asin) 1)
    
    107
    +(def-math-rtn ("__ieee754_acos" %acos) 1)
    
    108
    +(def-math-rtn ("__ieee754_sinh" %sinh) 1)
    
    109
    +(def-math-rtn ("__ieee754_cosh" %cosh) 1)
    
    110
    +(def-math-rtn ("fdlibm_tanh" %tanh) 1)
    
    111
    +(def-math-rtn ("fdlibm_asinh" %asinh) 1)
    
    112
    +(def-math-rtn ("__ieee754_acosh" %acosh) 1)
    
    113
    +(def-math-rtn ("__ieee754_atanh" %atanh) 1)
    
    114
    +
    
    115
    +;;; Exponential and Logarithmic.
    
    116
    +(def-math-rtn ("__ieee754_exp" %exp) 1)
    
    117
    +(def-math-rtn ("__ieee754_log" %log) 1)
    
    118
    +(def-math-rtn ("__ieee754_log10" %log10) 1)
    
    119
    +(def-math-rtn ("cmucl_log2" %log2) 1)
    
    120
    +
    
    121
    +(def-math-rtn ("__ieee754_pow" %pow) 2)
    
    122
    +#-(or x86 sparc-v7 sparc-v8 sparc-v9)
    
    123
    +(def-math-rtn "sqrt" 1)
    
    124
    +(def-math-rtn ("hypot" %hypot) 2)
    
    125
    +
    
    126
    +(def-math-rtn ("fdlibm_log1p" %log1p) 1)
    
    127
    +(def-math-rtn ("fdlibm_expm1" %expm1) 1)
    
    128
    +)
    
    94 129
     
    
    95 130
     (declaim (inline %scalbn))
    
    96 131
     (export '%scalbn)
    

  • src/code/linux-os.lisp
    ... ... @@ -25,6 +25,7 @@
    25 25
     (register-lisp-feature :linux)
    
    26 26
     (register-lisp-feature :elf)
    
    27 27
     (register-lisp-runtime-feature :executable)
    
    28
    +(register-lisp-runtime-feature :core-math)
    
    28 29
     
    
    29 30
     (setq *software-type* "Linux")
    
    30 31
     
    

  • src/compiler/x86/sse2-c-call.lisp
    ... ... @@ -36,22 +36,29 @@
    36 36
     		   :from :eval :to :result) edx)
    
    37 37
       (:temporary (:sc single-stack) temp-single)
    
    38 38
       (:temporary (:sc double-stack) temp-double)
    
    39
    +  #+core-math
    
    39 40
       (:temporary (:sc unsigned-stack) save-fpu-cw)
    
    41
    +  #+core-math
    
    40 42
       (:temporary (:sc unsigned-stack) fpu-cw)
    
    43
    +  #+core-math
    
    44
    +  (:temporary (:sc unsigned-reg) temp-cw)
    
    41 45
       (:node-var node)
    
    42 46
       (:vop-var vop)
    
    43 47
       (:save-p t)
    
    44
    -  (:ignore args ecx #+nil edx)
    
    48
    +  (:ignore args ecx edx)
    
    45 49
       (:guard (backend-featurep :sse2))
    
    46 50
       (:generator 0
    
    47
    -    ;; Save the x87 FPU control word.  Then modify it to set the
    
    48
    -    ;; precision bits to double (2).
    
    49
    -    (inst fnstcw save-fpu-cw)
    
    50
    -    (move edx save-fpu-cw)
    
    51
    -    (inst and edx (dpb 0 (byte 2 8) #xffff))	; Zap the precision control bits
    
    52
    -    (inst or edx (dpb 2 (byte 2 8) 0))		; Set precision control to double
    
    53
    -    (move fpu-cw edx)
    
    54
    -    (inst fldcw fpu-cw)			; New CW
    
    51
    +    #+core-math
    
    52
    +    (progn
    
    53
    +      ;; Save the x87 FPU control word.  Then modify it to set the
    
    54
    +      ;; precision bits to double (2).
    
    55
    +      (inst fnstcw save-fpu-cw)
    
    56
    +      (move temp-cw save-fpu-cw)
    
    57
    +      (inst and temp-cw (dpb 0 (byte 2 8) #xffff)) ; Zap the precision control bits
    
    58
    +      (inst or temp-cw (dpb 2 (byte 2 8) 0)) ; Set precision control to double
    
    59
    +      (move fpu-cw temp-cw)
    
    60
    +      (inst fldcw fpu-cw)		; New CW
    
    61
    +      )
    
    55 62
     
    
    56 63
         (cond ((policy node (> space speed))
    
    57 64
     	   (move eax function)
    
    ... ... @@ -76,6 +83,7 @@
    76 83
     	 (inst fstpd (ea-for-df-stack temp-double))
    
    77 84
     	 (inst movsd xmm0-tn (ea-for-df-stack temp-double)))))
    
    78 85
         ;; Restore the x87 FPU control settings
    
    86
    +    #+core-math
    
    79 87
         (inst fldcw save-fpu-cw)))
    
    80 88
     
    
    81 89
     (define-vop (alloc-number-stack-space)
    

  • src/lisp/Config.x86_common
    ... ... @@ -36,6 +36,36 @@ ifdef FEATURE_ELF
    36 36
     CPP_DEFINE_OPTIONS += -DFEATURE_ELF
    
    37 37
     endif
    
    38 38
     
    
    39
    +# If core-math feature is set, we use core-math routines for the
    
    40
    +# special functions.
    
    41
    +
    
    42
    +ifdef FEATURE_CORE_MATH
    
    43
    +CORE_MATH_64=core-math/src/binary64
    
    44
    +
    
    45
    +CORE64_OBJS=\
    
    46
    +	$(CORE_MATH_64)/sin/sin.o \
    
    47
    +	$(CORE_MATH_64)/cos/cos.o \
    
    48
    +	$(CORE_MATH_64)/tan/tan.o \
    
    49
    +	$(CORE_MATH_64)/atan2/atan2.o \
    
    50
    +	$(CORE_MATH_64)/asin/asin.o \
    
    51
    +	$(CORE_MATH_64)/acos/acos.o \
    
    52
    +	$(CORE_MATH_64)/atan/atan.o \
    
    53
    +	$(CORE_MATH_64)/sinh/sinh.o \
    
    54
    +	$(CORE_MATH_64)/cosh/cosh.o \
    
    55
    +	$(CORE_MATH_64)/tanh/tanh.o \
    
    56
    +	$(CORE_MATH_64)/asinh/asinh.o \
    
    57
    +	$(CORE_MATH_64)/acosh/acosh.o \
    
    58
    +	$(CORE_MATH_64)/atanh/atanh.o \
    
    59
    +	$(CORE_MATH_64)/exp/exp.o \
    
    60
    +	$(CORE_MATH_64)/log/log.o \
    
    61
    +	$(CORE_MATH_64)/log10/log10.o \
    
    62
    +	$(CORE_MATH_64)/log2/log2.o \
    
    63
    +	$(CORE_MATH_64)/pow/pow.o \
    
    64
    +	$(CORE_MATH_64)/hypot/hypot.o \
    
    65
    +	$(CORE_MATH_64)/log1p/log1p.o \
    
    66
    +	$(CORE_MATH_64)/expm1/expm1.o
    
    67
    +endif
    
    68
    +
    
    39 69
     ifeq ($(filter 2% 3%, $(shell $(CC) -dumpversion)),)
    
    40 70
     CPP_INCLUDE_OPTIONS := -iquote . -iquote $(PATH1)
    
    41 71
     else
    

  • src/lisp/GNUmakefile
    ... ... @@ -36,30 +36,6 @@ SRCS = lisp.c coreparse.c alloc.c monitor.c print.c interr.c \
    36 36
     	runprog.c time.c case-mapping.c exec-init.c \
    
    37 37
     	${FDLIBM} ${ARCH_SRC} ${ASSEM_SRC} ${OS_SRC} ${GC_SRC}
    
    38 38
     
    
    39
    -CORE_MATH_64=core-math/src/binary64
    
    40
    -
    
    41
    -CORE64_OBJS=\
    
    42
    -	$(CORE_MATH_64)/sin/sin.o \
    
    43
    -	$(CORE_MATH_64)/cos/cos.o \
    
    44
    -	$(CORE_MATH_64)/tan/tan.o \
    
    45
    -	$(CORE_MATH_64)/atan2/atan2.o \
    
    46
    -	$(CORE_MATH_64)/asin/asin.o \
    
    47
    -	$(CORE_MATH_64)/acos/acos.o \
    
    48
    -	$(CORE_MATH_64)/atan/atan.o \
    
    49
    -	$(CORE_MATH_64)/sinh/sinh.o \
    
    50
    -	$(CORE_MATH_64)/cosh/cosh.o \
    
    51
    -	$(CORE_MATH_64)/tanh/tanh.o \
    
    52
    -	$(CORE_MATH_64)/asinh/asinh.o \
    
    53
    -	$(CORE_MATH_64)/acosh/acosh.o \
    
    54
    -	$(CORE_MATH_64)/atanh/atanh.o \
    
    55
    -	$(CORE_MATH_64)/exp/exp.o \
    
    56
    -	$(CORE_MATH_64)/log/log.o \
    
    57
    -	$(CORE_MATH_64)/log10/log10.o \
    
    58
    -	$(CORE_MATH_64)/log2/log2.o \
    
    59
    -	$(CORE_MATH_64)/pow/pow.o \
    
    60
    -	$(CORE_MATH_64)/hypot/hypot.o \
    
    61
    -	$(CORE_MATH_64)/log1p/log1p.o \
    
    62
    -	$(CORE_MATH_64)/expm1/expm1.o
    
    63 39
     
    
    64 40
     OBJS = $(patsubst %.c,%.o,$(patsubst %.S,%.o,$(patsubst %.s,%.o,$(SRCS))))
    
    65 41