File:  [MW Coherent from dump] / coherent / b / lib / libm / i8087 / ceil87.m
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Wed May 29 04:56:35 2019 UTC (7 years ago) by root
Branches: MarkWilliams, MAIN
CVS tags: relic, HEAD
coherent

//////////
/ libm 8087
/ ceil(d), floor(d)
//////////

#include "larges.h"
#include "ifno8087.h"

	.globl	ceil_
	.globl	floor_
	.globl	floor

//////////
/ double
/ ceil(d)
/ double d;
//////////

cwup	=	0xBFF		/ round up 8087 control word
d	=	2+RASIZE		/ arg offset

ceil_:
	ifno8087(_ceil_)
	push	bp
	mov	bp, sp

	fdld	d(bp)		/ Load argument d.
	mov	ax, $cwup	/ Round up control word to AX.
	jmp	1f

//////////
/ double
/ floor(d)
/ double d;
/
/ floor() rounds 8087 stacktop down to the int below.
/ It saves and restores the current 8087 control word.
//////////

cwdown	=	0x7FF		/ round down 8087 control word
d	=	2+RASIZE	/ arg offset
autos	=	4		/ auto space needed
oldcw	=	-2		/ saved 8087 control word
newcw	=	-4		/ new 8087 control word

floor_:
	ifno8087(_floor_)
	push	bp
	mov	bp, sp

	fdld	d(bp)		/ Load argument d.
	jmp	0f

floor:				/ d
	push	bp
	mov	bp, sp

0:	mov	ax, $cwdown	/ Round down control word to AX.

1:	sub	sp, $autos	/ Claim two words of auto space.

	mov	newcw(bp), ax	/ Store new control word.
	fstcw	oldcw(bp)	/ Save old control word.
	fldcw	newcw(bp)	/ Load new control word.
	frndint			/ int(d)
	fldcw	oldcw(bp)	/ Restore saved control word.

	mov	sp, bp
	pop	bp
	Gret

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.