1acc79aa0SYi Kong //===----- lib/i386/fp_mode.c - Floaing-point mode utilities -----*- C -*-====// 2acc79aa0SYi Kong // 3acc79aa0SYi Kong // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4acc79aa0SYi Kong // See https://llvm.org/LICENSE.txt for license information. 5acc79aa0SYi Kong // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6acc79aa0SYi Kong // 7acc79aa0SYi Kong //===----------------------------------------------------------------------===// 8acc79aa0SYi Kong 9acc79aa0SYi Kong #include "../fp_mode.h" 10acc79aa0SYi Kong 11acc79aa0SYi Kong #define X87_TONEAREST 0x0000 12acc79aa0SYi Kong #define X87_DOWNWARD 0x0400 13acc79aa0SYi Kong #define X87_UPWARD 0x0800 14acc79aa0SYi Kong #define X87_TOWARDZERO 0x0c00 15acc79aa0SYi Kong #define X87_RMODE_MASK (X87_TONEAREST | X87_UPWARD | X87_DOWNWARD | X87_TOWARDZERO) 16acc79aa0SYi Kong __fe_getround(void)17*bdbfaf0cSAaron BallmanCRT_FE_ROUND_MODE __fe_getround(void) { 18acc79aa0SYi Kong // Assume that the rounding mode state for the fpu agrees with the SSE unit. 19acc79aa0SYi Kong unsigned short cw; 20acc79aa0SYi Kong __asm__ __volatile__ ("fnstcw %0" : "=m" (cw)); 21acc79aa0SYi Kong 22acc79aa0SYi Kong switch (cw & X87_RMODE_MASK) { 23acc79aa0SYi Kong case X87_TONEAREST: 24ed0bf875SAlex Richardson return CRT_FE_TONEAREST; 25acc79aa0SYi Kong case X87_DOWNWARD: 26ed0bf875SAlex Richardson return CRT_FE_DOWNWARD; 27acc79aa0SYi Kong case X87_UPWARD: 28ed0bf875SAlex Richardson return CRT_FE_UPWARD; 29acc79aa0SYi Kong case X87_TOWARDZERO: 30ed0bf875SAlex Richardson return CRT_FE_TOWARDZERO; 31acc79aa0SYi Kong } 32ed0bf875SAlex Richardson return CRT_FE_TONEAREST; 33acc79aa0SYi Kong } 34acc79aa0SYi Kong __fe_raise_inexact(void)35*bdbfaf0cSAaron Ballmanint __fe_raise_inexact(void) { 36acc79aa0SYi Kong float f = 1.0f, g = 3.0f; 37acc79aa0SYi Kong __asm__ __volatile__ ("fdivs %1" : "+t" (f) : "m" (g)); 38acc79aa0SYi Kong return 0; 39acc79aa0SYi Kong } 40