Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. //
  21. // sys_wina.s
  22. // x86 assembly-language Win-dependent routines.
  23.  
  24. #define GLQUAKE 1       // don't include unneeded defs
  25. #include "asm_i386.h"
  26. #include "quakeasm.h"
  27.  
  28. // LATER should be id386-dependent, and have an equivalent C path
  29.  
  30.         .data
  31.  
  32.         .align  4
  33. fpenv:
  34.         .long   0, 0, 0, 0, 0, 0, 0, 0
  35.  
  36.         .text
  37.  
  38. .globl C(MaskExceptions)
  39. C(MaskExceptions):
  40.         fnstenv fpenv
  41.         orl             $0x3F,fpenv
  42.         fldenv  fpenv
  43.  
  44.         ret
  45.  
  46. #if 0
  47. .globl C(unmaskexceptions)
  48. C(unmaskexceptions):
  49.         fnstenv fpenv
  50.         andl            $0xFFFFFFE0,fpenv
  51.         fldenv  fpenv
  52.  
  53.         ret
  54. #endif
  55.  
  56.         .data
  57.  
  58.         .align  4
  59. .globl  ceil_cw, single_cw, full_cw, cw, pushed_cw
  60. ceil_cw:        .long   0
  61. single_cw:      .long   0
  62. full_cw:        .long   0
  63. cw:                     .long   0
  64. pushed_cw:      .long   0
  65.  
  66.         .text
  67.  
  68. .globl C(Sys_LowFPPrecision)
  69. C(Sys_LowFPPrecision):
  70.         fldcw   single_cw
  71.  
  72.         ret
  73.  
  74. .globl C(Sys_HighFPPrecision)
  75. C(Sys_HighFPPrecision):
  76.         fldcw   full_cw
  77.  
  78.         ret
  79.  
  80. .globl C(Sys_PushFPCW_SetHigh)
  81. C(Sys_PushFPCW_SetHigh):
  82.         fnstcw  pushed_cw
  83.         fldcw   full_cw
  84.  
  85.         ret
  86.  
  87. .globl C(Sys_PopFPCW)
  88. C(Sys_PopFPCW):
  89.         fldcw   pushed_cw
  90.  
  91.         ret
  92.  
  93. .globl C(Sys_SetFPCW)
  94. C(Sys_SetFPCW):
  95.         fnstcw  cw
  96.         movl    cw,%eax
  97. #if     id386
  98.         andb    $0xF0,%ah
  99.         orb             $0x03,%ah       // round mode, 64-bit precision
  100. #endif
  101.         movl    %eax,full_cw
  102.  
  103. #if     id386
  104.         andb    $0xF0,%ah
  105.         orb             $0x0C,%ah       // chop mode, single precision
  106. #endif
  107.         movl    %eax,single_cw
  108.  
  109. #if     id386
  110.         andb    $0xF0,%ah
  111.         orb             $0x08,%ah       // ceil mode, single precision
  112. #endif
  113.         movl    %eax,ceil_cw
  114.  
  115.         ret
  116.  
  117.