4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// IPF specific control register reading functions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//---------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// AsmReadControlRegister
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Reads a 64-bit control register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Reads and returns the control register specified by Index.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned. This function is only available on IPF.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Arguments :
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// On Entry : The index of the control register to read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Return Value: The control register specified by Index.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//--
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//----------------------------------------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.text
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.type AsmReadControlRegister, @function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.proc AsmReadControlRegister
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync.regstk 1, 0, 0, 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAsmReadControlRegister::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CRs are defined in the ranges 0-25 and 64-81 (with some holes).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compact this list by subtracting 32 from the top range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 0-25, 64-81 -> 0-25, 32-49
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov r15=2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov r14=pr // save predicates
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync cmp.leu p6,p7=64,in0 // p6 = CR# >= 64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p7) cmp.leu p7,p0=32,in0 // p7 = 32 <= CR# < 64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p6) add in0=-32,in0 // if (CR >= 64) CR# -= 32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p7) mov r15=0 // if bad range (32-63)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov ret0=-1 // in case of illegal CR #
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync shl r15=r15,in0 // r15 = 0x2 << CR#
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov pr=r15,-1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // At this point the predicates contain a bit field of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // CR desired. (The bit is the CR+1, since pr0 is always 1.)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync .pred.rel "mutex",p1,p2,p3,p9,p17,p18,p20,p21,p22,p23,p24,p25,p26,\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p49,p50
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p1) mov ret0=cr.dcr // cr0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p2) mov ret0=cr.itm // cr1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p3) mov ret0=cr.iva // cr2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p9) mov ret0=cr.pta // cr8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p17) mov ret0=cr.ipsr // cr16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p18) mov ret0=cr.isr // cr17
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p20) mov ret0=cr.iip // cr19
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p21) mov ret0=cr.ifa // cr20
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p22) mov ret0=cr.itir // cr21
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p23) mov ret0=cr.iipa // cr22
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p24) mov ret0=cr.ifs // cr23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p25) mov ret0=cr.iim // cr24
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p26) mov ret0=cr.iha // cr25
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This is the translated (-32) range.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p33) mov ret0=cr.lid // cr64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p34) mov ret0=cr.ivr // cr65
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p35) mov ret0=cr.tpr // cr66
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p36) mov ret0=cr.eoi // cr67
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p37) mov ret0=cr.irr0 // cr68
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p38) mov ret0=cr.irr1 // cr69
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p39) mov ret0=cr.irr2 // cr70
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p40) mov ret0=cr.irr3 // cr71
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p41) mov ret0=cr.itv // cr72
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p42) mov ret0=cr.pmv // cr73
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p43) mov ret0=cr.cmcv // cr74
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p49) mov ret0=cr.lrr0 // cr80
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (p50) mov ret0=cr.lrr1 // cr81
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restore predicates and return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mov pr=r14,-1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync br.ret.sptk b0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync .endp