Annotation of kernel/machdep/i386/fp_emul/fp_e80387.h, revision 1.1.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.