|
|
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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.