NT4/private/ntos/ke/mips/xxregsv.s
2020-09-30 17:12:29 +02:00

152 lines
4.1 KiB
ArmAsm
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// TITLE("Register Save and Restore")
//++
//
// Copyright (c) 1990 Microsoft Corporation
//
// Module Name:
//
// xxregsv.s
//
// Abstract:
//
// This module implements the code necessary to save and restore processor
// registers during exception and interrupt processing.
//
// Author:
//
// David N. Cutler (davec) 12-Aug-1990
//
// Environment:
//
// Kernel mode only.
//
// Revision History:
//
//--
#include "ksmips.h"
SBTTL("Save Volatile Floating Registers")
//++
//
// Routine Desription:
//
// This routine is called to save the volatile floating registers.
//
// N.B. This routine uses a special argument passing mechanism and destroys
// no registers. It is assumed that floating register f0 is saved by the
// caller.
//
// Arguments:
//
// s8 - Supplies a pointer to a trap frame.
//
// Return Value:
//
// None.
//
//--
LEAF_ENTRY(KiSaveVolatileFloatState)
.set noreorder
.set noat
#if defined(_EXTENDED_FLOAT)
sdc1 f1,TrDblF1(s8) // save odd floating registers
sdc1 f3,TrDblF3(s8) //
sdc1 f5,TrDblF5(s8) //
sdc1 f7,TrDblF7(s8) //
sdc1 f9,TrDblF9(s8) //
sdc1 f11,TrDblF11(s8) //
sdc1 f13,TrDblF13(s8) //
sdc1 f15,TrDblF15(s8) //
sdc1 f17,TrDblF17(s8) //
sdc1 f19,TrDblF19(s8) //
sdc1 f21,TrDblF21(s8) //
sdc1 f23,TrDblF23(s8) //
sdc1 f25,TrDblF25(s8) //
sdc1 f27,TrDblF27(s8) //
sdc1 f29,TrDblF29(s8) //
sdc1 f31,TrDblF31(s8) //
#endif
sdc1 f2,TrFltF2(s8) // save even floating registers
sdc1 f4,TrFltF4(s8) //
sdc1 f6,TrFltF6(s8) //
sdc1 f8,TrFltF8(s8) //
sdc1 f10,TrFltF10(s8) //
sdc1 f12,TrFltF12(s8) //
sdc1 f14,TrFltF14(s8) //
sdc1 f16,TrFltF16(s8) //
j ra // return
sdc1 f18,TrFltF18(s8) //
.set at
.set reorder
.end KiSaveVolatileFloatState)
SBTTL("Restore Volatile Floating Registers")
//++
//
// Routine Desription:
//
// This routine is called to restore the volatile floating registers.
//
// N.B. This routine uses a special argument passing mechanism and destroys
// no registers. It is assumed that floating register f0 is restored by
// the caller.
//
// Arguments:
//
// s8 - Supplies a pointer to a trap frame.
//
// Return Value:
//
// None.
//
//--
LEAF_ENTRY(KiRestoreVolatileFloatState)
.set noreorder
.set noat
#if defined(_EXTENDED_FLOAT)
ldc1 f1,TrDblF1(s8) // save odd floating registers
ldc1 f3,TrDblF3(s8) //
ldc1 f5,TrDblF5(s8) //
ldc1 f7,TrDblF7(s8) //
ldc1 f9,TrDblF9(s8) //
ldc1 f11,TrDblF11(s8) //
ldc1 f13,TrDblF13(s8) //
ldc1 f15,TrDblF15(s8) //
ldc1 f17,TrDblF17(s8) //
ldc1 f19,TrDblF19(s8) //
ldc1 f21,TrDblF21(s8) //
ldc1 f23,TrDblF23(s8) //
ldc1 f25,TrDblF25(s8) //
ldc1 f27,TrDblF27(s8) //
ldc1 f29,TrDblF29(s8) //
ldc1 f31,TrDblF31(s8) //
#endif
ldc1 f2,TrFltF2(s8) // restore floating registers f2 - f19
ldc1 f4,TrFltF4(s8) //
ldc1 f6,TrFltF6(s8) //
ldc1 f8,TrFltF8(s8) //
ldc1 f10,TrFltF10(s8) //
ldc1 f12,TrFltF12(s8) //
ldc1 f14,TrFltF14(s8) //
ldc1 f16,TrFltF16(s8) //
j ra // return
ldc1 f18,TrFltF18(s8) //
.set at
.set reorder
.end KiRestoreVolatileFloatState