TEXT    asin(SB), $0
       FMOVD   a+0(FP), F0     /* a */
       FMOVD   F0, F0          /* a,a */
       FMULD   F0, F0          /* a*a,a */
       FLD1                    /* 1,a*a,a */
       FSUBRDP F0, F1          /* 1-a*a,a */

       FTST
       WAIT
       FSTSW   AX
       SAHF
       JLO     bad

       FSQRT                   /* sqrt(1-a*a),a */
       FPATAN                  /* atan2(sqrt(1-a*a),a) */
       RET

TEXT    acos(SB), $0
       FMOVD   a+0(FP), F0
       FMOVD   F0, F0
       FMULD   F0, F0
       FLD1
       FSUBRDP F0, F1

       FTST
       WAIT
       FSTSW   AX
       SAHF
       JLO     bad

       FSQRT
       FXCHD   F0, F1          /* identical except this */
       FPATAN
       RET

bad:
       FMOVDP  F0, F0
       FMOVDP  F0, F0
       CALL    NaN(SB)
       RET