/*++

Copyright (c) 1991  Microsoft Corporation

Module Name:

    getsetrg.c

Abstract:

    This module implement the code necessary to get and set register values.
    These routines are used during the emulation of unaligned data references
    and floating point exceptions.

Author:

    David N. Cutler (davec) 17-Jun-1991

Environment:

    Kernel mode only.

Revision History:
    GeorgioP	   03-06-92	Port for use by the IEEE filter routine



--*/

#include <nt.h>
#include <ntmips.h>

ULONG
_GetRegisterValue (
    IN ULONG Register,
    IN PCONTEXT Context
    )

/*++

Routine Description:

    This function is called to get the value of a register from the specified
    exception or trap frame.

Arguments:

    Register - Supplies the number of the register whose value is to be
        returned. Integer registers are specified as 0 - 31 and floating
        registers are specified as 32 - 63.

    Context - Supplies a pointer to a context

Return Value:

    The value of the specified register is returned as the function value.

--*/

{

    //
    // Dispatch on the register number.
    //

    switch (Register) {

        //
        // Integer register zero.
        //

    case 0:
        return 0;

        //
        // Integer register AT.
        //

    case 1:
	return Context->IntAt;

        //
        // Integer register V0.
        //

    case 2:
	return Context->IntV0;

        //
        // Integer register V1.
        //

    case 3:
	return Context->IntV1;

        //
        // Integer register A0.
        //

    case 4:
	return Context->IntA0;

        //
        // Integer register A1.
        //

    case 5:
	return Context->IntA1;

        //
        // Integer register A2.
        //

    case 6:
	return Context->IntA2;

        //
        // Integer register A3.
        //

    case 7:
	return Context->IntA3;

        //
        // Integer register T0.
        //

    case 8:
	return Context->IntT0;

        //
        // Integer register T1.
        //

    case 9:
	return Context->IntT1;

        //
        // Integer register T2.
        //

    case 10:
	return Context->IntT2;

        //
        // Integer register T3.
        //

    case 11:
	return Context->IntT3;

        //
        // Integer register T4.
        //

    case 12:
	return Context->IntT4;

        //
        // Integer register T5.
        //

    case 13:
	return Context->IntT5;

        //
        // Integer register T6.
        //

    case 14:
	return Context->IntT6;

        //
        // Integer register T7.
        //

    case 15:
	return Context->IntT7;

        //
        // Integer register S0.
        //

    case 16:
	return Context->IntS0;

        //
        // Integer register S1.
        //

    case 17:
	return Context->IntS1;

        //
        // Integer register S2.
        //

    case 18:
	return Context->IntS2;

        //
        // Integer register S3.
        //

    case 19:
	return Context->IntS3;

        //
        // Integer register S4.
        //

    case 20:
	return Context->IntS4;

        //
        // Integer register S5.
        //

    case 21:
	return Context->IntS5;

        //
        // Integer register S6.
        //

    case 22:
	return Context->IntS6;

        //
        // Integer register S7.
        //

    case 23:
	return Context->IntS7;

        //
        // Integer register T8.
        //

    case 24:
	return Context->IntT8;

        //
        // Integer register T9.
        //

    case 25:
	return Context->IntT9;

        //
        // Integer register K0.
        //

    case 26:
        return 0;

        //
        // Integer register K1.
        //

    case 27:
        return 0;

        //
        // Integer register gp.
        //

    case 28:
	return Context->IntGp;

        //
        // Integer register Sp.
        //

    case 29:
	return Context->IntSp;

        //
        // Integer register S8.
        //

    case 30:
	return Context->IntS8;

        //
        // Integer register Ra.
        //

    case 31:
	return Context->IntRa;

        //
        // Floating register F0.
        //

    case 32:
	return Context->FltF0;

        //
        // Floating register F1.
        //

    case 33:
	return Context->FltF1;

        //
        // Floating register F2.
        //

    case 34:
	return Context->FltF2;

        //
        // Floating register F3.
        //

    case 35:
	return Context->FltF3;

        //
        // Floating register F4.
        //

    case 36:
	return Context->FltF4;

        //
        // Floating register F5.
        //

    case 37:
	return Context->FltF5;

        //
        // Floating register F6.
        //

    case 38:
	return Context->FltF6;

        //
        // Floating register F7.
        //

    case 39:
	return Context->FltF7;

        //
        // Floating register F8.
        //

    case 40:
	return Context->FltF8;

        //
        // Floating register F9.
        //

    case 41:
	return Context->FltF9;

        //
        // Floating register F10.
        //

    case 42:
	return Context->FltF10;

        //
        // Floating register F11.
        //

    case 43:
	return Context->FltF11;

        //
        // Floating register F12.
        //

    case 44:
	return Context->FltF12;

        //
        // Floating register F13.
        //

    case 45:
	return Context->FltF13;

        //
        // Floating register F14.
        //

    case 46:
	return Context->FltF14;

        //
        // Floating register F15.
        //

    case 47:
	return Context->FltF15;

        //
        // Floating register F16.
        //

    case 48:
	return Context->FltF16;

        //
        // Floating register F17.
        //

    case 49:
	return Context->FltF17;

        //
        // Floating register F18.
        //

    case 50:
	return Context->FltF18;

        //
        // Floating register F19.
        //

    case 51:
	return Context->FltF19;

        //
        // Floating register F20.
        //

    case 52:
	return Context->FltF20;

        //
        // Floating register F21.
        //

    case 53:
	return Context->FltF21;

        //
        // Floating register F22.
        //

    case 54:
	return Context->FltF22;

        //
        // Floating register F23.
        //

    case 55:
	return Context->FltF23;

        //
        // Floating register F24.
        //

    case 56:
	return Context->FltF24;

        //
        // Floating register F25.
        //

    case 57:
	return Context->FltF25;

        //
        // Floating register F26.
        //

    case 58:
	return Context->FltF26;

        //
        // Floating register F27.
        //

    case 59:
	return Context->FltF27;

        //
        // Floating register F28.
        //

    case 60:
	return Context->FltF28;

        //
        // Floating register F29.
        //

    case 61:
	return Context->FltF29;

        //
        // Floating register F30.
        //

    case 62:
	return Context->FltF30;

        //
        // Floating register F31.
        //

    case 63:
	return Context->FltF31;
    }
}

VOID
_SetRegisterValue (
    IN ULONG Register,
    IN ULONG Value,
    OUT PCONTEXT Context
    )

/*++

Routine Description:

    This function is called to set the value of a register in the specified
    exception or trap frame.

Arguments:

    Register - Supplies the number of the register whose value is to be
        stored. Integer registers are specified as 0 - 31 and floating
        registers are specified as 32 - 63.

    Value - Supplies the value to be stored in the specified register.

    Context - Supplies a pointer to an context record.

Return Value:

    None.

--*/

{

    //
    // Dispatch on the register number.
    //

    switch (Register) {

        //
        // Integer register zero.
        //

    case 0:
        return;

        //
        // Integer register AT.
        //

    case 1:
	Context->IntAt = Value;
        return;

        //
        // Integer register V0.
        //

    case 2:
	Context->IntV0 = Value;
        return;

        //
        // Integer register V1.
        //

    case 3:
	Context->IntV1 = Value;
        return;

        //
        // Integer register A0.
        //

    case 4:
	Context->IntA0 = Value;
        return;

        //
        // Integer register A1.
        //

    case 5:
	Context->IntA1 = Value;
        return;

        //
        // Integer register A2.
        //

    case 6:
	Context->IntA2 = Value;
        return;

        //
        // Integer register A3.
        //

    case 7:
	Context->IntA3 = Value;
        return;

        //
        // Integer register T0.
        //

    case 8:
	Context->IntT0 = Value;
        return;

        //
        // Integer register T1.
        //

    case 9:
	Context->IntT1 = Value;
        return;

        //
        // Integer register T2.
        //

    case 10:
	Context->IntT2 = Value;
        return;

        //
        // Integer register T3.
        //

    case 11:
	Context->IntT3 = Value;
        return;

        //
        // Integer register T4.
        //

    case 12:
	Context->IntT4 = Value;
        return;

        //
        // Integer register T5.
        //

    case 13:
	Context->IntT5 = Value;
        return;

        //
        // Integer register T6.
        //

    case 14:
	Context->IntT6 = Value;
        return;

        //
        // Integer register T7.
        //

    case 15:
	Context->IntT7 = Value;
        return;

        //
        // Integer register S0.
        //

    case 16:
	Context->IntS0 = Value;
        return;

        //
        // Integer register S1.
        //

    case 17:
	Context->IntS1 = Value;
        return;

        //
        // Integer register S2.
        //

    case 18:
	Context->IntS2 = Value;
        return;

        //
        // Integer register S3.
        //

    case 19:
	Context->IntS3 = Value;
        return;

        //
        // Integer register S4.
        //

    case 20:
	Context->IntS4 = Value;
        return;

        //
        // Integer register S5.
        //

    case 21:
	Context->IntS5 = Value;
        return;

        //
        // Integer register S6.
        //

    case 22:
	Context->IntS6 = Value;
        return;

        //
        // Integer register S7.
        //

    case 23:
	Context->IntS7 = Value;
        return;

        //
        // Integer register T8.
        //

    case 24:
	Context->IntT8 = Value;
        return;

        //
        // Integer register T9.
        //

    case 25:
	Context->IntT9 = Value;
        return;

        //
        // Integer register K0.
        //

    case 26:
        return;

        //
        // Integer register K1.
        //

    case 27:
        return;

        //
        // Integer register gp.
        //

    case 28:
	Context->IntGp = Value;
        return;

        //
        // Integer register Sp.
        //

    case 29:
	Context->IntSp = Value;
        return;

        //
        // Integer register S8.
        //

    case 30:
	Context->IntS8 = Value;
        return;

        //
        // Integer register Ra.
        //

    case 31:
	Context->IntRa = Value;
        return;

        //
        // Floating register F0.
        //

    case 32:
	Context->FltF0 = Value;
        return;

        //
        // Floating register F1.
        //

    case 33:
	Context->FltF1 = Value;
        return;

        //
        // Floating register F2.
        //

    case 34:
	Context->FltF2 = Value;
        return;

        //
        // Floating register F3.
        //

    case 35:
	Context->FltF3 = Value;
        return;

        //
        // Floating register F4.
        //

    case 36:
	Context->FltF4 = Value;
        return;

        //
        // Floating register F5.
        //

    case 37:
	Context->FltF5 = Value;
        return;

        //
        // Floating register F6.
        //

    case 38:
	Context->FltF6 = Value;
        return;

        //
        // Floating register F7.
        //

    case 39:
	Context->FltF7 = Value;
        return;

        //
        // Floating register F8.
        //

    case 40:
	Context->FltF8 = Value;
        return;

        //
        // Floating register F9.
        //

    case 41:
	Context->FltF9 = Value;
        return;

        //
        // Floating register F10.
        //

    case 42:
	Context->FltF10 = Value;
        return;

        //
        // Floating register F11.
        //

    case 43:
	Context->FltF11 = Value;
        return;

        //
        // Floating register F12.
        //

    case 44:
	Context->FltF12 = Value;
        return;

        //
        // Floating register F13.
        //

    case 45:
	Context->FltF13 = Value;
        return;

        //
        // Floating register F14.
        //

    case 46:
	Context->FltF14 = Value;
        return;

        //
        // Floating register F15.
        //

    case 47:
	Context->FltF15 = Value;
        return;

        //
        // Floating register F16.
        //

    case 48:
	Context->FltF16 = Value;
        return;

        //
        // Floating register F17.
        //

    case 49:
	Context->FltF17 = Value;
        return;

        //
        // Floating register F18.
        //

    case 50:
	Context->FltF18 = Value;
        return;

        //
        // Floating register F19.
        //

    case 51:
	Context->FltF19 = Value;
        return;

        //
        // Floating register F20.
        //

    case 52:
	Context->FltF20 = Value;
        return;

        //
        // Floating register F21.
        //

    case 53:
	Context->FltF21 = Value;
        return;

        //
        // Floating register F22.
        //

    case 54:
	Context->FltF22 = Value;
        return;

        //
        // Floating register F23.
        //

    case 55:
	Context->FltF23 = Value;
        return;

        //
        // Floating register F24.
        //

    case 56:
	Context->FltF24 = Value;
        return;

        //
        // Floating register F25.
        //

    case 57:
	Context->FltF25 = Value;
        return;

        //
        // Floating register F26.
        //

    case 58:
	Context->FltF26 = Value;
        return;

        //
        // Floating register F27.
        //

    case 59:
	Context->FltF27 = Value;
        return;

        //
        // Floating register F28.
        //

    case 60:
	Context->FltF28 = Value;
        return;

        //
        // Floating register F29.
        //

    case 61:
	Context->FltF29 = Value;
        return;

        //
        // Floating register F30.
        //

    case 62:
	Context->FltF30 = Value;
        return;

        //
        // Floating register F31.
        //

    case 63:
	Context->FltF31 = Value;
        return;
    }
}
