|
|
1.1 ! root 1: /*---------------------------------------------------------------------------+ ! 2: | fpu_etc.c | ! 3: | | ! 4: | Implement a few FPU instructions. | ! 5: | | ! 6: | Copyright (C) 1992 W. Metzenthen, 22 Parker St, Ormond, Vic 3163, | ! 7: | Australia. E-mail [email protected] | ! 8: | | ! 9: | | ! 10: +---------------------------------------------------------------------------*/ ! 11: ! 12: #include "fpu_system.h" ! 13: #include "exception.h" ! 14: #include "fpu_emu.h" ! 15: #include "status_w.h" ! 16: #include "reg_constant.h" ! 17: ! 18: ! 19: static void fchs() ! 20: { ! 21: if ( NOT_EMPTY_0 ) ! 22: { ! 23: FPU_st0_ptr->sign ^= SIGN_POS^SIGN_NEG; ! 24: status_word &= ~SW_C1; ! 25: } ! 26: else ! 27: stack_underflow(); ! 28: } ! 29: ! 30: static void fabs() ! 31: { ! 32: if ( FPU_st0_tag ^ TW_Empty ) ! 33: { ! 34: FPU_st0_ptr->sign = SIGN_POS; ! 35: status_word &= ~SW_C1; ! 36: } ! 37: else ! 38: stack_underflow(); ! 39: } ! 40: ! 41: ! 42: static void ftst_() ! 43: { ! 44: switch (FPU_st0_tag) ! 45: { ! 46: case TW_Zero: ! 47: setcc(SW_C3); ! 48: break; ! 49: case TW_Valid: ! 50: if (FPU_st0_ptr->sign == SIGN_POS) ! 51: setcc(0); ! 52: else ! 53: setcc(SW_C0); ! 54: break; ! 55: case TW_NaN: ! 56: setcc(SW_C2); /* Operand is not comparable */ ! 57: EXCEPTION(EX_Invalid); ! 58: break; ! 59: case TW_Infinity: ! 60: if (FPU_st0_ptr->sign == SIGN_POS) ! 61: setcc(0); ! 62: else ! 63: setcc(SW_C3); ! 64: /* setcc(SW_C0|SW_C2|SW_C3); */ ! 65: EXCEPTION(EX_Invalid); ! 66: break; ! 67: case TW_Empty: ! 68: setcc(SW_C0|SW_C2|SW_C3); ! 69: EXCEPTION(EX_StackUnder); ! 70: break; ! 71: default: ! 72: setcc(SW_C2); /* Operand is not comparable */ ! 73: EXCEPTION(EX_INTERNAL|0x14); ! 74: break; ! 75: } ! 76: } ! 77: ! 78: static void fxam() ! 79: { ! 80: int c=0; ! 81: switch (FPU_st0_tag) ! 82: { ! 83: case TW_Empty: ! 84: c = SW_C3|SW_C0; ! 85: break; ! 86: case TW_Zero: ! 87: c = SW_C3; ! 88: break; ! 89: case TW_Valid: ! 90: if (FPU_st0_ptr->sigh & 0x80000000) ! 91: c = SW_C2; ! 92: else ! 93: c = SW_C3|SW_C2; ! 94: break; ! 95: case TW_NaN: ! 96: c = SW_C0; ! 97: break; ! 98: case TW_Infinity: ! 99: c = SW_C2|SW_C0; ! 100: break; ! 101: } ! 102: if (FPU_st0_ptr->sign == SIGN_NEG) ! 103: c |= SW_C1; ! 104: setcc(c); ! 105: } ! 106: ! 107: static FUNC fp_etc_table[] = { ! 108: fchs, fabs, Un_impl, Un_impl, ftst_, fxam, Un_impl, Un_impl ! 109: }; ! 110: ! 111: void fp_etc() ! 112: { ! 113: (fp_etc_table[FPU_rm])(); ! 114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.