Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!sei.cmu.edu!fs7.ece.cmu.edu!o.gp.cs.cmu.edu!pt.cs.cmu.edu!cogswell From: cogswell@MEAT.cs.cmu.edu (Bryce Cogswell) Newsgroups: comp.arch Subject: Re: Is double->int slow? Message-ID: Date: 14 Jun 91 16:36:57 GMT References: <1991Jun10.220533.19560@jetsun.weitek.COM> <1991Jun12.014037.26495@cl.cam.ac.uk> <3698@charon.cwi.nl> Distribution: comp Organization: Carnegie Mellon University Lines: 37 In-reply-to: dik@cwi.nl's message of 14 Jun 91 00:54:22 GMT I count 16 instructions used to perform the double -> int conversion on the RS/6000: 4 are used for +/- checking and compensation. 4 are used for range checking. 4 are used to manipulate the FP status register. 4 are used to truncate and move the number to an integer register. The cc compiler calls a subroutine to perform the conversion, so the actual number of instructions required in C is larger. As long as I'm wasting bandwidth on this, here is the code sequence: The double value is initially in f1. r2 and r6 point to memory containing constants. c6 and c0 are condition code registers. lfs f0,12(r2) f0 <- 0.0 fcmpu c6,f1,f0 c6 <- f1 ? f0 [X >= 0] l r6,16(r2) r6 <- 0x10000778 fabs f5,f1 f5 <- abs( f1 ) lfd f2,8(r6) f2 <- 2^31 mffs f4 f4 <- floating status fcmpu c0,f5,f2 c0 <- f5 ? f2 lfd f3,0(r6) f3 <- 4512395720392704.0 bc 12,24,L2 branch if c6 less than [X negative] mtfsb1 30 set floating status bit 30 mtfsb1 31 (re)set floating status bit 31 fa f6,f1,f3 f6 <- f1 + f3 [truncates value] stfd f6,-8(r1) mem <- f6 mtfsf 1,f4 floating status <- f4 bc 4,0,L3 branch if c0 greater than [X out of range] l r3,-4(r1) r3 <- mem If the double is negative a similar sequence of instructions is executed, except that bit 31 of the status register is reset rather than set. -- Bryce