From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42471) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fXTLV-0001CB-TO for qemu-devel@nongnu.org; Mon, 25 Jun 2018 11:24:03 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fXTLS-0006lN-Pi for qemu-devel@nongnu.org; Mon, 25 Jun 2018 11:24:01 -0400 In-Reply-To: References: <20180623022258.22158-1-programmingkidx@gmail.com> <1E63C3B2-7668-4D05-BC43-02E478FB493B@gmail.com> <4CC477CD-237F-480D-B9B5-B35FF507BD3C@gmail.com> <2CAC99CF-A717-4A94-A68C-EEB76C727F87@gmail.com> Mime-Version: 1.0 (Apple Message framework v753.1) Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed Message-Id: Content-Transfer-Encoding: 7bit From: G 3 Date: Mon, 25 Jun 2018 11:23:54 -0400 Subject: Re: [Qemu-devel] [PATCH] fix fdiv instruction List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Richard Henderson , David Gibson Cc: QEMU Developers , "list@suse.de:PowerPC list:PowerPC" On Jun 24, 2018, at 11:47 PM, Richard Henderson wrote: > On 06/24/2018 11:38 AM, Programmingkid wrote: >> void test_division_by_zero() >> { >> Converter c; >> uint64_t expected_answer = 0x0; >> uint32_t actual_fpscr, expected_fpscr = 0xc4000010; >> reset_fpscr(); >> set_fpscr_bit(ZE); >> asm volatile("fdiv %0, %1, %2" : "=f"(c.d) : "f"(1.0), "f"(0.0)); > > Try > > uint64_t expected_answer = 0xffff0000deadbeef; > ... > c.i = expected_answer; > asm volatile("fdiv %0, %1, %2" : "+f"(c.d) : "f"(1.0), "f"(0.0)); > > to avoid depending on uninitialized data. (This expected value is > an SNaN with a deadbeef marker Just to be Sure.) > > > r~ Ok I made this program and tried it on my iMac G5 (PowerPC 970). #include #include #include // Used to convert unsigned integer <--> double union Converter { double d; uint64_t i; }; typedef union Converter Converter; int main (int argc, const char * argv[]) { Converter answer; answer.i = 0xffff0000deadbeef; //asm volatile("mtfsb1 27"); /* Set ZE bit */ asm volatile("fdiv %0, %1, %2" : "=f"(answer.d) : "f"(1.0), "f"(0.0)); printf("answer = 0x%" PRIx64 "\n", answer.i); return 0; } The result was the same. When the FPSCR[ZE] bit is set, the answer is 0x0. When the FPSCR[ZE] bit is not set, the answer is 0x7ff0000000000000. This seems to be an undocumented feature.