Annotation of kernel/machdep/i386/fp_emul/fp_e80387.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
        !             7:  * Reserved.  This file contains Original Code and/or Modifications of
        !             8:  * Original Code as defined in and that are subject to the Apple Public
        !             9:  * Source License Version 1.1 (the "License").  You may not use this file
        !            10:  * except in compliance with the License.  Please obtain a copy of the
        !            11:  * License at http://www.apple.com/publicsource and read it before using
        !            12:  * this file.
        !            13:  * 
        !            14:  * The Original Code and all software distributed under the License are
        !            15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            19:  * License for the specific language governing rights and limitations
        !            20:  * under the License.
        !            21:  * 
        !            22:  * @APPLE_LICENSE_HEADER_END@
        !            23:  */
        !            24: 
        !            25: #ident "@(#)kern-fp:e80387.h   1.1"
        !            26: 
        !            27: #define LOCORE
        !            28: #ifdef NEXT
        !            29: #include "assym.h"
        !            30: #else /* NEXT */
        !            31: #include "assym.s"
        !            32: #endif /* NEXT */
        !            33: 
        !            34: /* the following were aids in RISCizing the emulator */
        !            35: #define FAST_MOVSL                             \
        !            36:        push    %eax                            ;\
        !            37: 1:                                             ;\
        !            38:        movl    0(%esi),%eax                    ;\
        !            39:        movl    %eax,0(%edi)                    ;\
        !            40:        addl    $4,%esi                         ;\
        !            41:        addl    $4,%edi                         ;\
        !            42:        decl    %ecx                            ;\
        !            43:        testl   %ecx,%ecx                       ;\
        !            44:        jg      1b                              ;\
        !            45:        pop     %eax
        !            46: 
        !            47: #define FAST_MOVSL_ES                          \
        !            48: 1:                                             ;\
        !            49:        movl    0(%esi),%eax                    ;\
        !            50:        movl    %eax,%es:0(%edi)                ;\
        !            51:        addl    $4,%esi                         ;\
        !            52:        addl    $4,%edi                         ;\
        !            53:        decl    %ecx                            ;\
        !            54:        testl   %ecx,%ecx                       ;\
        !            55:        jg      1b
        !            56: 
        !            57: #define FAST_MOVSW                             \
        !            58:        push    %eax                            ;\
        !            59: 1:                                             ;\
        !            60:        movw    0(%esi),%ax                     ;\
        !            61:        movw    %ax,%es:0(%edi)                 ;\
        !            62:        addl    $2,%esi                         ;\
        !            63:        addl    $2,%edi                         ;\
        !            64:        decl    %ecx                            ;\
        !            65:        testl   %ecx,%ecx                       ;\
        !            66:        jg      1b                              ;\
        !            67:        pop     %eax
        !            68: 
        !            69: #define FAST_STOSL                             \
        !            70: 1:                                             ;\
        !            71:        movl    %eax,0(%edi)                    ;\
        !            72:        addl    $4,%edi                         ;\
        !            73:        decl    %ecx                            ;\
        !            74:        testl   %ecx,%ecx                       ;\
        !            75:        jg      1b
        !            76: 
        !            77: #define LOOP(arg)                              \
        !            78:        decl    %ecx                            ;\
        !            79:        testl   %ecx,%ecx                       ;\
        !            80:        jg      arg
        !            81: 
        !            82: /* redefine movw to movl and keep the ability to switch back */
        !            83: #define MOVL   movw
        !            84: #define XORL   xorl
        !            85: #define ALIGN  .align  4
        !            86: #define FALLSTHRU                              \
        !            87:        jmp     1f                              ;\
        !            88:        .align  4                               ;\
        !            89: 1:
        !            90: 
        !            91: /*     convenience definitions     */
        !            92: /*  new ones -387     */
        !            93: 
        !            94: #define         word_frac1                      (dword_frac1+2)(%ebp)
        !            95: #define         word_frac2                      (dword_frac2+2)(%ebp)
        !            96: #define         result_word_frac                (result_dword_frac+2)(%ebp)
        !            97: #define         result2_word_frac               (result2_dword_frac+2)(%ebp)
        !            98: 
        !            99: #define                dword_expon1                    (expon1)(%ebp)
        !           100: #define                dword_expon2                    (expon2)(%ebp)
        !           101: #define                dword_result_expon              (result_expon)(%ebp)
        !           102: #define                dword_result2_expon             (result2_expon)(%ebp)
        !           103: 
        !           104: #define         dop                             (dword_dop+2)(%ebp)
        !           105: #define         cop                             (dword_cop+2)(%ebp)
        !           106: #define         extra_word_reg                  (extra_dword_reg+2)(%ebp)
        !           107: #define                signal_i_error_                 (before_error_signals)(%ebp)
        !           108: #define                signal_z_error_                 (before_error_signals+1)(%ebp)
        !           109: #define                signal_d_error_                 (before_error_signals+2)(%ebp)
        !           110: 
        !           111: #define         offset_op1_rec                  $op1_format
        !           112: #define         offset_op2_rec                  $op2_format
        !           113: #define         offset_result_rec               $result_format
        !           114: #define         offset_result2_rec              $result2_format
        !           115: #define         offset_operand1                 dword_frac1
        !           116: #define         lsb_frac1                       word_frac1
        !           117: #define         msb_frac1                       9+word_frac1
        !           118: #define         offset_operand2                 dword_frac2
        !           119: #define         lsb_frac2                       word_frac2
        !           120: #define         msb_frac2                       9+word_frac2
        !           121: #define         offset_result                   result_dword_frac
        !           122: #define         lsb_result                      result_word_frac
        !           123: #define         msb_result                      9+result_word_frac
        !           124: #define         offset_result2                  result2_dword_frac
        !           125: #define         lsb_result2                     result2_word_frac
        !           126: #define         msb_result2                     9+result2_word_frac
        !           127: #define         offset_cop                      dword_cop
        !           128: #define         lsb_cop                         cop
        !           129: #define         msb_cop                         9+lsb_cop
        !           130: #define         offset_dop                      dword_dop
        !           131: #define         lsb_dop                         dop
        !           132: #define         msb_dop                         9+lsb_dop
        !           133: #define         q                               (mem_operand_pointer)(%ebp)
        !           134: #define         exp_tmp                         (mem_operand_pointer)(%ebp)
        !           135: #define         siso                            (mem_operand_pointer+4)(%ebp)
        !           136: #define                log_loop_ct                     (mem_operand_pointer)(%ebp)
        !           137: #define         bit_ct                          (instruction_pointer)(%ebp)
        !           138: #define         added_one                       (instruction_pointer+1)(%ebp)
        !           139: #define         rnd_history                     (instruction_pointer+2)(%ebp)
        !           140: #define         rnd1_inexact                    (instruction_pointer+2)(%ebp)
        !           141: #define         rnd2_inexact                    (instruction_pointer+3)(%ebp)
        !           142: 
        !           143: #define                dword_exp_tmp                   (before_error_signals)(%ebp)
        !           144: #define                trans_info                      (extra_dword_reg)(%ebp)
        !           145: #define                op_type                         (extra_dword_reg)(%ebp)
        !           146: #define                sin_sign                        (extra_dword_reg+1)(%ebp)
        !           147: #define                cos_sign                        (extra_dword_reg+2)(%ebp)
        !           148: #define                cofunc_flag                     (extra_dword_reg+3)(%ebp)
        !           149: #define                res_signs                       (extra_dword_reg+1)(%ebp)
        !           150: /* ...define structure of operand info and result info structures...     */
        !           151: 
        !           152: #define         format          0
        !           153: #define         location        1
        !           154: #define         use_up          2
        !           155: 
        !           156: /* ...define format codes...     */
        !           157: 
        !           158: #define         single_real     0
        !           159: #define         double_real     1
        !           160: #define         int16           2
        !           161: #define         int32           3
        !           162: #define         int64           4
        !           163: #define         extended_fp     5
        !           164: #define         null            7
        !           165: #define         bcd             8
        !           166: #define         op_no_result    9
        !           167: #define         no_op_result    10
        !           168: #define         op2_pop         11
        !           169: #define         op2_no_pop      12
        !           170: #define         result2         13
        !           171: #define         op1_top_op2     14
        !           172: 
        !           173: /* ...define operation type codes...     */
        !           174: 
        !           175: #define         save_ptrs       0x80
        !           176: #define         load_op         0
        !           177: #define         store_op        1
        !           178: #define         chsign_op       2
        !           179: #define         compar_op       3
        !           180: #define         error_op        4+save_ptrs
        !           181: #define         add_op          5
        !           182: #define         sub_op          6
        !           183: #define         mul_op          7
        !           184: #define         div_op          8
        !           185: #define         ldcw_op         9+save_ptrs
        !           186: #define         save_op         10+save_ptrs
        !           187: #define         restore_op      11+save_ptrs
        !           188: #define         null_op         12+save_ptrs
        !           189: #define         abs_op          13
        !           190: #define         init_op         14+save_ptrs
        !           191: #define         fxtrac_op       15
        !           192: #define         log_op          16
        !           193: #define         splog_op        17
        !           194: #define         exp_op          18
        !           195: #define         tan_op          19
        !           196: #define         arctan_op       20
        !           197: #define         sqrt_op         21
        !           198: #define         remr_op         22
        !           199: #define         intpt_op        23
        !           200: #define         scale_op        24
        !           201: #define         exchange_op     25
        !           202: #define         free_op         26
        !           203: #define         ldenv_op        27+save_ptrs
        !           204: #define         stenv_op        28+save_ptrs
        !           205: #define         stcw_op         29+save_ptrs
        !           206: #define         stsw_op         30+save_ptrs
        !           207: #define         load_1_op       31
        !           208: #define         load_l2t_op     32
        !           209: #define         load_l2e_op     33
        !           210: #define         load_pi_op      34
        !           211: #define         load_lg2_op     35
        !           212: #define         load_ln2_op     36
        !           213: #define         load_0_op       37
        !           214: #define         decstp_op       38
        !           215: #define         incstp_op       39
        !           216: #define         cler_op         40+save_ptrs
        !           217: #define         test_op         41
        !           218: #define         exam_op         42
        !           219: #define         sin_op          43
        !           220: #define         cos_op          44
        !           221: #define         sincos_op       45
        !           222: #define         rem1_op         46
        !           223: #define         ucom_op         47
        !           224: #define         compar_pop      48
        !           225: #define         subr_op         49
        !           226: #define         divr_op         50
        !           227: #define         store_pop       51
        !           228: #define         ucom_pop        52
        !           229: 
        !           230: /* ...definition of register tag codes...     */
        !           231: 
        !           232: #define         valid                    $0
        !           233: #define         VALID                    0
        !           234: #define         special                  $1
        !           235: #define                SPECIAL                  1
        !           236: #define         inv                      $2
        !           237: #define         empty                    3
        !           238: #define         denormd                  $6
        !           239: #define         infinty                  $0x0a
        !           240: #define                INFINITY                 0x0a
        !           241: #define         unsupp                   $0x12 
        !           242: 
        !           243: /* ...infinity_control settings...     */
        !           244: 
        !           245: #define         projective              $0
        !           246: #define         affine                  $1
        !           247: 
        !           248: /* ...define location codes...     */
        !           249: 
        !           250: #define         memory_opnd             0
        !           251: #define         stack_top               1
        !           252: #define         stack_top_minus_1       2
        !           253: #define         stack_top_plus_1        3
        !           254: #define         reg                     4
        !           255: 
        !           256: /* ...define use_up codes...     */
        !           257: 
        !           258: #define         free            $0
        !           259: #define         pop_stack       $1
        !           260: #define         do_nothing      2
        !           261: 
        !           262: /* ...definition of operand and result records in global reent seg...     */
        !           263: 
        !           264: #define         frac80  2
        !           265: #define         frac64  4
        !           266: #define         frac32  8
        !           267: #define         msb     11
        !           268: #define         sign    12
        !           269: #define         tag     14
        !           270: #define         expon   16
        !           271: 
        !           272: /* ...definition of precision codes...     */
        !           273: 
        !           274: #define         prec24                   $0
        !           275: #define         prec32                   $1
        !           276: #define         prec53                   $2
        !           277: #define         prec64                   $3
        !           278: #define         prec16                   $4
        !           279: 
        !           280: /* ...define round control codes...     */
        !           281: 
        !           282: #define         rnd_to_even                      $0x0000
        !           283: #define         rnd_down                         $0x0004
        !           284: #define         rnd_up                           $0x0008
        !           285: #define         rnd_to_zero                      $0x000c
        !           286: 
        !           287: /* ...define positive and negative...     */
        !           288: 
        !           289: #define         positive                        $0x0000
        !           290: #define                POSITIVE                         0x0000
        !           291: #define         negative                        $0x00ff
        !           292: #define         NEGATIVE                         0x00ff
        !           293: 
        !           294: /* ...definition of true and false...     */
        !           295: 
        !           296: #define         true                    $0x00ff
        !           297: #define         false                   $0x0000
        !           298: 
        !           299: #define         wrap_around_constant            $0x6000
        !           300: #define         no_change                       $0x00f0
        !           301: #define         exponent_bias                   0x3fff
        !           302: 
        !           303: #define         single_exp_offset               $0x3f80
        !           304: #define         double_exp_offset               $0x3c00
        !           305: 
        !           306: #define         zero_mask                       0x40
        !           307: #define         sign_mask                       0x01
        !           308: #define         a_mask                          0x02
        !           309: #define         c_mask                          0x04
        !           310: #define         inexact_mask                    0x20
        !           311: #define         underflow_mask                  $0x10
        !           312: #define         overflow_mask                   $0x08
        !           313: #define         zero_divide_mask                $0x04
        !           314: #define         invalid_mask                    $0x01
        !           315: #define         denorm_mask                     $0x02
        !           316: #define         top_mask                        0x38
        !           317: #define         precision_mask                  0x03
        !           318: #define         rnd_control_mask                0x0c
        !           319: #define         infinity_control_mask           $0x10
        !           320: #define         high_extended_expon_for_single  $0x407e
        !           321: #define         low_extended_expon_for_single   $0x3f81
        !           322: #define         high_extended_expon_for_double  $0x43fe
        !           323: #define         low_extended_expon_for_double   $0x3c01
        !           324: #define         high_int16_exponent     $0x400e
        !           325: #define         max_int16_shift         $17
        !           326: #define         high_int32_exponent     $0x401e
        !           327: #define         max_int32_shift         $33
        !           328: #define         high_int64_exponent     $0x403e
        !           329: #define         max_int64_shift         $65
        !           330: /*     the least scale term for which extreme overflow is certain */
        !           331: #define                least_sf_xtrm_ovfl      $0x0000e03d
        !           332: /*     the greatest scale term for which extreme underflow is certain */
        !           333: #define                grtst_sf_xtrm_unfl      $0xffff2002
        !           334: 
        !           335: /*     These values set up for referencing the status registers in u_block */
        !           336: 
        !           337: //       The following structure depicts the Status Register structure
        !           338: //       for the 80387 emulator.
        !           339: //
        !           340: //               +-----------------------------------------------+
        !           341: //            0  |       sr_masks        |       sr_controls     |
        !           342: //               +-----------------------------------------------+
        !           343: //            2  |               sr_reserved1                    |
        !           344: //               +-----------------------------------------------+
        !           345: //            4  |       sr_errors       |       sr_flags        |
        !           346: //               +-----------------------------------------------+
        !           347: //            6  |               sr_reserved2                    |
        !           348: //               +-----------------------------------------------+
        !           349: //            8  |                    sr_tags                    |
        !           350: //               +-----------------------------------------------+
        !           351: //           10  |               sr_reserved3                    |
        !           352: //               +-----------------------------------------------+
        !           353: //           12  |               sr_instr_offset                 |
        !           354: //               +                                               +
        !           355: //           14  |                                               |
        !           356: //               +-----------------------------------------------+
        !           357: //           16  |               sr_instr_base                   |
        !           358: //               +-----------------------------------------------+
        !           359: //           18  |               sr_reserved4                    |
        !           360: //               +-----------------------------------------------+
        !           361: //           20  |               sr_mem_offset                   |
        !           362: //               +                                               +
        !           363: //           22  |                                               |
        !           364: //               +-----------------------------------------------+
        !           365: //           24  |               sr_mem_base                     |
        !           366: //               +-----------------------------------------------+
        !           367: //           26  |               sr_reserved5                    |
        !           368: //               +-----------------------------------------------+
        !           369: //           28  |               sr_regstack                     |
        !           370: //               +-----------------------------------------------+
        !           371: //           30  |                                               |
        !           372: //               +-----------------------------------------------+
        !           373: //                                       .
        !           374: //
        !           375: //                                       .
        !           376: //
        !           377: //                                       .
        !           378: //               +-----------------------------------------------+
        !           379: //           106 |                                               |
        !           380: //               +-----------------------------------------------+
        !           381: //
        !           382: //
        !           383: //
        !           384: //
        !           385: //     The status register memory allocation for the emulator is found at
        !           386: //     offset u_fpstate into the users u block structure.
        !           387: //
        !           388: //
        !           389: //...define the 80387 status register...
        !           390: //
        !           391: #if 0
        !           392: /* These are now generated automatically - Bob Davies */
        !           393: #define sr_masks       0       
        !           394: #define sr_controls    1 
        !           395: #define sr_reserved1   2       
        !           396: #define sr_errors      4       
        !           397: #define sr_flags       5       
        !           398: #define sr_reserved2   6       
        !           399: #define sr_tags        8       
        !           400: #define sr_reserved3   10      
        !           401: #define sr_instr_offset 12
        !           402: #define sr_instr_base  16
        !           403: #define sr_reserved4   18
        !           404: #define sr_mem_offset  20      
        !           405: #define sr_mem_base    24      
        !           406: #define sr_reserved5   26      
        !           407: #define sr_regstack    28      
        !           408: //
        !           409: 
        !           410: #define        EIP_offset      14*4 + 220  /* EIP that will be loaded on iret */
        !           411: 
        !           412: #endif /* 0 */

unix.superglobalmegacorp.com

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