From f1baef624fb7119c54c3389a2cd99b108ee08f0e Mon Sep 17 00:00:00 2001
From: vanjeff <vanjeff@6f19259b-4bc3-4df7-8a09-765794883524>
Date: Mon, 2 Jul 2007 09:34:25 +0000
Subject: [PATCH] 1. Port X64, IPF and EBC arch for BaseLib 2. Port X64 arch
 codes for BaseMemoryLibRepStr and BaseMemoryLibSee2

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2955 6f19259b-4bc3-4df7-8a09-765794883524
---
 MdePkg/Library/BaseLib/Ebc/CpuBreakpoint.c    | 164 ++++++
 MdePkg/Library/BaseLib/Ebc/SetJumpLongJump.c  |  78 +++
 MdePkg/Library/BaseLib/Ebc/SwitchStack.c      |  64 +++
 MdePkg/Library/BaseLib/Ebc/Synchronization.c  |  99 ++++
 MdePkg/Library/BaseLib/Ia32/ARShiftU64.S      |   5 -
 MdePkg/Library/BaseLib/Ia32/CpuBreakpoint.S   |   5 -
 MdePkg/Library/BaseLib/Ia32/CpuFlushTlb.S     |   5 -
 MdePkg/Library/BaseLib/Ia32/CpuId.S           |   5 -
 MdePkg/Library/BaseLib/Ia32/CpuIdEx.S         | 139 +++--
 MdePkg/Library/BaseLib/Ia32/CpuPause.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/CpuSleep.S        |   5 -
 .../Library/BaseLib/Ia32/DisableInterrupts.S  |   5 -
 MdePkg/Library/BaseLib/Ia32/DisablePaging32.S |   5 -
 MdePkg/Library/BaseLib/Ia32/DivU64x32.S       |  87 ++-
 .../Library/BaseLib/Ia32/DivU64x32Remainder.S |   5 -
 .../Library/BaseLib/Ia32/DivU64x64Remainder.S |   5 -
 .../BaseLib/Ia32/EnableDisableInterrupts.S    |   5 -
 .../Library/BaseLib/Ia32/EnableInterrupts.S   |   5 -
 MdePkg/Library/BaseLib/Ia32/EnablePaging32.S  |   5 -
 MdePkg/Library/BaseLib/Ia32/EnablePaging64.S  |   5 -
 .../Library/BaseLib/Ia32/EnablePaging64.asm   |   5 -
 MdePkg/Library/BaseLib/Ia32/FlushCacheLine.S  |   5 -
 MdePkg/Library/BaseLib/Ia32/FxRestore.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/FxSave.S          |   5 -
 .../Ia32/InterlockedCompareExchange32.S       |   5 -
 .../Ia32/InterlockedCompareExchange64.S       |   5 -
 .../BaseLib/Ia32/InterlockedDecrement.S       |   5 -
 .../BaseLib/Ia32/InterlockedIncrement.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/Invd.S            |   5 -
 MdePkg/Library/BaseLib/Ia32/LRotU64.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/LShiftU64.S       |  87 ++-
 MdePkg/Library/BaseLib/Ia32/LongJump.S        |  87 ++-
 MdePkg/Library/BaseLib/Ia32/ModU64x32.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/Monitor.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/MultU64x32.S      |  87 ++-
 MdePkg/Library/BaseLib/Ia32/MultU64x64.S      |   5 -
 MdePkg/Library/BaseLib/Ia32/Mwait.S           |   5 -
 MdePkg/Library/BaseLib/Ia32/RRotU64.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/RShiftU64.S       |  93 ++--
 MdePkg/Library/BaseLib/Ia32/ReadCr0.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadCr2.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadCr3.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadCr4.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadCs.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr0.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr1.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr2.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr3.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr4.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr5.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr6.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDr7.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadDs.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadEflags.S      |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadEs.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadFs.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadGdtr.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadGs.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadIdtr.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadLdtr.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm0.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm1.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm2.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm3.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm4.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm5.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm6.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMm7.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadMsr64.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadPmc.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadSs.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadTr.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/ReadTsc.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/SetJump.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/SwapBytes64.S     |  81 ++-
 MdePkg/Library/BaseLib/Ia32/Thunk16.S         |   5 -
 MdePkg/Library/BaseLib/Ia32/Wbinvd.S          |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteCr0.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteCr2.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteCr3.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteCr4.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr0.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr1.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr2.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr3.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr4.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr5.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr6.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteDr7.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteGdtr.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteIdtr.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteLdtr.S       |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm0.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm1.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm2.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm3.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm4.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm5.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm6.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMm7.S        |   5 -
 MdePkg/Library/BaseLib/Ia32/WriteMsr64.S      |   5 -
 MdePkg/Library/BaseLib/Ipf/AccessDbr.s        | 118 ++++
 MdePkg/Library/BaseLib/Ipf/AccessEicr.s       | 512 ++++++++++++++++++
 MdePkg/Library/BaseLib/Ipf/AccessGcr.s        | 264 +++++++++
 MdePkg/Library/BaseLib/Ipf/AccessGp.s         |  86 +++
 MdePkg/Library/BaseLib/Ipf/AccessKr.s         | 400 ++++++++++++++
 MdePkg/Library/BaseLib/Ipf/AccessPmr.s        | 124 +++++
 MdePkg/Library/BaseLib/Ipf/AccessPsr.s        | 110 ++++
 MdePkg/Library/BaseLib/Ipf/AsmPalCall.s       | 158 ++++++
 MdePkg/Library/BaseLib/Ipf/CpuBreakpoint.c    | 123 +++++
 MdePkg/Library/BaseLib/Ipf/CpuFlushTlb.s      |  58 ++
 MdePkg/Library/BaseLib/Ipf/CpuPause.s         |  25 +
 MdePkg/Library/BaseLib/Ipf/ExecFc.s           |  66 +++
 MdePkg/Library/BaseLib/Ipf/FlushCacheRange.s  |  96 ++++
 .../Library/BaseLib/Ipf/GetInterruptState.s   |  27 +
 .../Ipf/InterlockedCompareExchange32.s        |  29 +
 .../Ipf/InterlockedCompareExchange64.s        |  28 +
 .../Library/BaseLib/Ipf/InternalSwitchStack.c |  68 +++
 MdePkg/Library/BaseLib/Ipf/PalCallStatic.s    |  48 ++
 MdePkg/Library/BaseLib/Ipf/ReadCpuid.s        |  40 ++
 MdePkg/Library/BaseLib/Ipf/SwitchStack.s      |  50 ++
 MdePkg/Library/BaseLib/Ipf/Synchronization.c  |  79 +++
 MdePkg/Library/BaseLib/Ipf/Unaligned.c        | 248 +++++++++
 MdePkg/Library/BaseLib/Ipf/asm.h              |  27 +
 MdePkg/Library/BaseLib/Ipf/ia_64gen.h         | 205 +++++++
 MdePkg/Library/BaseLib/Ipf/longjmp.s          | 121 +++++
 MdePkg/Library/BaseLib/Ipf/setjmp.s           | 108 ++++
 MdePkg/Library/BaseLib/X64/CpuBreakpoint.S    |  25 +
 MdePkg/Library/BaseLib/X64/CpuBreakpoint.asm  |  37 ++
 MdePkg/Library/BaseLib/X64/CpuBreakpoint.c    |  31 ++
 MdePkg/Library/BaseLib/X64/CpuFlushTlb.S      |  35 ++
 MdePkg/Library/BaseLib/X64/CpuFlushTlb.asm    |  38 ++
 MdePkg/Library/BaseLib/X64/CpuId.S            |  60 ++
 MdePkg/Library/BaseLib/X64/CpuId.asm          |  62 +++
 MdePkg/Library/BaseLib/X64/CpuIdEx.S          |  62 +++
 MdePkg/Library/BaseLib/X64/CpuIdEx.asm        |  64 +++
 MdePkg/Library/BaseLib/X64/CpuPause.S         |  34 ++
 MdePkg/Library/BaseLib/X64/CpuPause.asm       |  37 ++
 MdePkg/Library/BaseLib/X64/CpuSleep.S         |  34 ++
 MdePkg/Library/BaseLib/X64/CpuSleep.asm       |  37 ++
 .../Library/BaseLib/X64/DisableInterrupts.S   |  35 ++
 .../Library/BaseLib/X64/DisableInterrupts.asm |  38 ++
 MdePkg/Library/BaseLib/X64/DisablePaging64.S  |  66 +++
 .../Library/BaseLib/X64/DisablePaging64.asm   |  65 +++
 .../BaseLib/X64/EnableDisableInterrupts.S     |  37 ++
 .../BaseLib/X64/EnableDisableInterrupts.asm   |  39 ++
 MdePkg/Library/BaseLib/X64/EnableInterrupts.S |  35 ++
 .../Library/BaseLib/X64/EnableInterrupts.asm  |  38 ++
 MdePkg/Library/BaseLib/X64/EnablePaging64.S   |  61 +++
 MdePkg/Library/BaseLib/X64/EnablePaging64.asm |  64 +++
 MdePkg/Library/BaseLib/X64/FlushCacheLine.S   |  36 ++
 MdePkg/Library/BaseLib/X64/FlushCacheLine.asm |  39 ++
 MdePkg/Library/BaseLib/X64/FxRestore.S        |  35 ++
 MdePkg/Library/BaseLib/X64/FxRestore.asm      |  38 ++
 MdePkg/Library/BaseLib/X64/FxSave.S           |  35 ++
 MdePkg/Library/BaseLib/X64/FxSave.asm         |  38 ++
 .../X64/InterlockedCompareExchange32.S        |  37 ++
 .../X64/InterlockedCompareExchange32.asm      |  41 ++
 .../X64/InterlockedCompareExchange32.c        |  36 ++
 .../X64/InterlockedCompareExchange64.S        |  39 ++
 .../X64/InterlockedCompareExchange64.asm      |  41 ++
 .../X64/InterlockedCompareExchange64.c        |  36 ++
 .../BaseLib/X64/InterlockedDecrement.S        |  36 ++
 .../BaseLib/X64/InterlockedDecrement.asm      |  39 ++
 .../BaseLib/X64/InterlockedDecrement.c        |  32 ++
 .../BaseLib/X64/InterlockedIncrement.S        |  36 ++
 .../BaseLib/X64/InterlockedIncrement.asm      |  39 ++
 .../BaseLib/X64/InterlockedIncrement.c        |  32 ++
 MdePkg/Library/BaseLib/X64/Invd.S             |  35 ++
 MdePkg/Library/BaseLib/X64/Invd.asm           |  38 ++
 MdePkg/Library/BaseLib/X64/LongJump.S         |  42 ++
 MdePkg/Library/BaseLib/X64/LongJump.asm       |  46 ++
 MdePkg/Library/BaseLib/X64/Monitor.S          |  41 ++
 MdePkg/Library/BaseLib/X64/Monitor.asm        |  43 ++
 MdePkg/Library/BaseLib/X64/Mwait.S            |  39 ++
 MdePkg/Library/BaseLib/X64/Mwait.asm          |  41 ++
 MdePkg/Library/BaseLib/X64/Non-existing.c     | 110 ++++
 MdePkg/Library/BaseLib/X64/ReadCr0.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadCr0.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadCr2.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadCr2.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadCr3.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadCr3.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadCr4.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadCr4.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadCs.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadCs.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDr0.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr0.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDr1.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr1.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDr2.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr2.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDr3.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr3.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDr4.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadDr4.asm        |  42 ++
 MdePkg/Library/BaseLib/X64/ReadDr5.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr5.asm        |  42 ++
 MdePkg/Library/BaseLib/X64/ReadDr6.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr6.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDr7.S          |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDr7.asm        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadDs.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadDs.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadEflags.S       |  37 ++
 MdePkg/Library/BaseLib/X64/ReadEflags.asm     |  39 ++
 MdePkg/Library/BaseLib/X64/ReadEs.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadEs.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadFs.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadFs.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadGdtr.S         |  36 ++
 MdePkg/Library/BaseLib/X64/ReadGdtr.asm       |  38 ++
 MdePkg/Library/BaseLib/X64/ReadGs.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadGs.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadIdtr.S         |  36 ++
 MdePkg/Library/BaseLib/X64/ReadIdtr.asm       |  38 ++
 MdePkg/Library/BaseLib/X64/ReadLdtr.S         |  36 ++
 MdePkg/Library/BaseLib/X64/ReadLdtr.asm       |  38 ++
 MdePkg/Library/BaseLib/X64/ReadMm0.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm0.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm1.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm1.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm2.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm2.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm3.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm3.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm4.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm4.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm5.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm5.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm6.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm6.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMm7.S          |  37 ++
 MdePkg/Library/BaseLib/X64/ReadMm7.asm        |  41 ++
 MdePkg/Library/BaseLib/X64/ReadMsr64.S        |  38 ++
 MdePkg/Library/BaseLib/X64/ReadMsr64.asm      |  40 ++
 MdePkg/Library/BaseLib/X64/ReadMsr64.c        |  31 ++
 MdePkg/Library/BaseLib/X64/ReadPmc.S          |  38 ++
 MdePkg/Library/BaseLib/X64/ReadPmc.asm        |  40 ++
 MdePkg/Library/BaseLib/X64/ReadSs.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadSs.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadTr.S           |  36 ++
 MdePkg/Library/BaseLib/X64/ReadTr.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/ReadTsc.S          |  38 ++
 MdePkg/Library/BaseLib/X64/ReadTsc.asm        |  40 ++
 MdePkg/Library/BaseLib/X64/SetJump.S          |  42 ++
 MdePkg/Library/BaseLib/X64/SetJump.asm        |  54 ++
 MdePkg/Library/BaseLib/X64/SwitchStack.S      |  44 ++
 MdePkg/Library/BaseLib/X64/SwitchStack.asm    |  47 ++
 MdePkg/Library/BaseLib/X64/Thunk16.S          |   0
 MdePkg/Library/BaseLib/X64/Thunk16.asm        | 289 ++++++++++
 MdePkg/Library/BaseLib/X64/Wbinvd.S           |  36 ++
 MdePkg/Library/BaseLib/X64/Wbinvd.asm         |  38 ++
 MdePkg/Library/BaseLib/X64/WriteCr0.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteCr0.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteCr2.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteCr2.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteCr3.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteCr3.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteCr4.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteCr4.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteDr0.S         |  37 ++
 MdePkg/Library/BaseLib/X64/WriteDr0.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteDr1.S         |  37 ++
 MdePkg/Library/BaseLib/X64/WriteDr1.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteDr2.S         |  37 ++
 MdePkg/Library/BaseLib/X64/WriteDr2.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteDr3.S         |  37 ++
 MdePkg/Library/BaseLib/X64/WriteDr3.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteDr4.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteDr4.asm       |  43 ++
 MdePkg/Library/BaseLib/X64/WriteDr5.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteDr5.asm       |  43 ++
 MdePkg/Library/BaseLib/X64/WriteDr6.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteDr6.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteDr7.S         |  36 ++
 MdePkg/Library/BaseLib/X64/WriteDr7.asm       |  39 ++
 MdePkg/Library/BaseLib/X64/WriteGdtr.S        |  35 ++
 MdePkg/Library/BaseLib/X64/WriteGdtr.asm      |  38 ++
 MdePkg/Library/BaseLib/X64/WriteIdtr.S        |  36 ++
 MdePkg/Library/BaseLib/X64/WriteIdtr.asm      |  38 ++
 MdePkg/Library/BaseLib/X64/WriteLdtr.S        |  36 ++
 MdePkg/Library/BaseLib/X64/WriteLdtr.asm      |  38 ++
 MdePkg/Library/BaseLib/X64/WriteMm0.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm0.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm1.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm1.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm2.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm2.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm3.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm3.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm4.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm4.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm5.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm5.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm6.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm6.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMm7.S         |  35 ++
 MdePkg/Library/BaseLib/X64/WriteMm7.asm       |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMsr64.S       |  40 ++
 MdePkg/Library/BaseLib/X64/WriteMsr64.asm     |  41 ++
 MdePkg/Library/BaseLib/X64/WriteMsr64.c       |  32 ++
 .../BaseMemoryLibRepStr/Ia32/CompareMem.S     | 111 ++--
 .../BaseMemoryLibRepStr/Ia32/CompareMem.asm   |   5 -
 .../BaseMemoryLibRepStr/Ia32/CopyMem.S        | 135 +++--
 .../BaseMemoryLibRepStr/Ia32/CopyMem.asm      |   5 -
 .../BaseMemoryLibRepStr/Ia32/ScanMem16.S      | 105 ++--
 .../BaseMemoryLibRepStr/Ia32/ScanMem16.asm    |   5 -
 .../BaseMemoryLibRepStr/Ia32/ScanMem32.S      | 105 ++--
 .../BaseMemoryLibRepStr/Ia32/ScanMem32.asm    |   5 -
 .../BaseMemoryLibRepStr/Ia32/ScanMem64.S      | 123 ++---
 .../BaseMemoryLibRepStr/Ia32/ScanMem64.asm    |   5 -
 .../BaseMemoryLibRepStr/Ia32/ScanMem8.S       | 105 ++--
 .../BaseMemoryLibRepStr/Ia32/ScanMem8.asm     |   5 -
 .../Library/BaseMemoryLibRepStr/Ia32/SetMem.S |  97 ++--
 .../BaseMemoryLibRepStr/Ia32/SetMem.asm       |   5 -
 .../BaseMemoryLibRepStr/Ia32/SetMem16.S       |  91 ++--
 .../BaseMemoryLibRepStr/Ia32/SetMem16.asm     |   5 -
 .../BaseMemoryLibRepStr/Ia32/SetMem32.S       |  91 ++--
 .../BaseMemoryLibRepStr/Ia32/SetMem32.asm     |   5 -
 .../BaseMemoryLibRepStr/Ia32/SetMem64.S       |  97 ++--
 .../BaseMemoryLibRepStr/Ia32/SetMem64.asm     |   5 -
 .../BaseMemoryLibRepStr/Ia32/ZeroMem.S        | 103 ++--
 .../BaseMemoryLibRepStr/Ia32/ZeroMem.asm      |   5 -
 .../BaseMemoryLibRepStr/x64/CompareMem.asm    |  52 ++
 .../BaseMemoryLibRepStr/x64/CopyMem.asm       |  61 +++
 .../BaseMemoryLibRepStr/x64/ScanMem16.asm     |  51 ++
 .../BaseMemoryLibRepStr/x64/ScanMem32.asm     |  51 ++
 .../BaseMemoryLibRepStr/x64/ScanMem64.asm     |  51 ++
 .../BaseMemoryLibRepStr/x64/ScanMem8.asm      |  51 ++
 .../BaseMemoryLibRepStr/x64/SetMem.asm        |  44 ++
 .../BaseMemoryLibRepStr/x64/SetMem16.asm      |  44 ++
 .../BaseMemoryLibRepStr/x64/SetMem32.asm      |  44 ++
 .../BaseMemoryLibRepStr/x64/SetMem64.asm      |  43 ++
 .../BaseMemoryLibRepStr/x64/ZeroMem.asm       |  47 ++
 .../BaseMemoryLibSse2/Ia32/CompareMem.S       | 111 ++--
 .../BaseMemoryLibSse2/Ia32/CompareMem.asm     |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/CopyMem.S  | 175 +++---
 .../BaseMemoryLibSse2/Ia32/CopyMem.asm        |   5 -
 .../BaseMemoryLibSse2/Ia32/ScanMem16.S        | 105 ++--
 .../BaseMemoryLibSse2/Ia32/ScanMem16.asm      |   5 -
 .../BaseMemoryLibSse2/Ia32/ScanMem32.S        | 105 ++--
 .../BaseMemoryLibSse2/Ia32/ScanMem32.asm      |   5 -
 .../BaseMemoryLibSse2/Ia32/ScanMem64.S        | 123 ++---
 .../BaseMemoryLibSse2/Ia32/ScanMem64.asm      |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/ScanMem8.S | 105 ++--
 .../BaseMemoryLibSse2/Ia32/ScanMem8.asm       |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/SetMem.S   | 157 +++---
 .../Library/BaseMemoryLibSse2/Ia32/SetMem.asm |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/SetMem16.S | 143 +++--
 .../BaseMemoryLibSse2/Ia32/SetMem16.asm       |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/SetMem32.S | 141 +++--
 .../BaseMemoryLibSse2/Ia32/SetMem32.asm       |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/SetMem64.S |   5 -
 .../BaseMemoryLibSse2/Ia32/SetMem64.asm       |   5 -
 .../Library/BaseMemoryLibSse2/Ia32/ZeroMem.S  | 135 +++--
 .../BaseMemoryLibSse2/Ia32/ZeroMem.asm        |   5 -
 .../BaseMemoryLibSse2/x64/CompareMem.asm      |  52 ++
 .../Library/BaseMemoryLibSse2/x64/CopyMem.asm |  79 +++
 .../BaseMemoryLibSse2/x64/ScanMem16.asm       |  51 ++
 .../BaseMemoryLibSse2/x64/ScanMem32.asm       |  51 ++
 .../BaseMemoryLibSse2/x64/ScanMem64.asm       |  51 ++
 .../BaseMemoryLibSse2/x64/ScanMem8.asm        |  51 ++
 .../Library/BaseMemoryLibSse2/x64/SetMem.asm  |  69 +++
 .../BaseMemoryLibSse2/x64/SetMem16.asm        |  67 +++
 .../BaseMemoryLibSse2/x64/SetMem32.asm        |  66 +++
 .../BaseMemoryLibSse2/x64/SetMem64.asm        |  59 ++
 .../Library/BaseMemoryLibSse2/x64/ZeroMem.asm |  63 +++
 .../Library/UefiRuntimeLib/UefiRuntimeLib.inf |   8 +-
 MdePkg/MdePkg.dsc                             |  11 +-
 371 files changed, 13464 insertions(+), 2205 deletions(-)
 create mode 100644 MdePkg/Library/BaseLib/Ebc/CpuBreakpoint.c
 create mode 100644 MdePkg/Library/BaseLib/Ebc/SetJumpLongJump.c
 create mode 100644 MdePkg/Library/BaseLib/Ebc/SwitchStack.c
 create mode 100644 MdePkg/Library/BaseLib/Ebc/Synchronization.c
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessDbr.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessEicr.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessGcr.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessGp.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessKr.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessPmr.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AccessPsr.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/AsmPalCall.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/CpuBreakpoint.c
 create mode 100644 MdePkg/Library/BaseLib/Ipf/CpuFlushTlb.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/CpuPause.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/ExecFc.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/FlushCacheRange.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/GetInterruptState.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange32.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange64.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/InternalSwitchStack.c
 create mode 100644 MdePkg/Library/BaseLib/Ipf/PalCallStatic.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/ReadCpuid.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/SwitchStack.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/Synchronization.c
 create mode 100644 MdePkg/Library/BaseLib/Ipf/Unaligned.c
 create mode 100644 MdePkg/Library/BaseLib/Ipf/asm.h
 create mode 100644 MdePkg/Library/BaseLib/Ipf/ia_64gen.h
 create mode 100644 MdePkg/Library/BaseLib/Ipf/longjmp.s
 create mode 100644 MdePkg/Library/BaseLib/Ipf/setjmp.s
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuBreakpoint.S
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuBreakpoint.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuBreakpoint.c
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuFlushTlb.S
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuFlushTlb.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuId.S
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuId.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuIdEx.S
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuIdEx.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuPause.S
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuPause.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuSleep.S
 create mode 100644 MdePkg/Library/BaseLib/X64/CpuSleep.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/DisableInterrupts.S
 create mode 100644 MdePkg/Library/BaseLib/X64/DisableInterrupts.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/DisablePaging64.S
 create mode 100644 MdePkg/Library/BaseLib/X64/DisablePaging64.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.S
 create mode 100644 MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/EnableInterrupts.S
 create mode 100644 MdePkg/Library/BaseLib/X64/EnableInterrupts.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/EnablePaging64.S
 create mode 100644 MdePkg/Library/BaseLib/X64/EnablePaging64.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/FlushCacheLine.S
 create mode 100644 MdePkg/Library/BaseLib/X64/FlushCacheLine.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/FxRestore.S
 create mode 100644 MdePkg/Library/BaseLib/X64/FxRestore.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/FxSave.S
 create mode 100644 MdePkg/Library/BaseLib/X64/FxSave.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.S
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.c
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.S
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.c
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedDecrement.S
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedDecrement.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedDecrement.c
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedIncrement.S
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedIncrement.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/InterlockedIncrement.c
 create mode 100644 MdePkg/Library/BaseLib/X64/Invd.S
 create mode 100644 MdePkg/Library/BaseLib/X64/Invd.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/LongJump.S
 create mode 100644 MdePkg/Library/BaseLib/X64/LongJump.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/Monitor.S
 create mode 100644 MdePkg/Library/BaseLib/X64/Monitor.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/Mwait.S
 create mode 100644 MdePkg/Library/BaseLib/X64/Mwait.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/Non-existing.c
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr0.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr0.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr2.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr2.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr3.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr3.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr4.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCr4.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCs.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadCs.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr0.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr0.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr1.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr1.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr2.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr2.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr3.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr3.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr4.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr4.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr5.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr5.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr6.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr6.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr7.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDr7.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDs.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadDs.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadEflags.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadEflags.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadEs.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadEs.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadFs.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadFs.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadGdtr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadGdtr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadGs.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadGs.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadIdtr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadIdtr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadLdtr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadLdtr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm0.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm0.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm1.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm1.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm2.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm2.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm3.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm3.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm4.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm4.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm5.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm5.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm6.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm6.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm7.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMm7.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMsr64.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMsr64.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadMsr64.c
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadPmc.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadPmc.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadSs.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadSs.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadTr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadTr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadTsc.S
 create mode 100644 MdePkg/Library/BaseLib/X64/ReadTsc.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/SetJump.S
 create mode 100644 MdePkg/Library/BaseLib/X64/SetJump.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/SwitchStack.S
 create mode 100644 MdePkg/Library/BaseLib/X64/SwitchStack.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/Thunk16.S
 create mode 100644 MdePkg/Library/BaseLib/X64/Thunk16.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/Wbinvd.S
 create mode 100644 MdePkg/Library/BaseLib/X64/Wbinvd.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr0.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr0.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr2.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr2.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr3.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr3.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr4.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteCr4.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr0.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr0.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr1.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr1.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr2.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr2.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr3.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr3.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr4.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr4.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr5.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr5.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr6.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr6.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr7.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteDr7.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteGdtr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteGdtr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteIdtr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteIdtr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteLdtr.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteLdtr.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm0.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm0.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm1.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm1.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm2.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm2.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm3.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm3.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm4.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm4.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm5.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm5.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm6.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm6.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm7.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMm7.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMsr64.S
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMsr64.asm
 create mode 100644 MdePkg/Library/BaseLib/X64/WriteMsr64.c
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/CompareMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/CopyMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem16.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem32.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem64.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem8.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem16.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem32.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem64.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibRepStr/x64/ZeroMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm
 create mode 100644 MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm

diff --git a/MdePkg/Library/BaseLib/Ebc/CpuBreakpoint.c b/MdePkg/Library/BaseLib/Ebc/CpuBreakpoint.c
new file mode 100644
index 0000000000..352e1c7c1f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ebc/CpuBreakpoint.c
@@ -0,0 +1,164 @@
+/** @file
+  Base Library CPU Functions for EBC
+
+  Copyright (c) 2006, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+extern
+UINT64
+_break (
+  CHAR8 BreakCode
+  );
+
+/**
+  Generates a breakpoint on the CPU.
+
+  Generates a breakpoint on the CPU. The breakpoint must be implemented such
+  that code can resume normal execution after the breakpoint.
+
+**/
+VOID
+EFIAPI
+CpuBreakpoint (
+  VOID
+  )
+{
+  _break (3);
+}
+
+/**
+  Used to serialize load and store operations.
+
+  All loads and stores that proceed calls to this function are guaranteed to be
+  globally visible when this function returns.
+
+**/
+VOID
+EFIAPI
+MemoryFence (
+  VOID
+  )
+{
+}
+
+/**
+  Disables CPU interrupts.
+
+  Disables CPU interrupts.
+
+**/
+VOID
+EFIAPI
+DisableInterrupts (
+  VOID
+  )
+{
+  ASSERT (FALSE);
+}
+
+/**
+  Enables CPU interrupts.
+
+  Enables CPU interrupts.
+
+**/
+VOID
+EFIAPI
+EnableInterrupts (
+  VOID
+  )
+{
+  ASSERT (FALSE);
+}
+
+/**
+  Retrieves the current CPU interrupt state.
+
+  Retrieves the current CPU interrupt state. Returns TRUE is interrupts are
+  currently enabled. Otherwise returns FALSE.
+
+  @retval TRUE  CPU interrupts are enabled.
+  @retval FALSE CPU interrupts are disabled.
+
+**/
+BOOLEAN
+EFIAPI
+GetInterruptState (
+  VOID
+  )
+{
+  ASSERT (FALSE);
+  return FALSE;
+}
+
+/**
+  Enables CPU interrupts for the smallest window required to capture any
+  pending interrupts.
+
+  Enables CPU interrupts for the smallest window required to capture any
+  pending interrupts.
+
+**/
+VOID
+EFIAPI
+EnableDisableInterrupts (
+  VOID
+  )
+{
+  EnableInterrupts ();
+  DisableInterrupts ();
+}
+
+/**
+  Requests CPU to pause for a short period of time.
+
+  Requests CPU to pause for a short period of time. Typically used in MP
+  systems to prevent memory starvation while waiting for a spin lock.
+
+**/
+VOID
+EFIAPI
+CpuPause (
+  VOID
+  )
+{
+}
+
+/**
+  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
+
+  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
+
+**/
+VOID
+EFIAPI
+CpuFlushTlb (
+  VOID
+  )
+{
+  ASSERT (FALSE);
+}
+
+/**
+  Places the CPU in a sleep state until an interrupt is received.
+
+  Places the CPU in a sleep state until an interrupt is received. If interrupts
+  are disabled prior to calling this function, then the CPU will be placed in a
+  sleep state indefinitely.
+
+**/
+VOID
+EFIAPI
+CpuSleep (
+  VOID
+  )
+{
+}
diff --git a/MdePkg/Library/BaseLib/Ebc/SetJumpLongJump.c b/MdePkg/Library/BaseLib/Ebc/SetJumpLongJump.c
new file mode 100644
index 0000000000..b485d3e495
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ebc/SetJumpLongJump.c
@@ -0,0 +1,78 @@
+/** @file
+  Switch Stack functions.
+
+  Copyright (c) 2006, Intel Corporation
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  SetJumpLongJump.c
+
+**/
+
+/**
+  Worker function that checks ASSERT condition for JumpBuffer
+
+  Checks ASSERT condition for JumpBuffer.
+
+  If JumpBuffer is NULL, then ASSERT().
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
+
+  @param  JumpBuffer    A pointer to CPU context buffer.
+
+**/
+VOID
+InternalAssertJumpBuffer (
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
+  );
+
+/**
+  Saves the current CPU context that can be restored with a call to LongJump() and returns 0.
+
+  Saves the current CPU context in the buffer specified by JumpBuffer and returns 0.  The initial 
+  call to SetJump() must always return 0.  Subsequent calls to LongJump() cause a non-zero 
+  value to be returned by SetJump(). 
+
+  If JumpBuffer is NULL, then ASSERT().
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
+
+  @param  JumpBuffer    A pointer to CPU context buffer.
+ 
+**/
+UINTN
+EFIAPI
+SetJump (
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
+  )
+{
+  InternalAssertJumpBuffer (JumpBuffer);
+  return 0;
+}
+
+/**
+  Restores the CPU context that was saved with SetJump().
+
+  Restores the CPU context from the buffer specified by JumpBuffer.
+  This function never returns to the caller.
+  Instead is resumes execution based on the state of JumpBuffer.
+
+  @param  JumpBuffer    A pointer to CPU context buffer.
+  @param  Value         The value to return when the SetJump() context is restored.
+
+**/
+VOID
+EFIAPI
+InternalLongJump (
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
+  IN      UINTN                     Value
+  )
+{
+  //
+  // This function cannot work on EBC
+  //
+  ASSERT (FALSE);
+}
diff --git a/MdePkg/Library/BaseLib/Ebc/SwitchStack.c b/MdePkg/Library/BaseLib/Ebc/SwitchStack.c
new file mode 100644
index 0000000000..d2861c4f85
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ebc/SwitchStack.c
@@ -0,0 +1,64 @@
+/** @file
+  Switch Stack functions.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  SwitchStack.c
+
+**/
+
+/**
+  Transfers control to a function starting with a new stack.
+
+  Transfers control to the function specified by EntryPoint using the
+  new stack specified by NewStack and passing in the parameters specified
+  by Context1 and Context2.  Context1 and Context2 are optional and may
+  be NULL.  The function EntryPoint must never return.
+  Marker will be ignored on IA-32, x64, and EBC.
+  IPF CPUs expect one additional parameter of type VOID * that specifies
+  the new backing store pointer.
+
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  @param  EntryPoint  A pointer to function to call with the new stack.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function.
+  @param  Marker      VA_LIST marker for the variable argument list.
+
+**/
+VOID
+EFIAPI
+InternalSwitchStack (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,   OPTIONAL
+  IN      VOID                      *Context2,   OPTIONAL
+  IN      VOID                      *NewStack,
+  IN      VA_LIST                   Marker
+  )
+
+{
+  //
+  // This version of this function does not actually change the stack pointer
+  // This is to support compilation of CPU types that do not support assemblers
+  // such as EBC
+  //
+
+  //
+  // Stack should be aligned with CPU_STACK_ALIGNMENT
+  //
+  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
+
+  EntryPoint (Context1, Context2);
+}
diff --git a/MdePkg/Library/BaseLib/Ebc/Synchronization.c b/MdePkg/Library/BaseLib/Ebc/Synchronization.c
new file mode 100644
index 0000000000..5d5bc2ff11
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ebc/Synchronization.c
@@ -0,0 +1,99 @@
+/** @file
+  Implementation of synchronization functions on EBC.
+
+  Copyright (c) 2006, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  Synchronization.c
+
+**/
+
+UINT32
+EFIAPI
+InternalSyncCompareExchange32 (
+  IN      volatile UINT32           *Value,
+  IN      UINT32                    CompareValue,
+  IN      UINT32                    ExchangeValue
+  )
+{
+  return *Value != CompareValue ? *Value :
+           ((*Value = ExchangeValue), CompareValue);
+}
+
+/**
+  Performs an atomic compare exchange operation on a 64-bit unsigned integer.
+
+  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified 
+  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and 
+  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned. 
+  The compare exchange operation must be performed using MP safe mechanisms.
+
+  @param  Value         A pointer to the 64-bit value for the compare exchange
+                        operation.
+  @param  CompareValue  64-bit value used in compare operation.
+  @param  ExchangeValue 64-bit value used in exchange operation.
+
+  @return The original *Value before exchange.
+
+**/
+UINT64
+EFIAPI
+InternalSyncCompareExchange64 (
+  IN      volatile UINT64           *Value,
+  IN      UINT64                    CompareValue,
+  IN      UINT64                    ExchangeValue
+  )
+{
+  return *Value != CompareValue ? *Value :
+           ((*Value = ExchangeValue), CompareValue);
+}
+
+/**
+  Performs an atomic increment of an 32-bit unsigned integer.
+
+  Performs an atomic increment of the 32-bit unsigned integer specified by
+  Value and returns the incremented value. The increment operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  @param  Value A pointer to the 32-bit value to increment.
+
+  @return The incremented value.
+
+**/
+UINT32
+EFIAPI
+InternalSyncIncrement (
+  IN      volatile UINT32           *Value
+  )
+{
+  return ++*Value;
+}
+
+/**
+  Performs an atomic decrement of an 32-bit unsigned integer.
+
+  Performs an atomic decrement of the 32-bit unsigned integer specified by
+  Value and returns the decrement value. The decrement operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  @param  Value A pointer to the 32-bit value to decrement.
+
+  @return The decrement value.
+
+**/
+UINT32
+EFIAPI
+InternalSyncDecrement (
+  IN      volatile UINT32           *Value
+  )
+{
+  return --*Value;
+}
diff --git a/MdePkg/Library/BaseLib/Ia32/ARShiftU64.S b/MdePkg/Library/BaseLib/Ia32/ARShiftU64.S
index 84762082ba..5498d2e991 100644
--- a/MdePkg/Library/BaseLib/Ia32/ARShiftU64.S
+++ b/MdePkg/Library/BaseLib/Ia32/ARShiftU64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/CpuBreakpoint.S b/MdePkg/Library/BaseLib/Ia32/CpuBreakpoint.S
index 59a1143259..e82434b670 100644
--- a/MdePkg/Library/BaseLib/Ia32/CpuBreakpoint.S
+++ b/MdePkg/Library/BaseLib/Ia32/CpuBreakpoint.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------ ;
 # Copyright (c) 2006, Intel Corporation
 # All rights reserved. This program and the accompanying materials
diff --git a/MdePkg/Library/BaseLib/Ia32/CpuFlushTlb.S b/MdePkg/Library/BaseLib/Ia32/CpuFlushTlb.S
index 07550ff412..f8b1cdc7ee 100644
--- a/MdePkg/Library/BaseLib/Ia32/CpuFlushTlb.S
+++ b/MdePkg/Library/BaseLib/Ia32/CpuFlushTlb.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------ ;
 # Copyright (c) 2006, Intel Corporation
 # All rights reserved. This program and the accompanying materials
diff --git a/MdePkg/Library/BaseLib/Ia32/CpuId.S b/MdePkg/Library/BaseLib/Ia32/CpuId.S
index 2373ad1a8e..6f41e72227 100644
--- a/MdePkg/Library/BaseLib/Ia32/CpuId.S
+++ b/MdePkg/Library/BaseLib/Ia32/CpuId.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/CpuIdEx.S b/MdePkg/Library/BaseLib/Ia32/CpuIdEx.S
index 2d7ec493cf..48554cc96b 100644
--- a/MdePkg/Library/BaseLib/Ia32/CpuIdEx.S
+++ b/MdePkg/Library/BaseLib/Ia32/CpuIdEx.S
@@ -1,72 +1,67 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   CpuIdEx.Asm
-#
-# Abstract:
-#
-#   AsmCpuidEx function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-    .686:
-    .code:
-
-#------------------------------------------------------------------------------
-#  UINT32
-#  EFIAPI
-#  AsmCpuidEx (
-#    IN   UINT32  RegisterInEax,
-#    IN   UINT32  RegisterInEcx,
-#    OUT  UINT32  *RegisterOutEax  OPTIONAL,
-#    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
-#    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
-#    OUT  UINT32  *RegisterOutEdx  OPTIONAL
-#    )
-#------------------------------------------------------------------------------
-.globl ASM_PFX(AsmCpuidEx)
-ASM_PFX(AsmCpuidEx):
-    push    %ebx
-    push    %ebp
-    movl    %esp, %ebp
-    movl    12(%ebp), %eax
-    movl    16(%ebp), %ecx
-    cpuid
-    push    %ecx
-    movl    20(%ebp), %ecx
-    jecxz   L1
-    movl    %eax, (%ecx)
-L1:
-    movl    24(%ebp), %ecx
-    jecxz   L2
-    movl    %ebx, (%ecx)
-L2:
-    movl    28(%ebp), %ecx
-    jecxz   L3
-    popl    (%ecx)
-L3:
-    movl    32(%ebp), %edx
-    jecxz   L4
-    movl    %edx, (%ecx)
-L4:
-    movl    12(%ebp), %eax
-    leave
-    pop     %ebx
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuIdEx.Asm
+#
+# Abstract:
+#
+#   AsmCpuidEx function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+    .686:
+    .code:
+
+#------------------------------------------------------------------------------
+#  UINT32
+#  EFIAPI
+#  AsmCpuidEx (
+#    IN   UINT32  RegisterInEax,
+#    IN   UINT32  RegisterInEcx,
+#    OUT  UINT32  *RegisterOutEax  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEdx  OPTIONAL
+#    )
+#------------------------------------------------------------------------------
+.globl ASM_PFX(AsmCpuidEx)
+ASM_PFX(AsmCpuidEx):
+    push    %ebx
+    push    %ebp
+    movl    %esp, %ebp
+    movl    12(%ebp), %eax
+    movl    16(%ebp), %ecx
+    cpuid
+    push    %ecx
+    movl    20(%ebp), %ecx
+    jecxz   L1
+    movl    %eax, (%ecx)
+L1:
+    movl    24(%ebp), %ecx
+    jecxz   L2
+    movl    %ebx, (%ecx)
+L2:
+    movl    28(%ebp), %ecx
+    jecxz   L3
+    popl    (%ecx)
+L3:
+    movl    32(%ebp), %edx
+    jecxz   L4
+    movl    %edx, (%ecx)
+L4:
+    movl    12(%ebp), %eax
+    leave
+    pop     %ebx
+    ret
diff --git a/MdePkg/Library/BaseLib/Ia32/CpuPause.S b/MdePkg/Library/BaseLib/Ia32/CpuPause.S
index 3661b1ff86..5fef9c8d5c 100644
--- a/MdePkg/Library/BaseLib/Ia32/CpuPause.S
+++ b/MdePkg/Library/BaseLib/Ia32/CpuPause.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------ ;
 # Copyright (c) 2006, Intel Corporation
 # All rights reserved. This program and the accompanying materials
diff --git a/MdePkg/Library/BaseLib/Ia32/CpuSleep.S b/MdePkg/Library/BaseLib/Ia32/CpuSleep.S
index 8bf9d55ba7..ac39e8fcba 100644
--- a/MdePkg/Library/BaseLib/Ia32/CpuSleep.S
+++ b/MdePkg/Library/BaseLib/Ia32/CpuSleep.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------ ;
 # Copyright (c) 2006, Intel Corporation
 # All rights reserved. This program and the accompanying materials
diff --git a/MdePkg/Library/BaseLib/Ia32/DisableInterrupts.S b/MdePkg/Library/BaseLib/Ia32/DisableInterrupts.S
index 3a7a81d1b6..ea04225fd6 100644
--- a/MdePkg/Library/BaseLib/Ia32/DisableInterrupts.S
+++ b/MdePkg/Library/BaseLib/Ia32/DisableInterrupts.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/DisablePaging32.S b/MdePkg/Library/BaseLib/Ia32/DisablePaging32.S
index f950b058b3..7898e8103a 100644
--- a/MdePkg/Library/BaseLib/Ia32/DisablePaging32.S
+++ b/MdePkg/Library/BaseLib/Ia32/DisablePaging32.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/DivU64x32.S b/MdePkg/Library/BaseLib/Ia32/DivU64x32.S
index 170819858e..b858278e64 100644
--- a/MdePkg/Library/BaseLib/Ia32/DivU64x32.S
+++ b/MdePkg/Library/BaseLib/Ia32/DivU64x32.S
@@ -1,46 +1,41 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   DivU64x32.asm
-#
-# Abstract:
-#
-#   Calculate the quotient of a 64-bit integer by a 32-bit integer
-#
-#------------------------------------------------------------------------------
-
-.globl ASM_PFX(InternalMathDivU64x32)
-
-#------------------------------------------------------------------------------
-# UINT64
-# EFIAPI
-# InternalMathDivU64x32 (
-#   IN      UINT64                    Dividend,
-#   IN      UINT32                    Divisor
-#   );
-#------------------------------------------------------------------------------
-ASM_PFX(InternalMathDivU64x32):
-    movl    8(%esp), %eax
-    movl    12(%esp), %ecx
-    xorl    %edx, %edx
-    divl    %ecx
-    push    %eax
-    movl    8(%esp), %eax
-    divl    %ecx
-    pop     %edx
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   DivU64x32.asm
+#
+# Abstract:
+#
+#   Calculate the quotient of a 64-bit integer by a 32-bit integer
+#
+#------------------------------------------------------------------------------
+
+.globl ASM_PFX(InternalMathDivU64x32)
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# InternalMathDivU64x32 (
+#   IN      UINT64                    Dividend,
+#   IN      UINT32                    Divisor
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(InternalMathDivU64x32):
+    movl    8(%esp), %eax
+    movl    12(%esp), %ecx
+    xorl    %edx, %edx
+    divl    %ecx
+    push    %eax
+    movl    8(%esp), %eax
+    divl    %ecx
+    pop     %edx
+    ret
diff --git a/MdePkg/Library/BaseLib/Ia32/DivU64x32Remainder.S b/MdePkg/Library/BaseLib/Ia32/DivU64x32Remainder.S
index 987e0ead89..974373d284 100644
--- a/MdePkg/Library/BaseLib/Ia32/DivU64x32Remainder.S
+++ b/MdePkg/Library/BaseLib/Ia32/DivU64x32Remainder.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S b/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S
index 36008bf567..cac7169d58 100644
--- a/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S
+++ b/MdePkg/Library/BaseLib/Ia32/DivU64x64Remainder.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/EnableDisableInterrupts.S b/MdePkg/Library/BaseLib/Ia32/EnableDisableInterrupts.S
index 2799832d24..c5742aee53 100644
--- a/MdePkg/Library/BaseLib/Ia32/EnableDisableInterrupts.S
+++ b/MdePkg/Library/BaseLib/Ia32/EnableDisableInterrupts.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/EnableInterrupts.S b/MdePkg/Library/BaseLib/Ia32/EnableInterrupts.S
index 2c83e261a4..2d608036f7 100644
--- a/MdePkg/Library/BaseLib/Ia32/EnableInterrupts.S
+++ b/MdePkg/Library/BaseLib/Ia32/EnableInterrupts.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/EnablePaging32.S b/MdePkg/Library/BaseLib/Ia32/EnablePaging32.S
index 054a5c9d06..df5d67cfac 100644
--- a/MdePkg/Library/BaseLib/Ia32/EnablePaging32.S
+++ b/MdePkg/Library/BaseLib/Ia32/EnablePaging32.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/EnablePaging64.S b/MdePkg/Library/BaseLib/Ia32/EnablePaging64.S
index 44b7e16558..ffa9beb0a1 100644
--- a/MdePkg/Library/BaseLib/Ia32/EnablePaging64.S
+++ b/MdePkg/Library/BaseLib/Ia32/EnablePaging64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/EnablePaging64.asm b/MdePkg/Library/BaseLib/Ia32/EnablePaging64.asm
index 3755c0585b..435bb39105 100644
--- a/MdePkg/Library/BaseLib/Ia32/EnablePaging64.asm
+++ b/MdePkg/Library/BaseLib/Ia32/EnablePaging64.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/FlushCacheLine.S b/MdePkg/Library/BaseLib/Ia32/FlushCacheLine.S
index b8c87c23c1..07a92619d2 100644
--- a/MdePkg/Library/BaseLib/Ia32/FlushCacheLine.S
+++ b/MdePkg/Library/BaseLib/Ia32/FlushCacheLine.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/FxRestore.S b/MdePkg/Library/BaseLib/Ia32/FxRestore.S
index 4560751c62..9cfa14be0f 100644
--- a/MdePkg/Library/BaseLib/Ia32/FxRestore.S
+++ b/MdePkg/Library/BaseLib/Ia32/FxRestore.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/FxSave.S b/MdePkg/Library/BaseLib/Ia32/FxSave.S
index 343db36a9f..8857a8ec77 100644
--- a/MdePkg/Library/BaseLib/Ia32/FxSave.S
+++ b/MdePkg/Library/BaseLib/Ia32/FxSave.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange32.S b/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange32.S
index 0abb605aa3..a0a6ad9eb0 100644
--- a/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange32.S
+++ b/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange32.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange64.S b/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange64.S
index ee3278ca09..98a20a5e29 100644
--- a/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange64.S
+++ b/MdePkg/Library/BaseLib/Ia32/InterlockedCompareExchange64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/InterlockedDecrement.S b/MdePkg/Library/BaseLib/Ia32/InterlockedDecrement.S
index a92ea6ba37..dc8f7215cc 100644
--- a/MdePkg/Library/BaseLib/Ia32/InterlockedDecrement.S
+++ b/MdePkg/Library/BaseLib/Ia32/InterlockedDecrement.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/InterlockedIncrement.S b/MdePkg/Library/BaseLib/Ia32/InterlockedIncrement.S
index 88c35d5c0c..ecbbc7540c 100644
--- a/MdePkg/Library/BaseLib/Ia32/InterlockedIncrement.S
+++ b/MdePkg/Library/BaseLib/Ia32/InterlockedIncrement.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/Invd.S b/MdePkg/Library/BaseLib/Ia32/Invd.S
index 4e85d2935f..0a0c1a244a 100644
--- a/MdePkg/Library/BaseLib/Ia32/Invd.S
+++ b/MdePkg/Library/BaseLib/Ia32/Invd.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/LRotU64.S b/MdePkg/Library/BaseLib/Ia32/LRotU64.S
index fe3ab60af6..3b866e2700 100644
--- a/MdePkg/Library/BaseLib/Ia32/LRotU64.S
+++ b/MdePkg/Library/BaseLib/Ia32/LRotU64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/LShiftU64.S b/MdePkg/Library/BaseLib/Ia32/LShiftU64.S
index 9c93242bd4..a4b99eb80a 100644
--- a/MdePkg/Library/BaseLib/Ia32/LShiftU64.S
+++ b/MdePkg/Library/BaseLib/Ia32/LShiftU64.S
@@ -1,46 +1,41 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   LShiftU64.asm
-#
-# Abstract:
-#
-#   64-bit left shift function for IA-32
-#
-#------------------------------------------------------------------------------
-
-.globl ASM_PFX(InternalMathLShiftU64)
-
-#------------------------------------------------------------------------------
-# UINT64
-# EFIAPI
-# InternalMathLShiftU64 (
-#   IN      UINT64                    Operand,
-#   IN      UINTN                     Count
-#   );
-#------------------------------------------------------------------------------
-ASM_PFX(InternalMathLShiftU64):
-    movb    12(%esp), %cl
-    xorl    %eax, %eax
-    movl    4(%esp), %edx
-    testb   $32, %cl
-    cmovz   %edx, %eax
-    cmovz   0x8(%esp), %edx
-    shld    %cl, %eax, %edx
-    shl     %cl, %eax
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   LShiftU64.asm
+#
+# Abstract:
+#
+#   64-bit left shift function for IA-32
+#
+#------------------------------------------------------------------------------
+
+.globl ASM_PFX(InternalMathLShiftU64)
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# InternalMathLShiftU64 (
+#   IN      UINT64                    Operand,
+#   IN      UINTN                     Count
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(InternalMathLShiftU64):
+    movb    12(%esp), %cl
+    xorl    %eax, %eax
+    movl    4(%esp), %edx
+    testb   $32, %cl
+    cmovz   %edx, %eax
+    cmovz   0x8(%esp), %edx
+    shld    %cl, %eax, %edx
+    shl     %cl, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/Ia32/LongJump.S b/MdePkg/Library/BaseLib/Ia32/LongJump.S
index 95dd444913..0b76896085 100644
--- a/MdePkg/Library/BaseLib/Ia32/LongJump.S
+++ b/MdePkg/Library/BaseLib/Ia32/LongJump.S
@@ -1,46 +1,41 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   LongJump.Asm
-#
-# Abstract:
-#
-#   Implementation of _LongJump() on IA-32.
-#
-#------------------------------------------------------------------------------
-
-.globl ASM_PFX(InternalLongJump)
-
-#------------------------------------------------------------------------------
-# VOID
-# EFIAPI
-# InternalLongJump (
-#   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
-#   IN      UINTN                     Value
-#   );
-#------------------------------------------------------------------------------
-ASM_PFX(InternalLongJump):
-    pop     %eax
-    pop     %edx
-    pop     %eax
-    movl    (%edx), %ebx
-    movl    4(%edx), %esi
-    movl    8(%edx), %edi
-    movl    12(%edx), %ebp
-    movl    16(%edx), %esp
-    jmp     *20(%edx)
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   LongJump.Asm
+#
+# Abstract:
+#
+#   Implementation of _LongJump() on IA-32.
+#
+#------------------------------------------------------------------------------
+
+.globl ASM_PFX(InternalLongJump)
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalLongJump (
+#   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
+#   IN      UINTN                     Value
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(InternalLongJump):
+    pop     %eax
+    pop     %edx
+    pop     %eax
+    movl    (%edx), %ebx
+    movl    4(%edx), %esi
+    movl    8(%edx), %edi
+    movl    12(%edx), %ebp
+    movl    16(%edx), %esp
+    jmp     *20(%edx)
diff --git a/MdePkg/Library/BaseLib/Ia32/ModU64x32.S b/MdePkg/Library/BaseLib/Ia32/ModU64x32.S
index decfeaac3b..00dc6a08ab 100644
--- a/MdePkg/Library/BaseLib/Ia32/ModU64x32.S
+++ b/MdePkg/Library/BaseLib/Ia32/ModU64x32.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/Monitor.S b/MdePkg/Library/BaseLib/Ia32/Monitor.S
index 2651124ea3..6e9284dcd4 100644
--- a/MdePkg/Library/BaseLib/Ia32/Monitor.S
+++ b/MdePkg/Library/BaseLib/Ia32/Monitor.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/MultU64x32.S b/MdePkg/Library/BaseLib/Ia32/MultU64x32.S
index 5c44957838..b9d1eb8ca7 100644
--- a/MdePkg/Library/BaseLib/Ia32/MultU64x32.S
+++ b/MdePkg/Library/BaseLib/Ia32/MultU64x32.S
@@ -1,46 +1,41 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   MultU64x32.asm
-#
-# Abstract:
-#
-#   Calculate the product of a 64-bit integer and a 32-bit integer
-#
-#------------------------------------------------------------------------------
-
-    .386:
-    .code:
-
-.globl ASM_PFX(InternalMathMultU64x32)
-
-#------------------------------------------------------------------------------
-# UINT64
-# EFIAPI
-# InternalMathMultU64x32 (
-#   IN      UINT64                    Multiplicand,
-#   IN      UINT32                    Multiplier
-#   );
-#------------------------------------------------------------------------------
-ASM_PFX(InternalMathMultU64x32):
-    movl    12(%esp), %ecx
-    movl    %ecx, %eax
-    imull   8(%esp), %ecx
-    mull    0x4(%esp)
-    addl    %ecx, %edx
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   MultU64x32.asm
+#
+# Abstract:
+#
+#   Calculate the product of a 64-bit integer and a 32-bit integer
+#
+#------------------------------------------------------------------------------
+
+    .386:
+    .code:
+
+.globl ASM_PFX(InternalMathMultU64x32)
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# InternalMathMultU64x32 (
+#   IN      UINT64                    Multiplicand,
+#   IN      UINT32                    Multiplier
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(InternalMathMultU64x32):
+    movl    12(%esp), %ecx
+    movl    %ecx, %eax
+    imull   8(%esp), %ecx
+    mull    0x4(%esp)
+    addl    %ecx, %edx
+    ret
diff --git a/MdePkg/Library/BaseLib/Ia32/MultU64x64.S b/MdePkg/Library/BaseLib/Ia32/MultU64x64.S
index 40dda6f1a4..03523865f6 100644
--- a/MdePkg/Library/BaseLib/Ia32/MultU64x64.S
+++ b/MdePkg/Library/BaseLib/Ia32/MultU64x64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/Mwait.S b/MdePkg/Library/BaseLib/Ia32/Mwait.S
index 80782b7f84..12f6a87511 100644
--- a/MdePkg/Library/BaseLib/Ia32/Mwait.S
+++ b/MdePkg/Library/BaseLib/Ia32/Mwait.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/RRotU64.S b/MdePkg/Library/BaseLib/Ia32/RRotU64.S
index 7e8984287a..35935639b9 100644
--- a/MdePkg/Library/BaseLib/Ia32/RRotU64.S
+++ b/MdePkg/Library/BaseLib/Ia32/RRotU64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/RShiftU64.S b/MdePkg/Library/BaseLib/Ia32/RShiftU64.S
index 7d58fd6c47..ca78394e39 100644
--- a/MdePkg/Library/BaseLib/Ia32/RShiftU64.S
+++ b/MdePkg/Library/BaseLib/Ia32/RShiftU64.S
@@ -1,49 +1,44 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   RShiftU64.asm
-#
-# Abstract:
-#
-#   64-bit logical right shift function for IA-32
-#
-#------------------------------------------------------------------------------
-
-    .686:
-    .code:
-
-.globl ASM_PFX(InternalMathRShiftU64)
-
-#------------------------------------------------------------------------------
-# UINT64
-# EFIAPI
-# InternalMathRShiftU64 (
-#   IN      UINT64                    Operand,
-#   IN      UINTN                     Count
-#   );
-#------------------------------------------------------------------------------
-ASM_PFX(InternalMathRShiftU64):
-    movb    12(%esp), %cl
-    xorl    %edx, %edx
-    movl    8(%esp), %eax
-    testb   $32, %cl
-    cmovz   %eax, %edx
-    cmovz   0x4(%esp), %eax
-    shrdl   %cl, %edx, %eax
-    shr     %cl, %edx
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   RShiftU64.asm
+#
+# Abstract:
+#
+#   64-bit logical right shift function for IA-32
+#
+#------------------------------------------------------------------------------
+
+    .686:
+    .code:
+
+.globl ASM_PFX(InternalMathRShiftU64)
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# InternalMathRShiftU64 (
+#   IN      UINT64                    Operand,
+#   IN      UINTN                     Count
+#   );
+#------------------------------------------------------------------------------
+ASM_PFX(InternalMathRShiftU64):
+    movb    12(%esp), %cl
+    xorl    %edx, %edx
+    movl    8(%esp), %eax
+    testb   $32, %cl
+    cmovz   %eax, %edx
+    cmovz   0x4(%esp), %eax
+    shrdl   %cl, %edx, %eax
+    shr     %cl, %edx
+    ret
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadCr0.S b/MdePkg/Library/BaseLib/Ia32/ReadCr0.S
index b08c7d75a7..3433344b7b 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadCr0.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadCr0.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadCr2.S b/MdePkg/Library/BaseLib/Ia32/ReadCr2.S
index 0b82a25906..d308895367 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadCr2.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadCr2.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadCr3.S b/MdePkg/Library/BaseLib/Ia32/ReadCr3.S
index f973dbef23..aaec1f01d0 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadCr3.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadCr3.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadCr4.S b/MdePkg/Library/BaseLib/Ia32/ReadCr4.S
index ee94991e8c..442d359eda 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadCr4.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadCr4.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadCs.S b/MdePkg/Library/BaseLib/Ia32/ReadCs.S
index 7406cfba3a..a3ad69d304 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadCs.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadCs.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr0.S b/MdePkg/Library/BaseLib/Ia32/ReadDr0.S
index 1ba42d9e65..d4c61f1484 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr0.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr0.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr1.S b/MdePkg/Library/BaseLib/Ia32/ReadDr1.S
index 4fe89da5d7..27c5554257 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr1.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr1.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr2.S b/MdePkg/Library/BaseLib/Ia32/ReadDr2.S
index 916fad740d..cca84b9efd 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr2.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr2.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr3.S b/MdePkg/Library/BaseLib/Ia32/ReadDr3.S
index 3505589441..60b0550381 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr3.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr3.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr4.S b/MdePkg/Library/BaseLib/Ia32/ReadDr4.S
index 44c56aa624..84883df971 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr4.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr4.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr5.S b/MdePkg/Library/BaseLib/Ia32/ReadDr5.S
index 3a012256ef..5abb226b91 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr5.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr5.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr6.S b/MdePkg/Library/BaseLib/Ia32/ReadDr6.S
index e5857b055a..9594851c7e 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr6.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr6.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDr7.S b/MdePkg/Library/BaseLib/Ia32/ReadDr7.S
index 8054b968f1..4ba13efcb4 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDr7.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDr7.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadDs.S b/MdePkg/Library/BaseLib/Ia32/ReadDs.S
index 41e6bd4d92..c3dc8451ad 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadDs.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadDs.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadEflags.S b/MdePkg/Library/BaseLib/Ia32/ReadEflags.S
index 95b219159f..ab5e522739 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadEflags.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadEflags.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadEs.S b/MdePkg/Library/BaseLib/Ia32/ReadEs.S
index ed60065fa2..26ed55d9e1 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadEs.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadEs.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadFs.S b/MdePkg/Library/BaseLib/Ia32/ReadFs.S
index 19d89ef7b3..bd38c6ac10 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadFs.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadFs.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadGdtr.S b/MdePkg/Library/BaseLib/Ia32/ReadGdtr.S
index ba6564c38a..8869164606 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadGdtr.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadGdtr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadGs.S b/MdePkg/Library/BaseLib/Ia32/ReadGs.S
index 1862596288..82b396661d 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadGs.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadGs.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadIdtr.S b/MdePkg/Library/BaseLib/Ia32/ReadIdtr.S
index 7880e7a8af..0e5d32e3d8 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadIdtr.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadIdtr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadLdtr.S b/MdePkg/Library/BaseLib/Ia32/ReadLdtr.S
index 301edbdced..addb1757d0 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadLdtr.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadLdtr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm0.S b/MdePkg/Library/BaseLib/Ia32/ReadMm0.S
index c6434fcc79..f191337f68 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm0.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm0.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm1.S b/MdePkg/Library/BaseLib/Ia32/ReadMm1.S
index 775a517219..790541aaeb 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm1.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm1.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm2.S b/MdePkg/Library/BaseLib/Ia32/ReadMm2.S
index 7c23a67f68..231d62c762 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm2.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm2.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm3.S b/MdePkg/Library/BaseLib/Ia32/ReadMm3.S
index ad888b1be1..1e1f6dd684 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm3.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm3.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm4.S b/MdePkg/Library/BaseLib/Ia32/ReadMm4.S
index a69e914957..5da446befe 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm4.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm4.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm5.S b/MdePkg/Library/BaseLib/Ia32/ReadMm5.S
index bc047a157f..5528fe1812 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm5.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm5.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm6.S b/MdePkg/Library/BaseLib/Ia32/ReadMm6.S
index a16871779f..5d9bd11269 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm6.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm6.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMm7.S b/MdePkg/Library/BaseLib/Ia32/ReadMm7.S
index c273279171..26866b6a09 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMm7.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMm7.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadMsr64.S b/MdePkg/Library/BaseLib/Ia32/ReadMsr64.S
index e0655b2077..505b7e688b 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadMsr64.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadMsr64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadPmc.S b/MdePkg/Library/BaseLib/Ia32/ReadPmc.S
index fd75ef486e..055e99c25a 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadPmc.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadPmc.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadSs.S b/MdePkg/Library/BaseLib/Ia32/ReadSs.S
index 752cb26081..4f15248f1a 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadSs.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadSs.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadTr.S b/MdePkg/Library/BaseLib/Ia32/ReadTr.S
index 8b095bedd4..af12dd2f3f 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadTr.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadTr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/ReadTsc.S b/MdePkg/Library/BaseLib/Ia32/ReadTsc.S
index a4436dd278..cab29661ae 100644
--- a/MdePkg/Library/BaseLib/Ia32/ReadTsc.S
+++ b/MdePkg/Library/BaseLib/Ia32/ReadTsc.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/SetJump.S b/MdePkg/Library/BaseLib/Ia32/SetJump.S
index a3a70b6cf1..c8993084ac 100644
--- a/MdePkg/Library/BaseLib/Ia32/SetJump.S
+++ b/MdePkg/Library/BaseLib/Ia32/SetJump.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/SwapBytes64.S b/MdePkg/Library/BaseLib/Ia32/SwapBytes64.S
index 313f4164fa..c15ca444f0 100644
--- a/MdePkg/Library/BaseLib/Ia32/SwapBytes64.S
+++ b/MdePkg/Library/BaseLib/Ia32/SwapBytes64.S
@@ -1,43 +1,38 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   CpuId.Asm
-#
-# Abstract:
-#
-#   AsmCpuid function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-
-#------------------------------------------------------------------------------
-# UINT64
-# EFIAPI
-# InternalMathSwapBytes64 (
-#   IN      UINT64                    Operand
-#   );
-#------------------------------------------------------------------------------
-.globl ASM_PFX(InternalMathSwapBytes64)
-ASM_PFX(InternalMathSwapBytes64):
-    movl    8(%esp), %eax
-    movl    4(%esp), %edx
-    bswapl  %eax
-    bswapl  %edx
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuId.Asm
+#
+# Abstract:
+#
+#   AsmCpuid function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# InternalMathSwapBytes64 (
+#   IN      UINT64                    Operand
+#   );
+#------------------------------------------------------------------------------
+.globl ASM_PFX(InternalMathSwapBytes64)
+ASM_PFX(InternalMathSwapBytes64):
+    movl    8(%esp), %eax
+    movl    4(%esp), %edx
+    bswapl  %eax
+    bswapl  %edx
+    ret
diff --git a/MdePkg/Library/BaseLib/Ia32/Thunk16.S b/MdePkg/Library/BaseLib/Ia32/Thunk16.S
index ca72d0b544..c45cdb0a2d 100644
--- a/MdePkg/Library/BaseLib/Ia32/Thunk16.S
+++ b/MdePkg/Library/BaseLib/Ia32/Thunk16.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/Wbinvd.S b/MdePkg/Library/BaseLib/Ia32/Wbinvd.S
index 9c31adc589..b19348dad9 100644
--- a/MdePkg/Library/BaseLib/Ia32/Wbinvd.S
+++ b/MdePkg/Library/BaseLib/Ia32/Wbinvd.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteCr0.S b/MdePkg/Library/BaseLib/Ia32/WriteCr0.S
index 5cd75cf33d..6bce3a4d50 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteCr0.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteCr0.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteCr2.S b/MdePkg/Library/BaseLib/Ia32/WriteCr2.S
index 8128e8363d..64d2c1b534 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteCr2.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteCr2.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteCr3.S b/MdePkg/Library/BaseLib/Ia32/WriteCr3.S
index 06f7208297..767182ee4e 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteCr3.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteCr3.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteCr4.S b/MdePkg/Library/BaseLib/Ia32/WriteCr4.S
index f748c1884a..dc6828ac91 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteCr4.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteCr4.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr0.S b/MdePkg/Library/BaseLib/Ia32/WriteDr0.S
index f1fd87858d..c05af0ec1e 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr0.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr0.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr1.S b/MdePkg/Library/BaseLib/Ia32/WriteDr1.S
index 291e63736a..87031768ac 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr1.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr1.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr2.S b/MdePkg/Library/BaseLib/Ia32/WriteDr2.S
index 6b6a50a198..ca4e301b93 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr2.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr2.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr3.S b/MdePkg/Library/BaseLib/Ia32/WriteDr3.S
index 4201c4a1de..ed23db7e90 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr3.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr3.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr4.S b/MdePkg/Library/BaseLib/Ia32/WriteDr4.S
index ef76bddd16..d17595213a 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr4.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr4.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr5.S b/MdePkg/Library/BaseLib/Ia32/WriteDr5.S
index f10b56e8ee..7e3bb94f1f 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr5.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr5.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr6.S b/MdePkg/Library/BaseLib/Ia32/WriteDr6.S
index 1cdd8160c1..0827f347bd 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr6.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr6.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteDr7.S b/MdePkg/Library/BaseLib/Ia32/WriteDr7.S
index ce1e29b09c..1f3e916675 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteDr7.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteDr7.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteGdtr.S b/MdePkg/Library/BaseLib/Ia32/WriteGdtr.S
index 07ec92e44c..3aedf7dd68 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteGdtr.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteGdtr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteIdtr.S b/MdePkg/Library/BaseLib/Ia32/WriteIdtr.S
index 739edde618..c3e6ad3353 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteIdtr.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteIdtr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteLdtr.S b/MdePkg/Library/BaseLib/Ia32/WriteLdtr.S
index 1bb4678337..8b2cc3c029 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteLdtr.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteLdtr.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm0.S b/MdePkg/Library/BaseLib/Ia32/WriteMm0.S
index 87a28165bc..ef70763e52 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm0.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm0.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm1.S b/MdePkg/Library/BaseLib/Ia32/WriteMm1.S
index 05182fb0fc..74a3d711b5 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm1.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm1.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm2.S b/MdePkg/Library/BaseLib/Ia32/WriteMm2.S
index c34ceccf1b..a3c548dcec 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm2.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm2.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm3.S b/MdePkg/Library/BaseLib/Ia32/WriteMm3.S
index 01250e8f44..98b11a5818 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm3.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm3.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm4.S b/MdePkg/Library/BaseLib/Ia32/WriteMm4.S
index cc6ec7d173..107c695cf7 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm4.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm4.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm5.S b/MdePkg/Library/BaseLib/Ia32/WriteMm5.S
index b0909614b5..be6a6f78b2 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm5.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm5.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm6.S b/MdePkg/Library/BaseLib/Ia32/WriteMm6.S
index 6d657c6673..51a8973460 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm6.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm6.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMm7.S b/MdePkg/Library/BaseLib/Ia32/WriteMm7.S
index 52c599c0fd..824bbeae17 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMm7.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMm7.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ia32/WriteMsr64.S b/MdePkg/Library/BaseLib/Ia32/WriteMsr64.S
index f310e887ab..5c12c981a9 100644
--- a/MdePkg/Library/BaseLib/Ia32/WriteMsr64.S
+++ b/MdePkg/Library/BaseLib/Ia32/WriteMsr64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessDbr.s b/MdePkg/Library/BaseLib/Ipf/AccessDbr.s
new file mode 100644
index 0000000000..49d1fecbbf
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessDbr.s
@@ -0,0 +1,118 @@
+/// @file
+///  IPF specific Debug Breakpoint Registers accessing functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessDbr.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadDbr
+//
+// This routine is used to Reads the current value of Data Breakpoint Register (DBR).
+//
+// Arguments :
+//
+// On Entry : The 8-bit DBR index to read.
+//
+// Return Value: The current value of DBR by Index.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadDbr, @function
+.proc   AsmReadDbr
+.regstk 1, 0, 0, 0
+
+AsmReadDbr::
+        mov             r8 = dbr[in0];;
+        br.ret.dpnt     b0;;
+.endp   AsmReadDbr
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteDbr
+//
+// This routine is used to write the current value to Data Breakpoint Register (DBR).
+//
+// Arguments :
+//
+// On Entry : The 8-bit DBR index to read.
+//            The value should be written to DBR
+//
+// Return Value: The value written to DBR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteDbr, @function
+.proc   AsmWriteDbr
+.regstk 2, 0, 0, 0
+
+AsmWriteDbr::
+        mov             dbr[in0] = in1
+        mov             r8 = in1;;
+        srlz.d;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteDbr
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIbr
+//
+// This routine is used to Reads the current value of Instruction Breakpoint Register (IBR).
+//
+// Arguments :
+//
+// On Entry : The 8-bit IBR index.
+//
+// Return Value: The current value of IBR by Index.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIbr, @function
+.proc   AsmReadIbr
+.regstk 1, 0, 0, 0
+
+AsmReadIbr::
+        mov             r8 = ibr[in0];;
+        br.ret.dpnt     b0;;
+.endp   AsmReadIbr
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteIbr
+//
+// This routine is used to write the current value to Instruction Breakpoint Register (IBR).
+//
+// Arguments :
+//
+// On Entry : The 8-bit IBR index.
+//            The value should be written to IBR
+//
+// Return Value: The value written to IBR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteIbr, @function
+.proc   AsmWriteIbr
+.regstk 2, 0, 0, 0
+
+AsmWriteIbr::
+        mov             ibr[in0] = in1
+        mov             r8 = in1;;
+        srlz.i;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteIbr
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessEicr.s b/MdePkg/Library/BaseLib/Ipf/AccessEicr.s
new file mode 100644
index 0000000000..03d7e034f8
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessEicr.s
@@ -0,0 +1,512 @@
+/// @file
+///  IPF specific External Interrupt Control Registers accessing functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessEicr.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadLid
+//
+// This routine is used to read the value of Local Interrupt ID Register (LID).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of LID.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadLid, @function
+.proc   AsmReadLid
+
+AsmReadLid::
+         mov            r8 = cr.lid;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadLid
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteLid
+//
+// This routine is used to write the value to Local Interrupt ID Register (LID).
+//
+// Arguments :
+//
+// On Entry :  The value need to be written to LID.
+//
+// Return Value: The value written to LID.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteLid, @function
+.proc   AsmWriteLid
+.regstk 1, 0, 0, 0
+
+AsmWriteLid::
+         mov            cr.lid = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteLid
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIvr
+//
+// This routine is used to read the value of External Interrupt Vector Register (IVR).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of IVR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIvr, @function
+.proc   AsmReadIvr
+
+AsmReadIvr::
+         mov            r8 = cr.ivr;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadIvr
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadTpr
+//
+// This routine is used to read the value of Task Priority Register (TPR).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of TPR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadTpr, @function
+.proc   AsmReadTpr
+
+AsmReadTpr::
+         mov            r8 = cr.tpr;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadTpr
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteTpr
+//
+// This routine is used to write the value to Task Priority Register (TPR).
+//
+// Arguments :
+//
+// On Entry :  The value need to be written to TPR.
+//
+// Return Value: The value written to TPR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteTpr, @function
+.proc   AsmWriteTpr
+.regstk 1, 0, 0, 0
+
+AsmWriteTpr::
+         mov            cr.tpr = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteTpr
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteEoi
+//
+// This routine is used to write the value to End of External Interrupt Register (EOI).
+//
+// Arguments :
+//
+// On Entry :  The value need to be written to EOI.
+//
+// Return Value: The value written to EOI.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteEoi, @function
+.proc   AsmWriteEoi
+
+AsmWriteEoi::
+         mov            cr.eoi = r0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteEoi
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIrr0
+//
+// This routine is used to Read the value of External Interrupt Request Register 0 (IRR0).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of IRR0.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIrr0, @function
+.proc   AsmReadIrr0
+
+AsmReadIrr0::
+         mov            r8 = cr.irr0;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadIrr0
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIrr1
+//
+// This routine is used to Read the value of External Interrupt Request Register 1 (IRR1).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of IRR1.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIrr1, @function
+.proc   AsmReadIrr1
+
+AsmReadIrr1::
+         mov            r8 = cr.irr1;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadIrr1
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIrr2
+//
+// This routine is used to Read the value of External Interrupt Request Register 2 (IRR2).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of IRR2.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIrr2, @function
+.proc   AsmReadIrr2
+
+AsmReadIrr2::
+         mov            r8 = cr.irr2;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadIrr2
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIrr3
+//
+// This routine is used to Read the value of External Interrupt Request Register 3 (IRR3).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of IRR3.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIrr3, @function
+.proc   AsmReadIrr3
+
+AsmReadIrr3::
+         mov            r8 = cr.irr3;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadIrr3
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadItv
+//
+// This routine is used to Read the value of Interval Timer Vector Register (ITV).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of ITV.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadItv, @function
+.proc   AsmReadItv
+
+AsmReadItv::
+         mov            r8 = cr.itv;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadItv
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteItv
+//
+// This routine is used to write the value to Interval Timer Vector Register (ITV).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to ITV
+//
+// Return Value: The value written to ITV.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteItv, @function
+.proc   AsmWriteItv
+.regstk 1, 0, 0, 0
+
+AsmWriteItv::
+         mov            cr.itv = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteItv
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadPmv
+//
+// This routine is used to Read the value of Performance Monitoring Vector Register (PMV).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of PMV.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadPmv, @function
+.proc   AsmReadPmv
+
+AsmReadPmv::
+         mov            r8 = cr.pmv;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadPmv
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWritePmv
+//
+// This routine is used to write the value to Performance Monitoring Vector Register (PMV).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to PMV
+//
+// Return Value: The value written to PMV.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWritePmv, @function
+.proc   AsmWritePmv
+.regstk 1, 0, 0, 0
+
+AsmWritePmv::
+         mov            cr.pmv = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWritePmv
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadCmcv
+//
+// This routine is used to Read the value of Corrected Machine Check Vector Register (CMCV).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of CMCV.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadCmcv, @function
+.proc   AsmReadCmcv
+
+AsmReadCmcv::
+         mov            r8 = cr.cmcv;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadCmcv
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteCmcv
+//
+// This routine is used to write the value to Corrected Machine Check Vector Register (CMCV).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to CMCV
+//
+// Return Value: The value written to CMCV.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteCmcv, @function
+.proc   AsmWriteCmcv
+.regstk 1, 0, 0, 0
+
+AsmWriteCmcv::
+         mov            cr.cmcv = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteCmcv
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadLrr0
+//
+// This routine is used to read the value of Local Redirection Register 0 (LRR0).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of LRR0.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadLrr0, @function
+.proc   AsmReadLrr0
+
+AsmReadLrr0::
+         mov            r8 = cr.lrr0;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadLrr0
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteLrr0
+//
+// This routine is used to write the value to Local Redirection Register 0 (LRR0).
+//
+// Arguments :
+//
+// On Entry :  The value need to be written to LRR0.
+//
+// Return Value: The value written to LRR0.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteLrr0, @function
+.proc   AsmWriteLrr0
+.regstk 1, 0, 0, 0
+
+AsmWriteLrr0::
+         mov            cr.lrr0 = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteLrr0
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadLrr1
+//
+// This routine is used to read the value of Local Redirection Register 1 (LRR1).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of LRR1.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadLrr1, @function
+.proc   AsmReadLrr1
+
+AsmReadLrr1::
+         mov            r8 = cr.lrr1;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadLrr1
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteLrr1
+//
+// This routine is used to write the value to Local Redirection Register 1 (LRR1).
+//
+// Arguments :
+//
+// On Entry :  The value need to be written to LRR1.
+//
+// Return Value: The value written to LRR1.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteLrr1, @function
+.proc   AsmWriteLrr1
+.regstk 1, 0, 0, 0
+
+AsmWriteLrr1::
+         mov            cr.lrr1 = in0
+         mov            r8 = in0;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteLrr1
+
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessGcr.s b/MdePkg/Library/BaseLib/Ipf/AccessGcr.s
new file mode 100644
index 0000000000..54b3a30a6d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessGcr.s
@@ -0,0 +1,264 @@
+/// @file
+///  IPF specific Global Control Registers accessing functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessGcr.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadDcr
+//
+// This routine is used to Read the value of Default Control Register (DCR).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of DCR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadDcr, @function
+.proc   AsmReadDcr
+
+AsmReadDcr::
+         mov            r8 = cr.dcr;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadDcr
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteDcr
+//
+// This routine is used to write the value to Default Control Register (DCR).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to DCR
+//
+// Return Value: The value written to DCR.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteDcr, @function
+.proc   AsmWriteDcr
+.regstk 1, 0, 0, 0
+
+AsmWriteDcr::
+         mov            cr.dcr = in0
+         mov            r8 = in0;;
+         srlz.i;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteDcr
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadItc
+//
+// This routine is used to Read the value of Interval Timer Counter Register (ITC).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of ITC.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadItc, @function
+.proc   AsmReadItc
+
+AsmReadItc::
+         mov            r8 = ar.itc;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadItc
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteItc
+//
+// This routine is used to write the value to Interval Timer Counter Register (ITC).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to the ITC
+//
+// Return Value: The value written to the ITC.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteItc, @function
+.proc   AsmWriteItc
+.regstk 1, 0, 0, 0
+
+AsmWriteItc::
+         mov            ar.itc = in0
+         mov            r8 = in0;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteItc
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadItm
+//
+// This routine is used to Read the value of Interval Timer Match Register (ITM).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of ITM.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadItm, @function
+.proc   AsmReadItm
+
+AsmReadItm::
+         mov            r8 = cr.itm;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadItm
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteItm
+//
+// This routine is used to write the value to Interval Timer Match Register (ITM).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to ITM
+//
+// Return Value: The value written to ITM.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteItm, @function
+.proc   AsmWriteItm
+.regstk 1, 0, 0, 0
+
+AsmWriteItm::
+         mov            cr.itm = in0
+         mov            r8 = in0;;
+         srlz.d;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteItm
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadIva
+//
+// This routine is used to read the value of Interruption Vector Address Register (IVA).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of IVA.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadIva, @function
+.proc   AsmReadIva
+
+AsmReadIva::
+         mov            r8 = cr.iva;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadIva
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteIva
+//
+// This routine is used to write the value to Interruption Vector Address Register (IVA).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to IVA
+//
+// Return Value: The value written to IVA.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteIva, @function
+.proc   AsmWriteIva
+.regstk 1, 0, 0, 0
+
+AsmWriteIva::
+         mov            cr.iva = in0
+         mov            r8 = in0;;
+         br.ret.dpnt    b0;;
+.endp    AsmWriteIva
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadPta
+//
+// This routine is used to read the value of Page Table Address Register (PTA).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current value of PTA.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadPta, @function
+.proc   AsmReadPta
+
+AsmReadPta::
+         mov            r8 = cr.pta;;
+         br.ret.dpnt    b0;;
+.endp    AsmReadPta
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWritePta
+//
+// This routine is used to write the value to Page Table Address Register (PTA)).
+//
+// Arguments :
+//
+// On Entry : The value need to be written to PTA
+//
+// Return Value: The value written to PTA.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWritePta, @function
+.proc   AsmWritePta
+.regstk 1, 0, 0, 0
+
+AsmWritePta::
+         mov            cr.pta = in0
+         mov            r8 = in0;;
+         srlz.i;;
+         srlz.d;;
+         br.ret.dpnt    b0;;
+.endp    AsmWritePta
\ No newline at end of file
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessGp.s b/MdePkg/Library/BaseLib/Ipf/AccessGp.s
new file mode 100644
index 0000000000..5c5f20f584
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessGp.s
@@ -0,0 +1,86 @@
+/// @file
+///  IPF specific Global Pointer and Stack Pointer accessing functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessGp.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadGp
+//
+// This routine is used to read the current value of 64-bit Global Pointer (GP).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current GP value.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadGp, @function
+.proc   AsmReadGp
+
+AsmReadGp::
+        mov             r8 = gp;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadGp
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteGp
+//
+// This routine is used to write the current value of 64-bit Global Pointer (GP).
+//
+// Arguments :
+//
+// On Entry : The value need to be written.
+//
+// Return Value: The value have been written.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteGp, @function
+.proc   AsmWriteGp
+.regstk 1, 0, 0, 0
+
+AsmWriteGp::
+        mov             gp = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteGp
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadSp
+//
+// This routine is used to read the current value of 64-bit Stack Pointer (SP).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current SP value.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadSp, @function
+.proc   AsmReadSp
+
+AsmReadSp::
+        mov             r8 = sp;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadSp
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessKr.s b/MdePkg/Library/BaseLib/Ipf/AccessKr.s
new file mode 100644
index 0000000000..5a38954292
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessKr.s
@@ -0,0 +1,400 @@
+/// @file
+///  IPF specific AsmReadKrX() and AsmWriteKrX functions, 'X' is from '0' to '7'
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessKr.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr0
+//
+// This routine is used to get KR0.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR0.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr0, @function
+.proc   AsmReadKr0
+
+AsmReadKr0::
+        mov             r8 = ar.k0;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr0
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr0
+//
+// This routine is used to Write KR0.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR0.
+//
+//--
+//----------------------------------------------------------------------------------
+
+.text
+.type   AsmWriteKr0, @function
+.proc   AsmWriteKr0
+.regstk 1, 0, 0, 0
+
+AsmWriteKr0::
+        mov             ar.k0 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr0
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr1
+//
+// This routine is used to get KR1.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR1.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr1, @function
+.proc   AsmReadKr1
+
+AsmReadKr1::
+        mov             r8 = ar.k1;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr1
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr1
+//
+// This routine is used to Write KR1.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR1.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr1, @function
+.proc   AsmWriteKr1
+
+AsmWriteKr1::
+        mov             ar.k1 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr1
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr2
+//
+// This routine is used to get KR2.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR2.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr2, @function
+.proc   AsmReadKr2
+
+AsmReadKr2::
+        mov             r8 = ar.k2;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr2
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr2
+//
+// This routine is used to Write KR2.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR2.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr2, @function
+.proc   AsmWriteKr2
+
+AsmWriteKr2::
+        mov             ar.k2 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr2
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr3
+//
+// This routine is used to get KR3.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR3.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr3, @function
+.proc   AsmReadKr3
+
+AsmReadKr3::
+        mov             r8 = ar.k3;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr3
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr3
+//
+// This routine is used to Write KR3.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR3.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr3, @function
+.proc   AsmWriteKr3
+
+AsmWriteKr3::
+        mov             ar.k3 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr3
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr4
+//
+// This routine is used to get KR4.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR4.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr4, @function
+.proc   AsmReadKr4
+
+AsmReadKr4::
+        mov             r8 = ar.k4;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr4
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr4
+//
+// This routine is used to Write KR4.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR4.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr4, @function
+.proc   AsmWriteKr4
+
+AsmWriteKr4::
+        mov             ar.k4 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr4
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr5
+//
+// This routine is used to get KR5.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR5.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr5, @function
+.proc   AsmReadKr5
+
+AsmReadKr5::
+        mov             r8 = ar.k5;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr5
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr5
+//
+// This routine is used to Write KR5.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR5.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr5, @function
+.proc   AsmWriteKr5
+
+AsmWriteKr5::
+        mov             ar.k5 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr5
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr6
+//
+// This routine is used to get KR6.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR6.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr6, @function
+.proc   AsmReadKr6
+
+AsmReadKr6::
+        mov             r8 = ar.k6;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr6
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr6
+//
+// This routine is used to write KR6.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR6.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr6, @function
+.proc   AsmWriteKr6
+
+AsmWriteKr6::
+        mov             ar.k6 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr6
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadKr7
+//
+// This routine is used to get KR7.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value store in KR7.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadKr7, @function
+.proc   AsmReadKr7
+
+AsmReadKr7::
+        mov             r8 = ar.k7;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadKr7
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWriteKr7
+//
+// This routine is used to write KR7.
+//
+// Arguments :
+//
+// On Entry :  None.
+//
+// Return Value: The value written to the KR7.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWriteKr7, @function
+.proc   AsmWriteKr7
+
+AsmWriteKr7::
+        mov             ar.k7 = in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmWriteKr7
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessPmr.s b/MdePkg/Library/BaseLib/Ipf/AccessPmr.s
new file mode 100644
index 0000000000..cea376c638
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessPmr.s
@@ -0,0 +1,124 @@
+/// @file
+///  IPF specific Performance Monitor Configuration/Data Registers accessing functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessPmr.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadPmc
+//
+// This routine is used to Reads the current value of Performance Monitor Configuration Register (PMC).
+//
+// Arguments :
+//
+// On Entry : The 8-bit PMC index.
+//
+// Return Value: The current value of PMC by Index.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadPmc, @function
+.proc   AsmReadPmc
+.regstk 1, 0, 0, 0
+
+AsmReadPmc::
+        srlz.i;;
+        srlz.d;;
+        mov             r8 = pmc[in0];;
+        br.ret.dpnt     b0;;
+.endp   AsmReadPmc
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWritePmc
+//
+// This routine is used to write the current value to a Performance Monitor Configuration Register (PMC).
+//
+// Arguments :
+//
+// On Entry : The 8-bit PMC index.
+//            The value should be written to PMC
+//
+// Return Value: The value written to PMC.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWritePmc, @function
+.proc   AsmWritePmc
+.regstk 2, 0, 0, 0
+
+AsmWritePmc::
+        mov             pmc[in0] = in1
+        mov             r8 = in1;;
+        srlz.i;;
+        srlz.d;;
+        br.ret.dpnt     b0;;
+.endp   AsmWritePmc
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadPmd
+//
+// This routine is used to Reads the current value of Performance Monitor Data Register (PMD).
+//
+// Arguments :
+//
+// On Entry : The 8-bit PMD index.
+//
+// Return Value: The current value of PMD by Index.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadPmd, @function
+.proc   AsmReadPmd
+.regstk 1, 0, 0, 0
+
+AsmReadPmd::
+        srlz.i;;
+        srlz.d;;
+        mov             r8 = pmd[in0];;
+        br.ret.dpnt     b0;;
+.endp   AsmReadPmd
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWritePmd
+//
+// This routine is used to write the current value to Performance Monitor Data Register (PMD).
+//
+// Arguments :
+//
+// On Entry : The 8-bit PMD index.
+//            The value should be written to PMD
+//
+// Return Value: The value written to PMD.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWritePmd, @function
+.proc   AsmWritePmd
+.regstk 2, 0, 0, 0
+
+AsmWritePmd::
+        mov             pmd[in0] = in1
+        mov             r8 = in1;;
+        srlz.i;;
+        srlz.d;;
+        br.ret.dpnt     b0;;
+.endp   AsmWritePmd
diff --git a/MdePkg/Library/BaseLib/Ipf/AccessPsr.s b/MdePkg/Library/BaseLib/Ipf/AccessPsr.s
new file mode 100644
index 0000000000..9b4fe49ff1
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AccessPsr.s
@@ -0,0 +1,110 @@
+/// @file
+///  IPF specific Processor Status Register accessing functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: AccessPsr.s
+///
+///
+
+#define CpuModeMask           0x0000001008020000
+
+#define CpuInVirtualMode             0x1
+#define CpuInPhysicalMode            0x0
+#define CpuInMixMode                 (0x0 - 0x1)
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadPsr
+//
+// This routine is used to read the current value of Processor Status Register (PSR).
+//
+// Arguments :
+//
+// On Entry :
+//
+// Return Value: The current PSR value.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadPsr, @function
+.proc   AsmReadPsr
+
+AsmReadPsr::
+        mov             r8 = psr;;
+        br.ret.dpnt     b0;;
+.endp   AsmReadPsr
+
+//---------------------------------------------------------------------------------
+//++
+// AsmWritePsr
+//
+// This routine is used to write the value of Processor Status Register (PSR).
+//
+// Arguments :
+//
+// On Entry : The value need to be written.
+//
+// Return Value: The value have been written.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmWritePsr, @function
+.proc   AsmWritePsr
+.regstk 1, 0, 0, 0
+
+AsmWritePsr::
+        mov             psr.l = in0
+        mov             r8 = in0;;
+        srlz.d;;
+        srlz.i;;
+        br.ret.dpnt     b0;;
+.endp   AsmWritePsr
+
+//---------------------------------------------------------------------------------
+//++
+// AsmCpuVirtual
+//
+// This routine is used to determines if the CPU is currently executing
+// in virtual, physical, or mixed mode.
+//
+// If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
+// If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
+// If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
+// and -1 is returned.
+//
+// Arguments:
+//
+// On Entry: None
+//
+// Return Value: The CPU mode flag
+//               return  1  The CPU is in virtual mode.
+//               return  0  The CPU is in physical mode.
+//               return -1  The CPU is in mixed mode.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmCpuVirtual, @function
+.proc   AsmCpuVirtual
+
+AsmCpuVirtual::
+        mov            r29 = psr
+        movl           r30 = CpuModeMask;;
+        and            r28 = r30, r29;;
+        cmp.eq         p6, p7 = r30, r28;;
+(p6)    mov            r8 = CpuInVirtualMode;;
+(p7)    cmp.eq         p6, p7 = 0x0, r28;;
+(p6)    mov            r8 = CpuInPhysicalMode;;
+(p7)    mov            r8 = CpuInMixMode;;
+        br.ret.dpnt    b0;;
+.endp   AsmCpuVirtual
\ No newline at end of file
diff --git a/MdePkg/Library/BaseLib/Ipf/AsmPalCall.s b/MdePkg/Library/BaseLib/Ipf/AsmPalCall.s
new file mode 100644
index 0000000000..9e70a78729
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/AsmPalCall.s
@@ -0,0 +1,158 @@
+/// @file
+///   Contains an implementation of CallPalProcStacked on Itanium-based
+///   architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  AsmPalCall.s
+///
+///
+
+
+//-----------------------------------------------------------------------------
+//++
+//  AsmPalCall
+//
+//  Makes a PAL procedure call.
+//  This is function to make a PAL procedure call.  Based on the Index
+//  value this API will make static or stacked PAL call.  The following table
+//  describes the usage of PAL Procedure Index Assignment. Architected procedures
+//  may be designated as required or optional.  If a PAL procedure is specified
+//  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the
+//  Status field of the PAL_CALL_RETURN structure.
+//  This indicates that the procedure is not present in this PAL implementation.
+//  It is the caller��s responsibility to check for this return code after calling
+//  any optional PAL procedure.
+//  No parameter checking is performed on the 5 input parameters, but there are
+//  some common rules that the caller should follow when making a PAL call.  Any
+//  address passed to PAL as buffers for return parameters must be 8-byte aligned.
+//  Unaligned addresses may cause undefined results.  For those parameters defined
+//  as reserved or some fields defined as reserved must be zero filled or the invalid
+//  argument return value may be returned or undefined result may occur during the
+//  execution of the procedure.  If the PalEntryPoint  does not point to a valid
+//  PAL entry point then the system behavior is undefined.  This function is only
+//  available on IPF.
+//
+//  On Entry :
+//           in0:  PAL_PROC entrypoint
+//           in1-in4 : PAL_PROC arguments
+//
+//  Return Value:
+//
+//  As per stacked calling conventions.
+//
+//--
+//---------------------------------------------------------------------------
+
+//
+// PAL function calls
+//
+#define PAL_MC_CLEAR_LOG               0x0015
+#define PAL_MC_DYNAMIC_STATE           0x0018
+#define PAL_MC_ERROR_INFO              0x0019
+#define PAL_MC_RESUME                  0x001a
+
+
+.text
+.proc AsmPalCall
+.type AsmPalCall, @function
+
+AsmPalCall::
+         alloc          loc1 = ar.pfs,5,8,4,0
+         mov            loc0 = b0
+         mov            loc3 = b5
+         mov            loc4 = r2
+         mov            loc7 = r1
+         mov            r2 = psr;;
+         mov            r28 = in1
+         mov            loc5 = r2;;
+
+         movl           loc6 = 0x100;;
+         cmp.ge         p6,p7 = r28,loc6;;
+
+(p6)     movl           loc6 = 0x1FF;;
+(p7)     br.dpnt.few PalCallStatic;;                  // 0 ~ 255 make a static Pal Call
+(p6)     cmp.le         p6,p7 = r28,loc6;;
+(p6)     br.dpnt.few PalCallStacked;;                 // 256 ~ 511 make a stacked Pal Call
+(p7)     movl           loc6 = 0x300;;
+(p7)     cmp.ge         p6,p7 = r28,loc6;;
+(p7)     br.dpnt.few PalCallStatic;;                  // 512 ~ 767 make a static Pal Call
+(p6)     movl           loc6 = 0x3FF;;
+(p6)     cmp.le         p6,p7 = r28,loc6;;
+(p6)     br.dpnt.few PalCallStacked;;                 // 768 ~ 1023 make a stacked Pal Call
+
+(p7)     mov            r8 = 0xFFFFFFFFFFFFFFFF;;     // > 1024 return invalid
+(p7)     br.dpnt.few    ComeBackFromPALCall;;
+
+PalCallStatic:
+         movl           loc6 = PAL_MC_CLEAR_LOG;;
+         cmp.eq         p6,p7 = r28,loc6;;
+
+(p7)     movl           loc6 = PAL_MC_DYNAMIC_STATE;;
+(p7)     cmp.eq         p6,p7 = r28,loc6;;
+
+(p7)     movl           loc6 = PAL_MC_ERROR_INFO;;
+(p7)     cmp.eq         p6,p7 = r28,loc6;;
+
+(p7)     movl           loc6 = PAL_MC_RESUME;;
+(p7)     cmp.eq         p6,p7 = r28,loc6 ;;
+
+         mov            loc6 = 0x1;;
+(p7)     dep            r2 = loc6,r2,13,1;;           // psr.ic = 1
+
+// p6 will be true, if it is one of the MCHK calls. There has been lots of debate
+// on psr.ic for these values. For now, do not do any thing to psr.ic
+
+         dep            r2 = r0,r2,14,1;;             // psr.i = 0
+
+         mov            psr.l = r2
+         srlz.d                                       // Needs data serailization.
+         srlz.i                                       // Needs instruction serailization.
+
+StaticGetPALLocalIP:
+         mov            loc2 = ip;;
+         add            loc2 = ComeBackFromPALCall - StaticGetPALLocalIP,loc2;;
+         mov            b0 = loc2                     // return address after Pal call
+
+         mov            r29 = in2
+         mov            r30 = in3
+         mov            r31 = in4
+         mov            b5 = in0;;                    // get the PalProcEntrypt from input
+         br.sptk        b5;;                          // Take the plunge.
+
+PalCallStacked:
+         dep            r2 = r0,r2,14,1;;             // psr.i = 0
+         mov            psr.l = r2;;
+         srlz.d                                       // Needs data serailization.
+         srlz.i                                       // Needs instruction serailization.
+
+StackedGetPALLocalIP:
+         mov            out0 = in1
+         mov            out1 = in2
+         mov            out2 = in3
+         mov            out3 = in4
+         mov            b5 =  in0 ;;                  // get the PalProcEntrypt from input
+         br.call.dpnt   b0 = b5 ;;                    // Take the plunge.
+
+ComeBackFromPALCall:
+         mov            psr.l = loc5 ;;
+         srlz.d                                       // Needs data serailization.
+         srlz.i                                       // Needs instruction serailization.
+
+         mov            b5 = loc3
+         mov            r2 = loc4
+         mov            r1 = loc7
+
+         mov            b0 = loc0
+         mov            ar.pfs = loc1;;
+         br.ret.dpnt    b0;;
+
+.endp AsmPalCall
+
diff --git a/MdePkg/Library/BaseLib/Ipf/CpuBreakpoint.c b/MdePkg/Library/BaseLib/Ipf/CpuBreakpoint.c
new file mode 100644
index 0000000000..3dcbecf29d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/CpuBreakpoint.c
@@ -0,0 +1,123 @@
+/** @file
+  Base Library CPU functions for Itanium
+
+  Copyright (c) 2006, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Include common header file for this module.
+//
+#include <BaseLibInternals.h>
+
+//void __mfa (void);
+
+#pragma intrinsic (_enable)
+#pragma intrinsic (_disable)
+#pragma intrinsic (__break)
+#pragma intrinsic (__mfa)
+
+
+/**
+  Generates a breakpoint on the CPU.
+
+  Generates a breakpoint on the CPU. The breakpoint must be implemented such
+  that code can resume normal execution after the breakpoint.
+
+**/
+VOID
+EFIAPI
+CpuBreakpoint (
+  VOID
+  )
+{
+  __break (0);
+}
+
+/**
+  Used to serialize load and store operations.
+
+  All loads and stores that proceed calls to this function are guaranteed to be
+  globally visible when this function returns.
+
+**/
+VOID
+EFIAPI
+MemoryFence (
+  VOID
+  )
+{
+  __mfa ();
+}
+
+/**
+  Disables CPU interrupts.
+
+  Disables CPU interrupts.
+
+**/
+VOID
+EFIAPI
+DisableInterrupts (
+  VOID
+  )
+{
+  _disable ();
+}
+
+/**
+  Enables CPU interrupts.
+
+  Enables CPU interrupts.
+
+**/
+VOID
+EFIAPI
+EnableInterrupts (
+  VOID
+  )
+{
+  _enable ();
+}
+
+/**
+  Enables CPU interrupts for the smallest window required to capture any
+  pending interrupts.
+
+  Enables CPU interrupts for the smallest window required to capture any
+  pending interrupts.
+
+**/
+VOID
+EFIAPI
+EnableDisableInterrupts (
+  VOID
+  )
+{
+  EnableInterrupts ();
+  DisableInterrupts ();
+}
+
+/**
+  Places the CPU in a sleep state until an interrupt is received.
+
+  Places the CPU in a sleep state until an interrupt is received. If interrupts
+  are disabled prior to calling this function, then the CPU will be placed in a
+  sleep state indefinitely.
+
+**/
+VOID
+EFIAPI
+CpuSleep (
+  VOID
+  )
+{
+  PalCallStatic (NULL, 29, 0, 0, 0);
+}
diff --git a/MdePkg/Library/BaseLib/Ipf/CpuFlushTlb.s b/MdePkg/Library/BaseLib/Ipf/CpuFlushTlb.s
new file mode 100644
index 0000000000..520c51f6ba
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/CpuFlushTlb.s
@@ -0,0 +1,58 @@
+/// @file
+///   CpuFlushTlb() function for Itanium-based architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  CpuFlushTlb.s
+///
+///
+
+.auto
+.text
+
+.globl PalCallStatic
+.type   PalCallStatic, @function
+
+.proc   CpuFlushTlb
+.type   CpuFlushTlb, @function
+CpuFlushTlb::
+        alloc               loc0 = ar.pfs, 0, 3, 5, 0
+        mov                 out0 = 0
+        mov                 out1 = 6
+        mov                 out2 = 0
+        mov                 out3 = 0
+        mov                 loc1 = b0
+        mov                 out4 = 0
+        brl.call.sptk       b0  = PalCallStatic
+        mov                 loc2 = psr              // save PSR
+        mov                 ar.pfs = loc0
+        extr.u              r14 = r10, 32, 32       // r14 <- count1
+        rsm                 1 << 14                 // Disable interrupts
+        extr.u              r15 = r11, 32, 32       // r15 <- stride1
+        extr.u              r10 = r10, 0, 32        // r10 <- count2
+        add                 r10 = -1, r10
+        extr.u              r11 = r11, 0, 32        // r11 <- stride2
+        br.cond.sptk        LoopPredicate
+LoopOuter:
+        mov                 ar.lc = r10             // LC <- count2
+        mov                 ar.ec = r0              // EC <- 0
+Loop:
+        ptc.e               r9
+        add                 r9 = r11, r9            // r9 += stride2
+        br.ctop.sptk        Loop
+        add                 r9 = r15, r9            // r9 += stride1
+LoopPredicate:
+        cmp.ne              p6 = r0, r14            // count1 == 0?
+        add                 r14 = -1, r14
+(p6)    br.cond.sptk        LoopOuter
+        mov                 psr.l = loc2
+        mov                 b0  = loc1
+        br.ret.sptk.many    b0
+.endp
diff --git a/MdePkg/Library/BaseLib/Ipf/CpuPause.s b/MdePkg/Library/BaseLib/Ipf/CpuPause.s
new file mode 100644
index 0000000000..f52692f438
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/CpuPause.s
@@ -0,0 +1,25 @@
+/// @file
+///   CpuPause() function for Itanium-based architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  CpuPause.s
+///
+///
+
+.auto
+.text
+
+.proc   CpuPause
+.type   CpuPause, @function
+CpuPause::
+        hint                @pause
+        br.ret.sptk.many    b0
+.endp
diff --git a/MdePkg/Library/BaseLib/Ipf/ExecFc.s b/MdePkg/Library/BaseLib/Ipf/ExecFc.s
new file mode 100644
index 0000000000..a5a9e9bc8a
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/ExecFc.s
@@ -0,0 +1,66 @@
+/// @file
+///  IPF specific AsmFc() and AsmFci () functions
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: ExecFc.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmFc
+//
+// This routine is used to execute a FC instruction on the specific address.
+//
+// Arguments :
+//
+// On Entry :  The specific address need to execute FC instruction.
+//
+// Return Value: The specific address have been execute FC instruction.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmFc, @function
+.proc   AsmFc
+.regstk 1, 0, 0, 0
+
+AsmFc::
+        fc              in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmFc
+
+
+//---------------------------------------------------------------------------------
+//++
+// AsmFci
+//
+// This routine is used to execute a FC.i instruction on the specific address.
+//
+// Arguments :
+//
+// On Entry :  The specific address need to execute FC.i instruction.
+//
+// Return Value: The specific address have been execute FC.i instruction.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmFci, @function
+.proc   AsmFci
+.regstk 1, 0, 0, 0
+
+AsmFci::
+        fc.i            in0
+        mov             r8 = in0;;
+        br.ret.dpnt     b0;;
+.endp   AsmFci
\ No newline at end of file
diff --git a/MdePkg/Library/BaseLib/Ipf/FlushCacheRange.s b/MdePkg/Library/BaseLib/Ipf/FlushCacheRange.s
new file mode 100644
index 0000000000..6e467f0d13
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/FlushCacheRange.s
@@ -0,0 +1,96 @@
+//++
+// Copyright (c) 2006, Intel Corporation                                                         
+// All rights reserved. This program and the accompanying materials                          
+// are licensed and made available under the terms and conditions of the BSD License         
+// which accompanies this distribution.  The full text of the license may be found at        
+// http://opensource.org/licenses/bsd-license.php                                            
+//                                                                                           
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+// 
+//  Module Name:
+//    FlushCacheRange.s 
+//
+//  Abstract:
+//    Assemble routine to flush cache lines 
+//
+// Revision History:
+//
+//--
+.file  "IpfCpuCache.s"
+
+#include  "IpfMacro.i"
+//#include  "IpfDefines.h"
+
+//
+//  Invalidates a range of instruction cache lines in the cache coherency domain
+//  of the calling CPU.
+//
+//  Invalidates the instruction cache lines specified by Address and Length. If
+//  Address is not aligned on a cache line boundary, then entire instruction
+//  cache line containing Address is invalidated. If Address + Length is not
+//  aligned on a cache line boundary, then the entire instruction cache line
+//  containing Address + Length -1 is invalidated. This function may choose to
+//  invalidate the entire instruction cache if that is more efficient than
+//  invalidating the specified range. If Length is 0, the no instruction cache
+//  lines are invalidated. Address is returned.
+//
+//  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().
+//
+//  @param  Address The base address of the instruction cache lines to
+//                  invalidate. If the CPU is in a physical addressing mode, then
+//                  Address is a physical address. If the CPU is in a virtual
+//                  addressing mode, then Address is a virtual address.
+//
+//  @param  Length  The number of bytes to invalidate from the instruction cache.
+//
+//  @return Address
+//  
+//  VOID *
+//  EFIAPI
+//  IpfFlushCacheRange (
+//    IN      VOID                      *Address,
+//    IN      UINTN                     Length
+//    );
+//
+PROCEDURE_ENTRY (IpfFlushCacheRange)
+
+      NESTED_SETUP (5,8,0,0)
+            
+      mov         loc2 = ar.lc
+      
+      mov         loc3 = in0                  // Start address.
+      mov         loc4 = in1;;                // Length in bytes.
+      
+      cmp.eq  p6,p7 = loc4, r0;;               // If Length is zero then don't flush any cache
+      (p6)  br.spnt.many DoneFlushingC;;         
+      
+      add         loc4 = loc4,loc3 
+      mov         loc5 = 1;;
+      sub         loc4 = loc4, loc5 ;; // the End address to flush
+                                         
+      dep         loc3 = r0,loc3,0,5          
+      dep         loc4 = r0,loc4,0,5;;         
+      shr         loc3 = loc3,5             
+      shr         loc4 = loc4,5;;    // 32 byte cache line
+      
+      sub         loc4 = loc4,loc3;; // total flush count, It should be add 1 but 
+                                     // the br.cloop will first execute one time 
+      mov         loc3 = in0                  
+      mov         loc5 = 32      
+      mov         ar.lc = loc4;;
+
+StillFlushingC:
+      fc          loc3;; 
+      sync.i;;
+      srlz.i;;
+      add         loc3 = loc5,loc3;;
+      br.cloop.sptk.few StillFlushingC;;
+
+DoneFlushingC:      
+      mov         ar.lc = loc2     
+      mov          r8   = in0       // return *Address
+      NESTED_RETURN
+
+PROCEDURE_EXIT (IpfFlushCacheRange)
+
diff --git a/MdePkg/Library/BaseLib/Ipf/GetInterruptState.s b/MdePkg/Library/BaseLib/Ipf/GetInterruptState.s
new file mode 100644
index 0000000000..d5b5fc852f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/GetInterruptState.s
@@ -0,0 +1,27 @@
+/// @file
+///   Retrieve of the interrupt state of the running processor for the Itanium
+///   architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  GetInterruptState.s
+///
+///
+
+.auto
+.text
+
+.proc   GetInterruptState
+.type   GetInterruptState, @function
+GetInterruptState::
+        mov                 r8  = psr
+        extr.u              r8  = r8, 14, 1
+        br.ret.sptk.many    b0
+.endp   GetInterruptState
diff --git a/MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange32.s b/MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange32.s
new file mode 100644
index 0000000000..3a278d7268
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange32.s
@@ -0,0 +1,29 @@
+/// @file
+///   Contains an implementation of InterlockedCompareExchange32 on Itanium-
+///   based architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  InterlockedCompareExchange32.s
+///
+///
+
+.auto
+.text
+
+.proc   InternalSyncCompareExchange32
+.type   InternalSyncCompareExchange32, @function
+InternalSyncCompareExchange32::
+        zxt4                r33 = r33
+        mov                 ar.ccv = r33
+        cmpxchg4.rel        r8  = [r32], r34
+        mf
+        br.ret.sptk.many    b0
+.endp   InternalSyncCompareExchange32
\ No newline at end of file
diff --git a/MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange64.s b/MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange64.s
new file mode 100644
index 0000000000..88b9d2b490
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/InterlockedCompareExchange64.s
@@ -0,0 +1,28 @@
+/// @file
+///   Contains an implementation of InterlockedCompareExchange64 on Itanium-
+///   based architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  InterlockedCompareExchange64.s
+///
+///
+
+.auto
+.text
+
+.proc   InternalSyncCompareExchange64
+.type   InternalSyncCompareExchange64, @function
+InternalSyncCompareExchange64::
+        mov                 ar.ccv = r33
+        cmpxchg8.rel        r8  = [r32], r34
+        mf
+        br.ret.sptk.many    b0
+.endp   InternalSyncCompareExchange64
\ No newline at end of file
diff --git a/MdePkg/Library/BaseLib/Ipf/InternalSwitchStack.c b/MdePkg/Library/BaseLib/Ipf/InternalSwitchStack.c
new file mode 100644
index 0000000000..60d0a37562
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/InternalSwitchStack.c
@@ -0,0 +1,68 @@
+/** @file
+  SwitchStack() function for IPF.
+
+  Copyright (c) 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  InternalSwitchStack.c
+
+**/
+
+#include <BaseLibInternals.h>
+
+/**
+  Transfers control to a function starting with a new stack.
+
+  Transfers control to the function specified by EntryPoint using the
+  new stack specified by NewStack and passing in the parameters specified
+  by Context1 and Context2.  Context1 and Context2 are optional and may
+  be NULL.  The function EntryPoint must never return.
+  Marker will be ignored on IA-32, x64, and EBC.
+  IPF CPUs expect one additional parameter of type VOID * that specifies
+  the new backing store pointer.
+
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  @param  EntryPoint  A pointer to function to call with the new stack.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function.
+  @param  Marker      VA_LIST marker for the variable argument list.
+
+**/
+VOID
+EFIAPI
+InternalSwitchStack (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,   OPTIONAL
+  IN      VOID                      *Context2,   OPTIONAL
+  IN      VOID                      *NewStack,
+  IN      VA_LIST                   Marker
+  )
+
+{
+  VOID                      *NewBsp;
+
+  //
+  // Get new backing store pointer from variable list
+  //
+  NewBsp   = VA_ARG (Marker, VOID *);
+
+  //
+  // Stack should be aligned with CPU_STACK_ALIGNMENT
+  //
+  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
+  ASSERT (((UINTN)NewBsp & (CPU_STACK_ALIGNMENT - 1)) == 0);
+
+  AsmSwitchStackAndBackingStore (EntryPoint, Context1, Context2, NewStack, NewBsp);
+}
diff --git a/MdePkg/Library/BaseLib/Ipf/PalCallStatic.s b/MdePkg/Library/BaseLib/Ipf/PalCallStatic.s
new file mode 100644
index 0000000000..c21d7427f9
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/PalCallStatic.s
@@ -0,0 +1,48 @@
+/// @file
+///   Contains an implementation of CallPalProcStatic on Itanium-based
+///   architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name:  PalCallStatic.s
+///
+///
+
+.auto
+.text
+
+.proc   PalCallStatic
+.type   PalCallStatic, @function
+.regstk 5, 0, 0, 0
+PalCallStatic::
+        cmp.eq              p15 = in0, r0
+        mov                 r31 = in4
+        mov                 r8  = ip
+
+(p15)   mov                 in0 = ar.k5
+        add                 r8  = (_PalProcReturn - PalCallStatic), r8
+        mov                 r30 = in3
+
+        mov                 in4 = psr
+        mov                 in3 = b0
+        mov                 b7  = in0
+
+        rsm                 1 << 14                 // Disable interrupts
+        mov                 r29 = in2
+        mov                 r28 = in1
+
+        mov                 b0  = r8
+        br.cond.sptk.many   b7
+
+_PalProcReturn:
+        mov                 psr.l = in4
+        mov                 b0  = in3
+        br.ret.sptk.many    b0
+.endp   PalCallStatic
diff --git a/MdePkg/Library/BaseLib/Ipf/ReadCpuid.s b/MdePkg/Library/BaseLib/Ipf/ReadCpuid.s
new file mode 100644
index 0000000000..2176dad116
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/ReadCpuid.s
@@ -0,0 +1,40 @@
+/// @file
+///  IPF specific AsmReadCpuid()function
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: ReadCpuid.s
+///
+///
+
+//---------------------------------------------------------------------------------
+//++
+// AsmReadCpuid
+//
+// This routine is used to Reads the current value of Processor Identifier Register (CPUID).
+//
+// Arguments :
+//
+// On Entry : The 8-bit Processor Identifier Register index to read.
+//
+// Return Value: The current value of Processor Identifier Register specified by Index.
+//
+//--
+//----------------------------------------------------------------------------------
+.text
+.type   AsmReadCpuid, @function
+.proc   AsmReadCpuid
+.regstk 1, 0, 0, 0
+
+AsmReadCpuid::
+        mov             r8 = cpuid[in0];;
+        br.ret.dpnt     b0;;
+.endp    AsmReadCpuid
+
diff --git a/MdePkg/Library/BaseLib/Ipf/SwitchStack.s b/MdePkg/Library/BaseLib/Ipf/SwitchStack.s
new file mode 100644
index 0000000000..a3c524f119
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/SwitchStack.s
@@ -0,0 +1,50 @@
+/// @file
+///  IPF specific SwitchStack() function
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: SwitchStack.s
+///
+///
+
+.auto
+.text
+
+.proc   AsmSwitchStackAndBackingStore
+.type   AsmSwitchStackAndBackingStore, @function
+.regstk 5, 0, 0, 0
+AsmSwitchStackAndBackingStore::
+        mov                 r14 = ar.rsc
+        movl                r2  = ~((((1 << 14) - 1) << 16) | 3)
+
+        mov                 r17 = in1
+        mov                 r18 = in2
+        and                 r2  = r14, r2
+
+        mov                 ar.rsc = r2
+        mov                 sp  = in3
+        mov                 r19 = in4
+
+        ld8.nt1             r16 = [in0], 8
+        ld8.nta             gp  = [in0]
+        mov                 r3  = -1
+
+        loadrs
+        mov                 ar.bspstore = r19
+        mov                 b7  = r16
+
+        alloc               r2  = ar.pfs, 0, 0, 2, 0
+        mov                 out0 = r17
+        mov                 out1 = r18
+
+        mov                 ar.rnat = r3
+        mov                 ar.rsc = r14
+        br.call.sptk.many   b0  = b7
+.endp   AsmSwitchStackAndBackingStore
diff --git a/MdePkg/Library/BaseLib/Ipf/Synchronization.c b/MdePkg/Library/BaseLib/Ipf/Synchronization.c
new file mode 100644
index 0000000000..c29a8763d3
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/Synchronization.c
@@ -0,0 +1,79 @@
+/** @file
+  Implementation of synchronization functions on Itanium.
+
+  Copyright (c) 2006, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  Synchronization.c
+
+**/
+
+#include "BaseLibInternals.h"
+
+/**
+  Performs an atomic increment of an 32-bit unsigned integer.
+
+  Performs an atomic increment of the 32-bit unsigned integer specified by
+  Value and returns the incremented value. The increment operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  @param  Value A pointer to the 32-bit value to increment.
+
+  @return The incremented value.
+
+**/
+UINT32
+EFIAPI
+InternalSyncIncrement (
+  IN      volatile UINT32           *Value
+  )
+{
+  UINT32                            OriginalValue;
+
+  do {
+    OriginalValue = *Value;
+  } while (OriginalValue != InternalSyncCompareExchange32 (
+                              Value,
+                              OriginalValue,
+                              OriginalValue + 1
+                              ));
+  return OriginalValue + 1;
+}
+
+/**
+  Performs an atomic decrement of an 32-bit unsigned integer.
+
+  Performs an atomic decrement of the 32-bit unsigned integer specified by
+  Value and returns the decrement value. The decrement operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  @param  Value A pointer to the 32-bit value to decrement.
+
+  @return The decrement value.
+
+**/
+UINT32
+EFIAPI
+InternalSyncDecrement (
+  IN      volatile UINT32           *Value
+  )
+{
+  UINT32                            OriginalValue;
+
+  do {
+    OriginalValue = *Value;
+  } while (OriginalValue != InternalSyncCompareExchange32 (
+                              Value,
+                              OriginalValue,
+                              OriginalValue - 1
+                              ));
+  return OriginalValue - 1;
+}
diff --git a/MdePkg/Library/BaseLib/Ipf/Unaligned.c b/MdePkg/Library/BaseLib/Ipf/Unaligned.c
new file mode 100644
index 0000000000..1c4a937ab9
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/Unaligned.c
@@ -0,0 +1,248 @@
+/** @file
+  Unaligned access functions of BaseLib for IPF.
+
+  Copyright (c) 2006, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  Unaligned.c
+
+**/
+
+//
+// Include common header file for this module.
+//
+#include <BaseLibInternals.h>
+
+/**
+  Reads a 16-bit value from memory that may be unaligned.
+
+  This function returns the 16-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 16-bit value that may be unaligned.
+
+  @return *Uint16
+
+**/
+UINT16
+EFIAPI
+ReadUnaligned16 (
+  IN      CONST UINT16              *Buffer
+  )
+{
+  ASSERT (Buffer != NULL);
+
+  return (UINT16)(((UINT8*)Buffer)[0] | (((UINT8*)Buffer)[1] << 8));
+}
+
+/**
+  Writes a 16-bit value to memory that may be unaligned.
+
+  This function writes the 16-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 16-bit value that may be unaligned.
+  @param  Value   16-bit value to write to Buffer.
+
+  @return Value
+
+**/
+UINT16
+EFIAPI
+WriteUnaligned16 (
+  OUT     UINT16                    *Buffer,
+  IN      UINT16                    Value
+  )
+{
+  ASSERT (Buffer != NULL);
+
+  ((UINT8*)Buffer)[0] = (UINT8)Value;
+  ((UINT8*)Buffer)[1] = (UINT8)(Value >> 8);
+
+  return Value;
+}
+
+/**
+  Reads a 24-bit value from memory that may be unaligned.
+
+  This function returns the 24-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 24-bit value that may be unaligned.
+
+  @return The value read.
+
+**/
+UINT32
+EFIAPI
+ReadUnaligned24 (
+  IN      CONST UINT32              *Buffer
+  )
+{
+  ASSERT (Buffer != NULL);
+
+  return (UINT32)(
+            ReadUnaligned16 ((UINT16*)Buffer) |
+            (((UINT8*)Buffer)[2] << 16)
+            );
+}
+
+/**
+  Writes a 24-bit value to memory that may be unaligned.
+
+  This function writes the 24-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 24-bit value that may be unaligned.
+  @param  Value   24-bit value to write to Buffer.
+
+  @return The value written.
+
+**/
+UINT32
+EFIAPI
+WriteUnaligned24 (
+  OUT     UINT32                    *Buffer,
+  IN      UINT32                    Value
+  )
+{
+  ASSERT (Buffer != NULL);
+
+  WriteUnaligned16 ((UINT16*)Buffer, (UINT16)Value);
+  *(UINT8*)((UINT16*)Buffer + 1) = (UINT8)(Value >> 16);
+  return Value;
+}
+
+/**
+  Reads a 32-bit value from memory that may be unaligned.
+
+  This function returns the 32-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 32-bit value that may be unaligned.
+
+  @return *Uint32
+
+**/
+UINT32
+EFIAPI
+ReadUnaligned32 (
+  IN      CONST UINT32              *Buffer
+  )
+{
+  UINT16  LowerBytes;
+  UINT16  HigherBytes;
+
+  ASSERT (Buffer != NULL);
+
+  LowerBytes  = ReadUnaligned16 ((UINT16*) Buffer);
+  HigherBytes = ReadUnaligned16 ((UINT16*) Buffer + 1);
+
+  return (UINT32) (LowerBytes | (HigherBytes << 16));
+}
+
+/**
+  Writes a 32-bit value to memory that may be unaligned.
+
+  This function writes the 32-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 32-bit value that may be unaligned.
+  @param  Value   32-bit value to write to Buffer.
+
+  @return Value
+
+**/
+UINT32
+EFIAPI
+WriteUnaligned32 (
+  OUT     UINT32                    *Buffer,
+  IN      UINT32                    Value
+  )
+{
+  ASSERT (Buffer != NULL);
+
+  WriteUnaligned16 ((UINT16*)Buffer, (UINT16)Value);
+  WriteUnaligned16 ((UINT16*)Buffer + 1, (UINT16)(Value >> 16));
+  return Value;
+}
+
+/**
+  Reads a 64-bit value from memory that may be unaligned.
+
+  This function returns the 64-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 64-bit value that may be unaligned.
+
+  @return *Uint64
+
+**/
+UINT64
+EFIAPI
+ReadUnaligned64 (
+  IN      CONST UINT64              *Buffer
+  )
+{
+  UINT32  LowerBytes;
+  UINT32  HigherBytes;
+
+  ASSERT (Buffer != NULL);
+
+  LowerBytes  = ReadUnaligned32 ((UINT32*) Buffer);
+  HigherBytes = ReadUnaligned32 ((UINT32*) Buffer + 1);
+
+  return (UINT64) (LowerBytes | LShiftU64 (HigherBytes, 32));
+}
+
+/**
+  Writes a 64-bit value to memory that may be unaligned.
+
+  This function writes the 64-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 64-bit value that may be unaligned.
+  @param  Value   64-bit value to write to Buffer.
+
+  @return Value
+
+**/
+UINT64
+EFIAPI
+WriteUnaligned64 (
+  OUT     UINT64                    *Buffer,
+  IN      UINT64                    Value
+  )
+{
+  ASSERT (Buffer != NULL);
+
+  WriteUnaligned32 ((UINT32*)Buffer, (UINT32)Value);
+  WriteUnaligned32 ((UINT32*)Buffer + 1, (UINT32)RShiftU64 (Value, 32));
+  return Value;
+}
diff --git a/MdePkg/Library/BaseLib/Ipf/asm.h b/MdePkg/Library/BaseLib/Ipf/asm.h
new file mode 100644
index 0000000000..8ef0b30626
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/asm.h
@@ -0,0 +1,27 @@
+/// @file
+///   This module contains generic macros for an assembly writer.
+///
+/// Copyright (c) 2006, Intel Corporation<BR>
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: asm.h
+///
+#ifndef _ASM_H
+#define _ASM_H
+
+#define TRUE  1
+#define FALSE 0
+#define PROCEDURE_ENTRY(name)   .##text;            \
+  .##type name, @function; \
+  .##proc name; \
+  name::
+
+#define PROCEDURE_EXIT(name)  .##endp name
+
+#endif // _ASM_H
diff --git a/MdePkg/Library/BaseLib/Ipf/ia_64gen.h b/MdePkg/Library/BaseLib/Ipf/ia_64gen.h
new file mode 100644
index 0000000000..081cc4a8f6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/ia_64gen.h
@@ -0,0 +1,205 @@
+/// @file
+/// 
+/// 
+/// Copyright (c) 2006, Intel Corporation<BR>
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+/// 
+/// Module Name: ia_64gen.h
+///
+#ifndef _IA64GEN_H
+#define _IA64GEN_H
+
+#define TT_UNAT           0
+#define C_PSR             0
+#define J_UNAT            0
+#define T_TYPE            0
+#define T_IPSR            0x8
+#define T_ISR             0x10
+#define T_IIP             0x18
+#define T_IFA             0x20
+#define T_IIPA            0x28
+#define T_IFS             0x30
+#define T_IIM             0x38
+#define T_RSC             0x40
+#define T_BSP             0x48
+#define T_BSPSTORE        0x50
+#define T_RNAT            0x58
+#define T_PFS             0x60
+#define T_KBSPSTORE       0x68
+#define T_UNAT            0x70
+#define T_CCV             0x78
+#define T_DCR             0x80
+#define T_PREDS           0x88
+#define T_NATS            0x90
+#define T_R1              0x98
+#define T_GP              0x98
+#define T_R2              0xa0
+#define T_R3              0xa8
+#define T_R4              0xb0
+#define T_R5              0xb8
+#define T_R6              0xc0
+#define T_R7              0xc8
+#define T_R8              0xd0
+#define T_R9              0xd8
+#define T_R10             0xe0
+#define T_R11             0xe8
+#define T_R12             0xf0
+#define T_SP              0xf0
+#define T_R13             0xf8
+#define T_R14             0x100
+#define T_R15             0x108
+#define T_R16             0x110
+#define T_R17             0x118
+#define T_R18             0x120
+#define T_R19             0x128
+#define T_R20             0x130
+#define T_R21             0x138
+#define T_R22             0x140
+#define T_R23             0x148
+#define T_R24             0x150
+#define T_R25             0x158
+#define T_R26             0x160
+#define T_R27             0x168
+#define T_R28             0x170
+#define T_R29             0x178
+#define T_R30             0x180
+#define T_R31             0x188
+#define T_F2              0x1f0
+#define T_F3              0x200
+#define T_F4              0x210
+#define T_F5              0x220
+#define T_F6              0x230
+#define T_F7              0x240
+#define T_F8              0x250
+#define T_F9              0x260
+#define T_F10             0x270
+#define T_F11             0x280
+#define T_F12             0x290
+#define T_F13             0x2a0
+#define T_F14             0x2b0
+#define T_F15             0x2c0
+#define T_F16             0x2d0
+#define T_F17             0x2e0
+#define T_F18             0x2f0
+#define T_F19             0x300
+#define T_F20             0x310
+#define T_F21             0x320
+#define T_F22             0x330
+#define T_F23             0x340
+#define T_F24             0x350
+#define T_F25             0x360
+#define T_F26             0x370
+#define T_F27             0x380
+#define T_F28             0x390
+#define T_F29             0x3a0
+#define T_F30             0x3b0
+#define T_F31             0x3c0
+#define T_FPSR            0x1e0
+#define T_B0              0x190
+#define T_B1              0x198
+#define T_B2              0x1a0
+#define T_B3              0x1a8
+#define T_B4              0x1b0
+#define T_B5              0x1b8
+#define T_B6              0x1c0
+#define T_B7              0x1c8
+#define T_EC              0x1d0
+#define T_LC              0x1d8
+#define J_NATS            0x8
+#define J_PFS             0x10
+#define J_BSP             0x18
+#define J_RNAT            0x20
+#define J_PREDS           0x28
+#define J_LC              0x30
+#define J_R4              0x38
+#define J_R5              0x40
+#define J_R6              0x48
+#define J_R7              0x50
+#define J_SP              0x58
+#define J_F2              0x60
+#define J_F3              0x70
+#define J_F4              0x80
+#define J_F5              0x90
+#define J_F16             0xa0
+#define J_F17             0xb0
+#define J_F18             0xc0
+#define J_F19             0xd0
+#define J_F20             0xe0
+#define J_F21             0xf0
+#define J_F22             0x100
+#define J_F23             0x110
+#define J_F24             0x120
+#define J_F25             0x130
+#define J_F26             0x140
+#define J_F27             0x150
+#define J_F28             0x160
+#define J_F29             0x170
+#define J_F30             0x180
+#define J_F31             0x190
+#define J_FPSR            0x1a0
+#define J_B0              0x1a8
+#define J_B1              0x1b0
+#define J_B2              0x1b8
+#define J_B3              0x1c0
+#define J_B4              0x1c8
+#define J_B5              0x1d0
+#define TRAP_FRAME_LENGTH 0x3d0
+#define C_UNAT            0x28
+#define C_NATS            0x30
+#define C_PFS             0x8
+#define C_BSPSTORE        0x10
+#define C_RNAT            0x18
+#define C_RSC             0x20
+#define C_PREDS           0x38
+#define C_LC              0x40
+#define C_DCR             0x48
+#define C_R1              0x50
+#define C_GP              0x50
+#define C_R4              0x58
+#define C_R5              0x60
+#define C_R6              0x68
+#define C_R7              0x70
+#define C_SP              0x78
+#define C_R13             0x80
+#define C_F2              0x90
+#define C_F3              0xa0
+#define C_F4              0xb0
+#define C_F5              0xc0
+#define C_F16             0xd0
+#define C_F17             0xe0
+#define C_F18             0xf0
+#define C_F19             0x100
+#define C_F20             0x110
+#define C_F21             0x120
+#define C_F22             0x130
+#define C_F23             0x140
+#define C_F24             0x150
+#define C_F25             0x160
+#define C_F26             0x170
+#define C_F27             0x180
+#define C_F28             0x190
+#define C_F29             0x1a0
+#define C_F30             0x1b0
+#define C_F31             0x1c0
+#define C_FPSR            0x1d0
+#define C_B0              0x1d8
+#define C_B1              0x1e0
+#define C_B2              0x1e8
+#define C_B3              0x1f0
+#define C_B4              0x1f8
+#define C_B5              0x200
+#define TT_R2             0x8
+#define TT_R3             0x10
+#define TT_R8             0x18
+#define TT_R9             0x20
+#define TT_R10            0x28
+#define TT_R11            0x30
+#define TT_R14            0x38
+
+#endif _IA64GEN_H
diff --git a/MdePkg/Library/BaseLib/Ipf/longjmp.s b/MdePkg/Library/BaseLib/Ipf/longjmp.s
new file mode 100644
index 0000000000..20a0df10f7
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/longjmp.s
@@ -0,0 +1,121 @@
+/// @file
+///  Contains an implementation of longjmp for the Itanium-based architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: longjmp.s
+///
+///
+
+.auto
+.text
+
+.proc   InternalLongJump
+.type   InternalLongJump, @function
+.regstk 2, 0, 0, 0
+InternalLongJump::
+        add                 r10 = 0x10*20 + 8*14, in0
+        movl                r2  = ~((((1 << 14) - 1) << 16) | 3)
+
+        ld8.nt1             r14 = [r10], -8*2       // BSP, skip PFS
+        mov                 r15 = ar.bspstore       // BSPSTORE
+
+        ld8.nt1             r17 = [r10], -8         // UNAT after spill
+        mov                 r16 = ar.rsc            // RSC
+        cmp.leu             p6  = r14, r15
+
+        ld8.nt1             r18 = [r10], -8         // UNAT
+        ld8.nt1             r25 = [r10], -8         // b5
+        and                 r2  = r16, r2
+
+        ldf.fill.nt1        f2  = [in0], 0x10
+        ld8.nt1             r24 = [r10], -8         // b4
+        mov                 b5  = r25
+
+        mov                 ar.rsc = r2
+        ld8.nt1             r23 = [r10], -8         // b3
+        mov                 b4  = r24
+
+        ldf.fill.nt1        f3  = [in0], 0x10
+        mov                 ar.unat = r17
+(p6)    br.spnt.many        _skip_flushrs
+
+        flushrs
+        mov                 r15 = ar.bsp            // New BSPSTORE
+
+_skip_flushrs:
+        mov                 r31 = ar.rnat           // RNAT
+        loadrs
+
+        ldf.fill.nt1        f4  = [in0], 0x10
+        ld8.nt1             r22 = [r10], -8
+        dep                 r2  = -1, r14, 3, 6
+
+        ldf.fill.nt1        f5  = [in0], 0x10
+        ld8.nt1             r21 = [r10], -8
+        cmp.ltu             p6  = r2, r15
+
+        ld8.nt1             r20 = [r10], -0x10      // skip sp
+(p6)    ld8.nta             r31 = [r2]
+        mov                 b3  = r23
+
+        ldf.fill.nt1        f16 = [in0], 0x10
+        ld8.fill.nt1        r7  = [r10], -8
+        mov                 b2  = r22
+
+        ldf.fill.nt1        f17 = [in0], 0x10
+        ld8.fill.nt1        r6  = [r10], -8
+        mov                 b1  = r21
+
+        ldf.fill.nt1        f18 = [in0], 0x10
+        ld8.fill.nt1        r5  = [r10], -8
+        mov                 b0  = r20
+
+        ldf.fill.nt1        f19 = [in0], 0x10
+        ld8.fill.nt1        r4  = [r10], 8*13
+
+        ldf.fill.nt1        f20 = [in0], 0x10
+        ld8.nt1             r19 = [r10], 0x10       // PFS
+
+        ldf.fill.nt1        f21 = [in0], 0x10
+        ld8.nt1             r26 = [r10], 8          // Predicate
+        mov                 ar.pfs = r19
+
+        ldf.fill.nt1        f22 = [in0], 0x10
+        ld8.nt1             r27 = [r10], 8          // LC
+        mov                 pr  = r26, -1
+
+        ldf.fill.nt1        f23 = [in0], 0x10
+        ld8.nt1             r28 = [r10], -17*8 - 0x10
+        mov                 ar.lc = r27
+
+        ldf.fill.nt1        f24 = [in0], 0x10
+        ldf.fill.nt1        f25 = [in0], 0x10
+        mov                 r8  = in1
+
+        ldf.fill.nt1        f26 = [in0], 0x10
+        ldf.fill.nt1        f31 = [r10], -0x10
+
+        ldf.fill.nt1        f27 = [in0], 0x10
+        ldf.fill.nt1        f30 = [r10], -0x10
+
+        ldf.fill.nt1        f28 = [in0]
+        ldf.fill.nt1        f29 = [r10], 0x10*3 + 8*4
+
+        ld8.fill.nt1        sp  = [r10]
+        mov                 ar.unat = r18
+
+        mov                 ar.bspstore = r14
+        mov                 ar.rnat = r31
+
+        invala
+        mov                 ar.rsc = r16
+        br.ret.sptk         b0
+.endp
diff --git a/MdePkg/Library/BaseLib/Ipf/setjmp.s b/MdePkg/Library/BaseLib/Ipf/setjmp.s
new file mode 100644
index 0000000000..e2b346ee72
--- /dev/null
+++ b/MdePkg/Library/BaseLib/Ipf/setjmp.s
@@ -0,0 +1,108 @@
+/// @file
+///  Contains an implementation of longjmp for the Itanium-based architecture.
+///
+/// Copyright (c) 2006, Intel Corporation
+/// All rights reserved. This program and the accompanying materials
+/// are licensed and made available under the terms and conditions of the BSD License
+/// which accompanies this distribution.  The full text of the license may be found at
+/// http://opensource.org/licenses/bsd-license.php
+///
+/// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+///
+/// Module Name: longjmp.s
+///
+///
+
+.auto
+.text
+
+.globl InternalAssertJumpBuffer
+.type   InternalAssertJumpBuffer, @function
+
+.proc   SetJump
+.type   SetJump, @function
+SetJump::
+        alloc               loc0 = ar.pfs, 1, 2, 1, 0
+        mov                 loc1 = b0
+        mov                 out0 = in0
+
+        brl.call.sptk.many  b0  = InternalAssertJumpBuffer
+
+        mov                 r14 = ar.unat
+        mov                 r15 = ar.bsp
+        add                 r10 = 0x10*20, in0
+
+        stf.spill.nta       [in0] = f2, 0x10
+        st8.spill.nta       [r10] = r4, 8
+        mov                 r21 = b1
+
+        stf.spill.nta       [in0] = f3, 0x10
+        st8.spill.nta       [r10] = r5, 8
+        mov                 r22 = b2
+
+        stf.spill.nta       [in0] = f4, 0x10
+        st8.spill.nta       [r10] = r6, 8
+        mov                 r23 = b3
+
+        stf.spill.nta       [in0] = f5, 0x10
+        st8.spill.nta       [r10] = r7, 8
+        mov                 r24 = b4
+
+        stf.spill.nta       [in0] = f16, 0x10
+        st8.spill.nta       [r10] = sp, 8
+        mov                 r25 = b5
+
+        stf.spill.nta       [in0] = f17, 0x10
+        st8.nta             [r10] = loc1, 8
+        mov                 r16 = pr
+
+        stf.spill.nta       [in0] = f18, 0x10
+        st8.nta             [r10] = r21, 8
+        mov                 r17 = ar.lc
+
+        stf.spill.nta       [in0] = f19, 0x10
+        st8.nta             [r10] = r22, 8
+
+        stf.spill.nta       [in0] = f20, 0x10
+        st8.nta             [r10] = r23, 8
+
+        stf.spill.nta       [in0] = f21, 0x10
+        st8.nta             [r10] = r24, 8
+
+        stf.spill.nta       [in0] = f22, 0x10
+        st8.nta             [r10] = r25, 8
+
+        stf.spill.nta       [in0] = f23, 0x10
+        mov                 r18 = ar.unat
+
+        stf.spill.nta       [in0] = f24, 0x10
+        st8.nta             [r10] = r14, 8          // UNAT
+
+        stf.spill.nta       [in0] = f25, 0x10
+        st8.nta             [r10] = r18, 8          // UNAT after spill
+
+        stf.spill.nta       [in0] = f26, 0x10
+        st8.nta             [r10] = loc0, 8         // PFS
+
+        stf.spill.nta       [in0] = f27, 0x10
+        st8.nta             [r10] = r15, 8          // BSP
+        mov                 r8  = 0
+
+        stf.spill.nta       [in0] = f28, 0x10
+        mov                 r19 = ar.fpsr
+
+        stf.spill.nta       [in0] = f29, 0x10
+        st8.nta             [r10] = r16, 8          // PR
+        mov                 ar.pfs = loc0
+
+        stf.spill.nta       [in0] = f30, 0x10
+        st8.nta             [r10] = r17, 8          // LC
+        mov                 b0  = loc1
+
+        stf.spill.nta       [in0] = f31, 0x10
+        st8.nta             [r10] = r19             // FPSR
+
+        mov                 ar.unat = r14
+        br.ret.sptk         b0
+.endp   SetJump
diff --git a/MdePkg/Library/BaseLib/X64/CpuBreakpoint.S b/MdePkg/Library/BaseLib/X64/CpuBreakpoint.S
new file mode 100644
index 0000000000..710006bdd1
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuBreakpoint.S
@@ -0,0 +1,25 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuBreakpoint.S
+#
+# Abstract:
+#
+#   Implementation of CpuBreakpoint() on x86_64
+#
+#------------------------------------------------------------------------------
+
+.global _CpuBreakpoint
+_CpuBreakpoint:
+	int $0x3
+	ret
diff --git a/MdePkg/Library/BaseLib/X64/CpuBreakpoint.asm b/MdePkg/Library/BaseLib/X64/CpuBreakpoint.asm
new file mode 100644
index 0000000000..f1ebe47b21
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuBreakpoint.asm
@@ -0,0 +1,37 @@
+;------------------------------------------------------------------------------ ;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CpuBreakpoint.Asm
+;
+; Abstract:
+;
+;   CpuBreakpoint function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; CpuBreakpoint (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+CpuBreakpoint   PROC
+    int  3
+    ret
+CpuBreakpoint   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/CpuBreakpoint.c b/MdePkg/Library/BaseLib/X64/CpuBreakpoint.c
new file mode 100644
index 0000000000..01939e9128
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuBreakpoint.c
@@ -0,0 +1,31 @@
+/** @file
+  CpuBreakpoint function.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+void __debugbreak ();
+
+#pragma intrinsic(__debugbreak)
+
+VOID
+EFIAPI
+CpuBreakpoint (
+  VOID
+  )
+{
+  __debugbreak ();
+}
+
diff --git a/MdePkg/Library/BaseLib/X64/CpuFlushTlb.S b/MdePkg/Library/BaseLib/X64/CpuFlushTlb.S
new file mode 100644
index 0000000000..2dbaf846c4
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuFlushTlb.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------ 
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuFlushTlb.Asm
+#
+# Abstract:
+#
+#   CpuFlushTlb function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.global _CpuFlushTlb
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# CpuFlushTlb (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+_CpuFlushTlb:
+    mov     %cr3, %rax
+    mov     %rax, %cr3
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/CpuFlushTlb.asm b/MdePkg/Library/BaseLib/X64/CpuFlushTlb.asm
new file mode 100644
index 0000000000..c2c4490e9d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuFlushTlb.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------ ;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CpuFlushTlb.Asm
+;
+; Abstract:
+;
+;   CpuFlushTlb function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; CpuFlushTlb (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+CpuFlushTlb PROC
+    mov     rax, cr3
+    mov     cr3, rax
+    ret
+CpuFlushTlb ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/CpuId.S b/MdePkg/Library/BaseLib/X64/CpuId.S
new file mode 100644
index 0000000000..98d7faaa06
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuId.S
@@ -0,0 +1,60 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuId.S
+#
+# Abstract:
+#
+#   AsmCpuid function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+#  VOID
+#  EFIAPI
+#  AsmCpuid (
+#    IN   UINT32  RegisterInEax,
+#    OUT  UINT32  *RegisterOutEax  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEdx  OPTIONAL
+#    )
+#------------------------------------------------------------------------------
+.global _AsmCpuid;
+_AsmCpuid:
+    push    %rbx
+    mov     %ecx, %eax
+    push    %rax                         # save Index on stack
+    push    %rdx
+    cpuid
+    test    %r9, %r9
+    jz      L1
+    mov     %ecx, (%r9)
+L1:
+    pop     %rcx
+    jrcxz   L2
+    mov     %eax, (%rcx)
+L2:
+    mov     %r8, %rcx
+    jrcxz   L3
+    mov     %ebx, (%rcx)
+L3:
+    mov     0x38(%rsp), %rcx
+    jrcxz   L4
+    mov     %edx, (%rcx)
+L4:
+    pop     %rax                         # restore Index to rax as return value
+    pop     %rbx
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/CpuId.asm b/MdePkg/Library/BaseLib/X64/CpuId.asm
new file mode 100644
index 0000000000..5e7ee19c53
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuId.asm
@@ -0,0 +1,62 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CpuId.Asm
+;
+; Abstract:
+;
+;   AsmCpuid function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID
+;  EFIAPI
+;  AsmCpuid (
+;    IN   UINT32  RegisterInEax,
+;    OUT  UINT32  *RegisterOutEax  OPTIONAL,
+;    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
+;    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
+;    OUT  UINT32  *RegisterOutEdx  OPTIONAL
+;    )
+;------------------------------------------------------------------------------
+AsmCpuid    PROC    USES    rbx
+    mov     eax, ecx
+    push    rax                         ; save Index on stack
+    push    rdx
+    cpuid
+    test    r9, r9
+    jz      @F
+    mov     [r9], ecx
+@@:
+    pop     rcx
+    jrcxz   @F
+    mov     [rcx], eax
+@@:
+    mov     rcx, r8
+    jrcxz   @F
+    mov     [rcx], ebx
+@@:
+    mov     rcx, [rsp + 38h]
+    jrcxz   @F
+    mov     [rcx], edx
+@@:
+    pop     rax                         ; restore Index to rax as return value
+    ret
+AsmCpuid    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/CpuIdEx.S b/MdePkg/Library/BaseLib/X64/CpuIdEx.S
new file mode 100644
index 0000000000..e5317e04cb
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuIdEx.S
@@ -0,0 +1,62 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuIdEx.Asm
+#
+# Abstract:
+#
+#   AsmCpuidEx function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+#  UINT32
+#  EFIAPI
+#  AsmCpuidEx (
+#    IN   UINT32  RegisterInEax,
+#    IN   UINT32  RegisterInEcx,
+#    OUT  UINT32  *RegisterOutEax  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
+#    OUT  UINT32  *RegisterOutEdx  OPTIONAL
+#    )
+#------------------------------------------------------------------------------
+.global _AsmCpuidEx
+_AsmCpuidEx:
+    push    %rbx
+    movl    %ecx,%eax
+    movl    %edx,%ecx
+    push    %rax
+    cpuid
+    mov     0x38(%rsp), %r10
+    test    %r10, %r10
+    jz      L1
+    mov     %ecx,(%r10)
+L1: 
+    mov     %r8, %rcx
+    jrcxz   L2
+    movl    %eax,(%rcx)
+L2: 
+    mov     %r9, %rcx
+    jrcxz   L3
+    mov     %ebx, (%rcx)
+L3: 
+    mov     0x40(%rsp), %rcx
+    jrcxz   L4
+    mov     %edx, (%rcx)
+L4: 
+    pop     %rax
+    pop     %rbx
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/CpuIdEx.asm b/MdePkg/Library/BaseLib/X64/CpuIdEx.asm
new file mode 100644
index 0000000000..450cf543f7
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuIdEx.asm
@@ -0,0 +1,64 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CpuIdEx.Asm
+;
+; Abstract:
+;
+;   AsmCpuidEx function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  UINT32
+;  EFIAPI
+;  AsmCpuidEx (
+;    IN   UINT32  RegisterInEax,
+;    IN   UINT32  RegisterInEcx,
+;    OUT  UINT32  *RegisterOutEax  OPTIONAL,
+;    OUT  UINT32  *RegisterOutEbx  OPTIONAL,
+;    OUT  UINT32  *RegisterOutEcx  OPTIONAL,
+;    OUT  UINT32  *RegisterOutEdx  OPTIONAL
+;    )
+;------------------------------------------------------------------------------
+AsmCpuidEx  PROC    USES    rbx
+    mov     eax, ecx
+    mov     ecx, edx
+    push    rax                         ; save Index on stack
+    cpuid
+    mov     r10, [rsp + 38h]
+    test    r10, r10
+    jz      @F
+    mov     [r10], ecx
+@@:
+    mov     rcx, r8
+    jrcxz   @F
+    mov     [rcx], eax
+@@:
+    mov     rcx, r9
+    jrcxz   @F
+    mov     [rcx], ebx
+@@:
+    mov     rcx, [rsp + 40h]
+    jrcxz   @F
+    mov     [rcx], edx
+@@:
+    pop     rax                         ; restore Index to rax as return value
+    ret
+AsmCpuidEx  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/CpuPause.S b/MdePkg/Library/BaseLib/X64/CpuPause.S
new file mode 100644
index 0000000000..0ecaa85b61
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuPause.S
@@ -0,0 +1,34 @@
+#------------------------------------------------------------------------------ ;
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuPause.S
+#
+# Abstract:
+#
+#   CpuPause function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# CpuPause (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _CpuPause;
+_CpuPause:
+    pause
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/CpuPause.asm b/MdePkg/Library/BaseLib/X64/CpuPause.asm
new file mode 100644
index 0000000000..d16da37712
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuPause.asm
@@ -0,0 +1,37 @@
+;------------------------------------------------------------------------------ ;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CpuPause.Asm
+;
+; Abstract:
+;
+;   CpuPause function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; CpuPause (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+CpuPause    PROC
+    pause
+    ret
+CpuPause    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/CpuSleep.S b/MdePkg/Library/BaseLib/X64/CpuSleep.S
new file mode 100644
index 0000000000..681e4c12c3
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuSleep.S
@@ -0,0 +1,34 @@
+#------------------------------------------------------------------------------ ;
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CpuSleep.S
+#
+# Abstract:
+#
+#   CpuSleep function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# CpuSleep (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _CpuSleep;
+_CpuSleep:
+    hlt
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/CpuSleep.asm b/MdePkg/Library/BaseLib/X64/CpuSleep.asm
new file mode 100644
index 0000000000..b2c4907032
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/CpuSleep.asm
@@ -0,0 +1,37 @@
+;------------------------------------------------------------------------------ ;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CpuSleep.Asm
+;
+; Abstract:
+;
+;   CpuSleep function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; CpuSleep (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+CpuSleep    PROC
+    hlt
+    ret
+CpuSleep    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/DisableInterrupts.S b/MdePkg/Library/BaseLib/X64/DisableInterrupts.S
new file mode 100644
index 0000000000..da16886b8b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/DisableInterrupts.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   DisableInterrupts.S
+#
+# Abstract:
+#
+#   DisableInterrupts function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# DisableInterrupts (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _DisableInterrupts;
+_DisableInterrupts:
+    cli
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/DisableInterrupts.asm b/MdePkg/Library/BaseLib/X64/DisableInterrupts.asm
new file mode 100644
index 0000000000..586832c1a2
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/DisableInterrupts.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   DisableInterrupts.Asm
+;
+; Abstract:
+;
+;   DisableInterrupts function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; DisableInterrupts (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+DisableInterrupts   PROC
+    cli
+    ret
+DisableInterrupts   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/DisablePaging64.S b/MdePkg/Library/BaseLib/X64/DisablePaging64.S
new file mode 100644
index 0000000000..d23313de38
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/DisablePaging64.S
@@ -0,0 +1,66 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   DisablePaging64.S
+#
+# Abstract:
+#
+#   AsmDisablePaging64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+    
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86DisablePaging64 (
+#   IN      UINT16                    Cs,			%rdi
+#   IN      UINT64                    EntryPoint,		%rsi
+#   IN      UINT64                    Context1,  OPTIONAL	%rdx
+#   IN      UINT32                    Context2,  OPTIONAL	%rcx
+#   IN      UINT64                    NewStack			%r8
+#   );
+#------------------------------------------------------------------------------
+
+.global _InternalX86DisablePaging64
+_InternalX86DisablePaging64:
+    cli    
+    shl    $0x20,%rcx
+    lea    (%rip), %eax
+    mov    %eax,%ecx
+    push   %rcx
+    mov    %edx,%ebx
+    mov    %r8d,%esi
+    mov    %r9d,%edi
+    mov    0x28(%rsp),%eax
+    lret   
+L1:
+    mov    %eax,%esp
+    mov    %cr0,%rax
+    btr    $0x1f,%eax
+    mov    %rax,%cr0
+    mov    $0xc0000080,%ecx
+    rdmsr  
+    and    $0xfe,%ah
+    wrmsr  
+    mov    %cr4,%rax
+    and    $0xdf,%al
+    mov    %rax,%cr4
+    push   %rdi
+    push   %rsi
+    callq  *%rbx
+    jmp    .
+
diff --git a/MdePkg/Library/BaseLib/X64/DisablePaging64.asm b/MdePkg/Library/BaseLib/X64/DisablePaging64.asm
new file mode 100644
index 0000000000..518137ddc9
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/DisablePaging64.asm
@@ -0,0 +1,65 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   DisablePaging64.Asm
+;
+; Abstract:
+;
+;   AsmDisablePaging64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86DisablePaging64 (
+;   IN      UINT16                    Cs,
+;   IN      UINT32                    EntryPoint,
+;   IN      UINT32                    Context1,  OPTIONAL
+;   IN      UINT32                    Context2,  OPTIONAL
+;   IN      UINT32                    NewStack
+;   );
+;------------------------------------------------------------------------------
+InternalX86DisablePaging64    PROC
+    cli
+    shl     rcx, 32                     ; rcx[32..47] <- Cs
+    lea     eax, @F
+    mov     esi, r8d
+    or      rcx, rax                    ; rcx[0..47] <- Cs:@F
+    mov     edi, r9d
+    mov     eax, [rsp + 28h]            ; eax <- New Stack
+    push    rcx
+    retf                                ; switch to compatibility mode
+@@:
+    mov     esp, eax                    ; set up new stack
+    mov     rax, cr0
+    btr     eax, 31
+    mov     cr0, rax                    ; disable paging
+    mov     ecx, 0c0000080h
+    rdmsr
+    and     ah, NOT 1                   ; clear LME
+    wrmsr
+    mov     rax, cr4
+    and     al, NOT (1 SHL 5)           ; clear PAE
+    mov     cr4, rax
+    push    rdi                         ; push Context2
+    push    rsi                         ; push Context1
+    call    rdx                         ; transfer control to EntryPoint
+    hlt                                 ; no one should get here
+InternalX86DisablePaging64    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.S b/MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.S
new file mode 100644
index 0000000000..581b7bb345
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   EnableDisableInterrupts.S
+#
+# Abstract:
+#
+#   EnableDisableInterrupts function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# EnableDisableInterrupts (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _EnableDisableInterrupts;
+.align 16;
+_EnableDisableInterrupts:
+    sti
+    cli
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.asm b/MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.asm
new file mode 100644
index 0000000000..0d0400f007
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/EnableDisableInterrupts.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   EnableDisableInterrupts.Asm
+;
+; Abstract:
+;
+;   EnableDisableInterrupts function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; EnableDisableInterrupts (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+EnableDisableInterrupts PROC
+    sti
+    cli
+    ret
+EnableDisableInterrupts ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/EnableInterrupts.S b/MdePkg/Library/BaseLib/X64/EnableInterrupts.S
new file mode 100644
index 0000000000..b81bcd0747
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/EnableInterrupts.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   EnableInterrupts.S
+#
+# Abstract:
+#
+#   EnableInterrupts function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# EnableInterrupts (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _EnableInterrupts;
+_EnableInterrupts:
+    sti
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/EnableInterrupts.asm b/MdePkg/Library/BaseLib/X64/EnableInterrupts.asm
new file mode 100644
index 0000000000..8fb4adfe37
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/EnableInterrupts.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   EnableInterrupts.Asm
+;
+; Abstract:
+;
+;   EnableInterrupts function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; EnableInterrupts (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+EnableInterrupts    PROC
+    sti
+    ret
+EnableInterrupts    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/EnablePaging64.S b/MdePkg/Library/BaseLib/X64/EnablePaging64.S
new file mode 100644
index 0000000000..15209c0030
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/EnablePaging64.S
@@ -0,0 +1,61 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   EnablePaging64.S
+#
+# Abstract:
+#
+#   AsmEnablePaging64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86EnablePaging64 (
+#   IN      UINT16                    Cs,			%rdi
+#   IN      UINT64                    EntryPoint,		%rsi
+#   IN      UINT64                    Context1,  OPTIONAL	%rdx
+#   IN      UINT64                    Context2,  OPTIONAL	%rcx
+#   IN      UINT64                    NewStack			%r8
+#   );
+#------------------------------------------------------------------------------
+.global _InternalX86EnablePaging64;
+_InternalX86EnablePaging64:
+    cli    
+    pop    %rax
+    callq  Base
+Base:
+    addl   $(L1-Base),(%rsp)
+    mov    %cr4,%rax
+    or     $0x20,%al
+    mov    %rax,%cr4
+    mov    $0xc0000080,%ecx
+    rdmsr  
+    or     $0x1,%ah
+    wrmsr  
+    mov    %cr0,%rax
+    bts    $0x1f,%eax
+    mov    %rax,%cr0
+    lret   
+L1:
+    addr32 mov (%esp),%rbx
+    addr32 mov 0x8(%esp),%rcx
+    addr32 mov 0x10(%esp),%rdx
+    addr32 mov 0x18(%esp),%rsp
+    add    $-0x20,%rsp
+    callq  *%rbx
+    jmp    .
diff --git a/MdePkg/Library/BaseLib/X64/EnablePaging64.asm b/MdePkg/Library/BaseLib/X64/EnablePaging64.asm
new file mode 100644
index 0000000000..c54843008a
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/EnablePaging64.asm
@@ -0,0 +1,64 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   EnablePaging64.Asm
+;
+; Abstract:
+;
+;   AsmEnablePaging64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86EnablePaging64 (
+;   IN      UINT16                    Cs,
+;   IN      UINT64                    EntryPoint,
+;   IN      UINT64                    Context1,  OPTIONAL
+;   IN      UINT64                    Context2,  OPTIONAL
+;   IN      UINT64                    NewStack
+;   );
+;------------------------------------------------------------------------------
+InternalX86EnablePaging64 PROC
+    cli
+    pop     rax                         ; skip the return address
+    call    @Base
+@Base:
+    add     dword ptr [rsp], @F - @Base ; offset for far retf, seg is the 1st arg
+    mov     rax, cr4                    ; mov eax, cr4
+    or      al, (1 SHL 5)
+    mov     cr4, rax                    ; enable PAE
+    mov     ecx, 0c0000080h
+    rdmsr
+    or      ah, 1                       ; set LME
+    wrmsr
+    mov     rax, cr0                    ; mov eax, cr0
+    bts     eax, 31
+    mov     cr0, rax                    ; enable paging
+    retf
+@@:                                     ; long mode starts here
+    mov     rbx, [esp]
+    mov     rcx, [esp + 8]
+    mov     rdx, [esp + 10h]
+    mov     rsp, [esp + 18h]
+    add     rsp, -20h
+    call    rbx
+    hlt                                 ; halt processor if EntryPoint() returned
+InternalX86EnablePaging64 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/FlushCacheLine.S b/MdePkg/Library/BaseLib/X64/FlushCacheLine.S
new file mode 100644
index 0000000000..4c5a52fbf5
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/FlushCacheLine.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   FlushCacheLine.S
+#
+# Abstract:
+#
+#   AsmFlushCacheLine function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID *
+# EFIAPI 
+# AsmFlushCacheLine (
+#   IN      VOID                      *LinearAddress
+#   );
+#------------------------------------------------------------------------------
+.global _AsmFlushCacheLine;
+_AsmFlushCacheLine:
+    clflush (%rdi)
+    mov     %rdi, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/FlushCacheLine.asm b/MdePkg/Library/BaseLib/X64/FlushCacheLine.asm
new file mode 100644
index 0000000000..83966a691d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/FlushCacheLine.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   FlushCacheLine.Asm
+;
+; Abstract:
+;
+;   AsmFlushCacheLine function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID *
+; EFIAPI 
+; AsmFlushCacheLine (
+;   IN      VOID                      *LinearAddress
+;   );
+;------------------------------------------------------------------------------
+AsmFlushCacheLine   PROC
+    clflush [rcx]
+    mov     rax, rcx
+    ret
+AsmFlushCacheLine   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/FxRestore.S b/MdePkg/Library/BaseLib/X64/FxRestore.S
new file mode 100644
index 0000000000..cc9750c57c
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/FxRestore.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   FxRestore.S
+#
+# Abstract:
+#
+#   AsmFxRestore function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86FxRestore (
+#   IN CONST IA32_FX_BUFFER *Buffer
+#   )#
+#------------------------------------------------------------------------------
+.global _InternalX86FxRestore;
+_InternalX86FxRestore:
+    fxrstor (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/FxRestore.asm b/MdePkg/Library/BaseLib/X64/FxRestore.asm
new file mode 100644
index 0000000000..7e7037e9e6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/FxRestore.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   FxRestore.Asm
+;
+; Abstract:
+;
+;   AsmFxRestore function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86FxRestore (
+;   IN CONST IA32_FX_BUFFER *Buffer
+;   );
+;------------------------------------------------------------------------------
+InternalX86FxRestore  PROC
+    fxrstor [rcx]
+    ret
+InternalX86FxRestore  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/FxSave.S b/MdePkg/Library/BaseLib/X64/FxSave.S
new file mode 100644
index 0000000000..432d7b9c13
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/FxSave.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   FxSave.S
+#
+# Abstract:
+#
+#   AsmFxSave function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86FxSave (
+#   OUT IA32_FX_BUFFER *Buffer
+#   );
+#------------------------------------------------------------------------------
+.global _InternalX86FxSave;
+_InternalX86FxSave:
+    fxsave  (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/FxSave.asm b/MdePkg/Library/BaseLib/X64/FxSave.asm
new file mode 100644
index 0000000000..ea19cd1648
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/FxSave.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   FxSave.Asm
+;
+; Abstract:
+;
+;   AsmFxSave function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86FxSave (
+;   OUT IA32_FX_BUFFER *Buffer
+;   );
+;------------------------------------------------------------------------------
+InternalX86FxSave PROC
+    fxsave  [rcx]
+    ret
+InternalX86FxSave ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.S b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.S
new file mode 100644
index 0000000000..cd85279c73
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   InterlockedCompareExchange32.Asm
+#
+# Abstract:
+#
+#   InterlockedCompareExchange32 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# UINT32
+# EFIAPI
+# InterlockedCompareExchange32 (
+#   IN      UINT32                    *Value,
+#   IN      UINT32                    CompareValue,
+#   IN      UINT32                    ExchangeValue
+#   );
+#------------------------------------------------------------------------------
+.global _InternalSyncCompareExchange32;
+_InternalSyncCompareExchange32:
+    mov     %edx, %eax
+    lock    cmpxchg %r8d, (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.asm b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.asm
new file mode 100644
index 0000000000..55b055453f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   InterlockedCompareExchange32.Asm
+;
+; Abstract:
+;
+;   InterlockedCompareExchange32 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT32
+; EFIAPI
+; InterlockedCompareExchange32 (
+;   IN      UINT32                    *Value,
+;   IN      UINT32                    CompareValue,
+;   IN      UINT32                    ExchangeValue
+;   );
+;------------------------------------------------------------------------------
+InternalSyncCompareExchange32   PROC
+    mov     eax, edx
+    lock    cmpxchg [rcx], r8d
+    ret
+InternalSyncCompareExchange32   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.c b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.c
new file mode 100644
index 0000000000..4a9fe6aca6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange32.c
@@ -0,0 +1,36 @@
+/** @file
+  InterlockedCompareExchange32 function
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+long _InterlockedCompareExchange(
+   long volatile * Destination,
+   long Exchange,
+   long Comperand
+);
+
+#pragma intrinsic(_InterlockedCompareExchange)
+
+UINT32
+EFIAPI
+InternalSyncCompareExchange32 (
+  IN      UINT32                    *Value,
+  IN      UINT32                    CompareValue,
+  IN      UINT32                    ExchangeValue
+  )
+{
+  return _InterlockedCompareExchange (Value, ExchangeValue, CompareValue);
+}
+
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.S b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.S
new file mode 100644
index 0000000000..ae27964292
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.S
@@ -0,0 +1,39 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   InterlockedCompareExchange64.S
+#
+# Abstract:
+#
+#   InterlockedCompareExchange64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# InterlockedCompareExchange64 (
+#   IN      UINT64                    *Value,
+#   IN      UINT64                    CompareValue,
+#   IN      UINT64                    ExchangeValue
+#   );
+#------------------------------------------------------------------------------
+.global _InternalSyncCompareExchange64;
+.align 16;
+_InternalSyncCompareExchange64:
+    mov     %rsi, %rax
+    lock    cmpxchg %rdx,(%rdi)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.asm b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.asm
new file mode 100644
index 0000000000..88c25a56de
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   InterlockedCompareExchange64.Asm
+;
+; Abstract:
+;
+;   InterlockedCompareExchange64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; InterlockedCompareExchange64 (
+;   IN      UINT64                    *Value,
+;   IN      UINT64                    CompareValue,
+;   IN      UINT64                    ExchangeValue
+;   );
+;------------------------------------------------------------------------------
+InternalSyncCompareExchange64   PROC
+    mov     rax, rdx
+    lock    cmpxchg [rcx], r8
+    ret
+InternalSyncCompareExchange64   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.c b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.c
new file mode 100644
index 0000000000..bed1dc8972
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedCompareExchange64.c
@@ -0,0 +1,36 @@
+/** @file
+  InterlockedCompareExchange64 function
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+__int64 _InterlockedCompareExchange64(
+   __int64 volatile * Destination,
+   __int64 Exchange,
+   __int64 Comperand
+);
+
+#pragma intrinsic(_InterlockedCompareExchange64)
+
+UINT64
+EFIAPI
+InternalSyncCompareExchange64 (
+  IN      UINT64                    *Value,
+  IN      UINT64                    CompareValue,
+  IN      UINT64                    ExchangeValue
+  )
+{
+  return _InterlockedCompareExchange64 (Value, ExchangeValue, CompareValue);
+}
+
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedDecrement.S b/MdePkg/Library/BaseLib/X64/InterlockedDecrement.S
new file mode 100644
index 0000000000..59ca54bb9f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedDecrement.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   InterlockedDecrement.S
+#
+# Abstract:
+#
+#   InterlockedDecrement function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT32
+# EFIAPI
+# InterlockedDecrement (
+#   IN      UINT32                    *Value
+#   );
+#------------------------------------------------------------------------------
+.global _InternalSyncDecrement;
+_InternalSyncDecrement:
+    lock    decl (%rcx)
+    mov     (%rcx), %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedDecrement.asm b/MdePkg/Library/BaseLib/X64/InterlockedDecrement.asm
new file mode 100644
index 0000000000..f907fed4a8
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedDecrement.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   InterlockedDecrement.Asm
+;
+; Abstract:
+;
+;   InterlockedDecrement function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT32
+; EFIAPI
+; InterlockedDecrement (
+;   IN      UINT32                    *Value
+;   );
+;------------------------------------------------------------------------------
+InternalSyncDecrement   PROC
+    lock    dec     dword ptr [rcx]
+    mov     eax, [rcx]
+    ret
+InternalSyncDecrement   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedDecrement.c b/MdePkg/Library/BaseLib/X64/InterlockedDecrement.c
new file mode 100644
index 0000000000..19e6a5dc49
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedDecrement.c
@@ -0,0 +1,32 @@
+/** @file
+  InterlockedDecrement function
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+long _InterlockedDecrement(
+   long * lpAddend
+);
+
+#pragma intrinsic(_InterlockedDecrement)
+
+UINT32
+EFIAPI
+InternalSyncDecrement (
+  IN      UINT32                    *Value
+  )
+{
+  return _InterlockedDecrement (Value);
+}
+
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedIncrement.S b/MdePkg/Library/BaseLib/X64/InterlockedIncrement.S
new file mode 100644
index 0000000000..df4cb974b6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedIncrement.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   InterlockedIncrement.S
+#
+# Abstract:
+#
+#   InterlockedIncrement function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT32
+# EFIAPI
+# InterlockedIncrement (
+#   IN      UINT32                    *Value
+#   );
+#------------------------------------------------------------------------------
+.global _InternalSyncIncrement;
+_InternalSyncIncrement:
+    lock    incl  (%rcx)
+    mov     (%rcx), %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedIncrement.asm b/MdePkg/Library/BaseLib/X64/InterlockedIncrement.asm
new file mode 100644
index 0000000000..f5a4130bf1
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedIncrement.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   InterlockedIncrement.Asm
+;
+; Abstract:
+;
+;   InterlockedIncrement function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT32
+; EFIAPI
+; InterlockedIncrement (
+;   IN      UINT32                    *Value
+;   );
+;------------------------------------------------------------------------------
+InternalSyncIncrement   PROC
+    lock    inc     dword ptr [rcx]
+    mov     eax, [rcx]
+    ret
+InternalSyncIncrement   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/InterlockedIncrement.c b/MdePkg/Library/BaseLib/X64/InterlockedIncrement.c
new file mode 100644
index 0000000000..eda9f79a5b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/InterlockedIncrement.c
@@ -0,0 +1,32 @@
+/** @file
+  InterLockedIncrement function
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+long _InterlockedIncrement(
+   long * lpAddend
+);
+
+#pragma intrinsic(_InterlockedIncrement)
+
+UINT32
+EFIAPI
+InternalSyncIncrement (
+  IN      UINT32                    *Value
+  )
+{
+  return _InterlockedIncrement (Value);
+}
+
diff --git a/MdePkg/Library/BaseLib/X64/Invd.S b/MdePkg/Library/BaseLib/X64/Invd.S
new file mode 100644
index 0000000000..030ae454e6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Invd.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   Invd.S
+#
+# Abstract:
+#
+#   AsmInvd function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmInvd (
+#   VOID
+#   )#
+#------------------------------------------------------------------------------
+.global _AsmInvd;
+_AsmInvd:
+    invd
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/Invd.asm b/MdePkg/Library/BaseLib/X64/Invd.asm
new file mode 100644
index 0000000000..446587923b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Invd.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   Invd.Asm
+;
+; Abstract:
+;
+;   AsmInvd function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmInvd (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmInvd PROC
+    invd
+    ret
+AsmInvd ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/LongJump.S b/MdePkg/Library/BaseLib/X64/LongJump.S
new file mode 100644
index 0000000000..1a6f859c8e
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/LongJump.S
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   LongJump.Asm
+#
+# Abstract:
+#
+#   Implementation of _LongJump() on x64.
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalLongJump (
+#   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
+#   IN      UINTN                     Value
+#   );
+#------------------------------------------------------------------------------
+.global _InternalLongJump
+_InternalLongJump:
+    mov     (%rcx), %rbx
+    mov     0x8(%rcx), %rsp
+    mov     0x10(%rcx), %rbp
+    mov     0x18(%rcx), %rdi
+    mov     0x20(%rcx), %rsi
+    mov     0x28(%rcx), %r12
+    mov     0x30(%rcx), %r13
+    mov     0x38(%rcx), %r14
+    mov     0x40(%rcx), %r15
+    mov     %rdx, %rax
+    jmp     *0x48(%rcx)
diff --git a/MdePkg/Library/BaseLib/X64/LongJump.asm b/MdePkg/Library/BaseLib/X64/LongJump.asm
new file mode 100644
index 0000000000..38e5606081
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/LongJump.asm
@@ -0,0 +1,46 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   LongJump.Asm
+;
+; Abstract:
+;
+;   Implementation of _LongJump() on x64.
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalLongJump (
+;   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
+;   IN      UINTN                     Value
+;   );
+;------------------------------------------------------------------------------
+InternalLongJump    PROC
+    mov     rbx, [rcx]
+    mov     rsp, [rcx + 8]
+    mov     rbp, [rcx + 10h]
+    mov     rdi, [rcx + 18h]
+    mov     rsi, [rcx + 20h]
+    mov     r12, [rcx + 28h]
+    mov     r13, [rcx + 30h]
+    mov     r14, [rcx + 38h]
+    mov     r15, [rcx + 40h]
+    mov     rax, rdx                    ; set return value
+    jmp     qword ptr [rcx + 48h]
+InternalLongJump    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/Monitor.S b/MdePkg/Library/BaseLib/X64/Monitor.S
new file mode 100644
index 0000000000..13da27d8ad
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Monitor.S
@@ -0,0 +1,41 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   Monitor.S
+#
+# Abstract:
+#
+#   AsmMonitor function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmMonitor (
+#   IN      UINTN                     Eax,
+#   IN      UINTN                     Ecx,
+#   IN      UINTN                     Edx
+#   );
+#------------------------------------------------------------------------------
+.global _AsmMonitor;
+.align 16;
+_AsmMonitor:
+    mov    %ecx,%eax
+    mov    %edx,%ecx
+    mov    %r8d,%edx
+    monitor
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/Monitor.asm b/MdePkg/Library/BaseLib/X64/Monitor.asm
new file mode 100644
index 0000000000..ec9c3f8d03
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Monitor.asm
@@ -0,0 +1,43 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   Monitor.Asm
+;
+; Abstract:
+;
+;   AsmMonitor function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmMonitor (
+;   IN      UINTN                     Eax,
+;   IN      UINTN                     Ecx,
+;   IN      UINTN                     Edx
+;   );
+;------------------------------------------------------------------------------
+AsmMonitor  PROC
+    mov     eax, ecx
+    mov     ecx, edx
+    mov     edx, r8d
+    DB      0fh, 1, 0c8h                ; monitor
+    ret
+AsmMonitor  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/Mwait.S b/MdePkg/Library/BaseLib/X64/Mwait.S
new file mode 100644
index 0000000000..a32d004a18
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Mwait.S
@@ -0,0 +1,39 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   Mwait.S
+#
+# Abstract:
+#
+#   AsmMwait function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmMwait (
+#   IN      UINTN                     Eax,
+#   IN      UINTN                     Ecx
+#   );
+#------------------------------------------------------------------------------
+.global _AsmMwait;
+.align 16;
+_AsmMwait:
+    mov    %ecx,%eax
+    mov    %edx,%ecx
+    mwait  %rax,%rcx
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/Mwait.asm b/MdePkg/Library/BaseLib/X64/Mwait.asm
new file mode 100644
index 0000000000..aae1d42758
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Mwait.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   Mwait.Asm
+;
+; Abstract:
+;
+;   AsmMwait function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmMwait (
+;   IN      UINTN                     Eax,
+;   IN      UINTN                     Ecx
+;   );
+;------------------------------------------------------------------------------
+AsmMwait    PROC
+    mov     eax, ecx
+    mov     ecx, edx
+    DB      0fh, 1, 0c9h                ; mwait
+    ret
+AsmMwait    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/Non-existing.c b/MdePkg/Library/BaseLib/X64/Non-existing.c
new file mode 100644
index 0000000000..4f0c932380
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Non-existing.c
@@ -0,0 +1,110 @@
+/** @file
+  Non-existing BaseLib functions on x64
+
+  Copyright (c) 2006, Intel Corporation
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  Non-existing.c
+
+**/
+
+#include "../BaseLibInternals.h"
+
+/**
+  Enables the 32-bit paging mode on the CPU.
+
+  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
+  must be properly initialized prior to calling this service. This function
+  assumes the current execution mode is 32-bit protected mode. This function is
+  only available on IA-32. After the 32-bit paging mode is enabled, control is
+  transferred to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  There are a number of constraints that must be followed before calling this
+  function:
+  1)  Interrupts must be disabled.
+  2)  The caller must be in 32-bit protected mode with flat descriptors. This
+      means all descriptors must have a base of 0 and a limit of 4GB.
+  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat
+      descriptors.
+  4)  CR3 must point to valid page tables that will be used once the transition
+      is complete, and those page tables must guarantee that the pages for this
+      function and the stack are identity mapped.
+
+  @param  EntryPoint  A pointer to function to call with the new stack after
+                      paging is enabled.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function as the first parameter after paging is enabled.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function as the second parameter after paging is enabled.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function after paging is enabled.
+
+**/
+VOID
+EFIAPI
+InternalX86EnablePaging32 (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  )
+{
+  //
+  // This function cannot work on X64 platform
+  //
+  ASSERT (FALSE);
+}
+
+/**
+  Disables the 32-bit paging mode on the CPU.
+
+  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
+  mode. This function assumes the current execution mode is 32-paged protected
+  mode. This function is only available on IA-32. After the 32-bit paging mode
+  is disabled, control is transferred to the function specified by EntryPoint
+  using the new stack specified by NewStack and passing in the parameters
+  specified by Context1 and Context2. Context1 and Context2 are optional and
+  may be NULL. The function EntryPoint must never return.
+
+  There are a number of constraints that must be followed before calling this
+  function:
+  1)  Interrupts must be disabled.
+  2)  The caller must be in 32-bit paged mode.
+  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
+  4)  CR3 must point to valid page tables that guarantee that the pages for
+      this function and the stack are identity mapped.
+
+  @param  EntryPoint  A pointer to function to call with the new stack after
+                      paging is disabled.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function as the first parameter after paging is disabled.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function as the second parameter after paging is
+                      disabled.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function after paging is disabled.
+
+**/
+VOID
+EFIAPI
+InternalX86DisablePaging32 (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  )
+{
+  //
+  // This function cannot work on X64 platform
+  //
+  ASSERT (FALSE);
+}
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr0.S b/MdePkg/Library/BaseLib/X64/ReadCr0.S
new file mode 100644
index 0000000000..fa916d09fb
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr0.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadCr0.S
+#
+# Abstract:
+#
+#   AsmReadCr0 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadCr0 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadCr0;
+.align 16;
+_AsmReadCr0:
+    mov     %cr0, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr0.asm b/MdePkg/Library/BaseLib/X64/ReadCr0.asm
new file mode 100644
index 0000000000..3e369c3a81
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr0.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadCr0.Asm
+;
+; Abstract:
+;
+;   AsmReadCr0 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadCr0 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadCr0  PROC
+    mov     rax, cr0
+    ret
+AsmReadCr0  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr2.S b/MdePkg/Library/BaseLib/X64/ReadCr2.S
new file mode 100644
index 0000000000..96361bef72
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr2.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadCr2.S
+#
+# Abstract:
+#
+#   AsmReadCr2 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadCr2 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadCr2;
+.align 16;
+_AsmReadCr2:
+    mov     %cr2, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr2.asm b/MdePkg/Library/BaseLib/X64/ReadCr2.asm
new file mode 100644
index 0000000000..8476f5af18
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr2.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadCr2.Asm
+;
+; Abstract:
+;
+;   AsmReadCr2 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadCr2 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadCr2  PROC
+    mov     rax, cr2
+    ret
+AsmReadCr2  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr3.S b/MdePkg/Library/BaseLib/X64/ReadCr3.S
new file mode 100644
index 0000000000..480486f093
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr3.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadCr3.S
+#
+# Abstract:
+#
+#   AsmReadCr3 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadCr3 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadCr3;
+.align 16;
+_AsmReadCr3:
+    mov     %cr3, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr3.asm b/MdePkg/Library/BaseLib/X64/ReadCr3.asm
new file mode 100644
index 0000000000..af54d46373
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr3.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadCr3.Asm
+;
+; Abstract:
+;
+;   AsmReadCr3 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadCr3 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadCr3  PROC
+    mov     rax, cr3
+    ret
+AsmReadCr3  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr4.S b/MdePkg/Library/BaseLib/X64/ReadCr4.S
new file mode 100644
index 0000000000..e89b5cdab6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr4.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadCr4.S
+#
+# Abstract:
+#
+#   AsmReadCr4 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadCr4 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadCr4;
+.align 16;
+_AsmReadCr4:
+    mov     %cr4, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadCr4.asm b/MdePkg/Library/BaseLib/X64/ReadCr4.asm
new file mode 100644
index 0000000000..c8a881db9e
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCr4.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadCr4.Asm
+;
+; Abstract:
+;
+;   AsmReadCr4 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadCr4 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadCr4  PROC
+    mov     rax, cr4
+    ret
+AsmReadCr4  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadCs.S b/MdePkg/Library/BaseLib/X64/ReadCs.S
new file mode 100644
index 0000000000..677747b813
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCs.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadCs.S
+#
+# Abstract:
+#
+#   AsmReadCs function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadCs (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadCs;
+.align 16;
+_AsmReadCs:
+    mov     %cs, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadCs.asm b/MdePkg/Library/BaseLib/X64/ReadCs.asm
new file mode 100644
index 0000000000..642ce5b169
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadCs.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadCs.Asm
+;
+; Abstract:
+;
+;   AsmReadCs function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadCs (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadCs   PROC
+    mov     eax, cs
+    ret
+AsmReadCs   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr0.S b/MdePkg/Library/BaseLib/X64/ReadDr0.S
new file mode 100644
index 0000000000..1b441c344d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr0.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr0.S
+#
+# Abstract:
+#
+#   AsmReadDr0 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr0 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr0;
+.align 16;
+_AsmReadDr0:
+    mov     %dr0, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr0.asm b/MdePkg/Library/BaseLib/X64/ReadDr0.asm
new file mode 100644
index 0000000000..7e0d6b714a
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr0.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr0.Asm
+;
+; Abstract:
+;
+;   AsmReadDr0 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr0 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr0  PROC
+    mov     rax, dr0
+    ret
+AsmReadDr0  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr1.S b/MdePkg/Library/BaseLib/X64/ReadDr1.S
new file mode 100644
index 0000000000..5151a80d9c
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr1.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr1.S
+#
+# Abstract:
+#
+#   AsmReadDr1 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr1 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr1;
+.align 16;
+_AsmReadDr1:
+    mov     %dr1, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr1.asm b/MdePkg/Library/BaseLib/X64/ReadDr1.asm
new file mode 100644
index 0000000000..22f11c4e0f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr1.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr1.Asm
+;
+; Abstract:
+;
+;   AsmReadDr1 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr1 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr1  PROC
+    mov     rax, dr1
+    ret
+AsmReadDr1  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr2.S b/MdePkg/Library/BaseLib/X64/ReadDr2.S
new file mode 100644
index 0000000000..f4516afd4d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr2.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr2.S
+#
+# Abstract:
+#
+#   AsmReadDr2 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr2 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr2;
+.align 16;
+_AsmReadDr2:
+    mov     %dr2, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr2.asm b/MdePkg/Library/BaseLib/X64/ReadDr2.asm
new file mode 100644
index 0000000000..3b81605861
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr2.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr2.Asm
+;
+; Abstract:
+;
+;   AsmReadDr2 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr2 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr2  PROC
+    mov     rax, dr2
+    ret
+AsmReadDr2  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr3.S b/MdePkg/Library/BaseLib/X64/ReadDr3.S
new file mode 100644
index 0000000000..c5c679c96e
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr3.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr3.S
+#
+# Abstract:
+#
+#   AsmReadDr3 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr3 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr3;
+.align 16;
+_AsmReadDr3:
+    mov     %dr3, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr3.asm b/MdePkg/Library/BaseLib/X64/ReadDr3.asm
new file mode 100644
index 0000000000..1968fd0d67
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr3.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr3.Asm
+;
+; Abstract:
+;
+;   AsmReadDr3 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr3 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr3  PROC
+    mov     rax, dr3
+    ret
+AsmReadDr3  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr4.S b/MdePkg/Library/BaseLib/X64/ReadDr4.S
new file mode 100644
index 0000000000..f98c9ed35d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr4.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr4.S
+#
+# Abstract:
+#
+#   AsmReadDr4 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr4 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr4;
+.align 16;
+_AsmReadDr4:
+    #DB      0fh, 21h, 0e0h
+    mov     %dr4, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr4.asm b/MdePkg/Library/BaseLib/X64/ReadDr4.asm
new file mode 100644
index 0000000000..2bed12928b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr4.asm
@@ -0,0 +1,42 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr4.Asm
+;
+; Abstract:
+;
+;   AsmReadDr4 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr4 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr4  PROC
+    ;
+    ; There's no obvious reason to access this register, since it's aliased to
+    ; DR7 when DE=0 or an exception generated when DE=1
+    ;
+    DB      0fh, 21h, 0e0h
+    ret
+AsmReadDr4  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr5.S b/MdePkg/Library/BaseLib/X64/ReadDr5.S
new file mode 100644
index 0000000000..421f57a418
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr5.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr5.S
+#
+# Abstract:
+#
+#   AsmReadDr5 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr5 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr5;
+.align 16;
+_AsmReadDr5:
+    mov	%dr5, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr5.asm b/MdePkg/Library/BaseLib/X64/ReadDr5.asm
new file mode 100644
index 0000000000..3bee3a56ec
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr5.asm
@@ -0,0 +1,42 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr5.Asm
+;
+; Abstract:
+;
+;   AsmReadDr5 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr5 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr5  PROC
+    ;
+    ; There's no obvious reason to access this register, since it's aliased to
+    ; DR7 when DE=0 or an exception generated when DE=1
+    ;
+    DB      0fh, 21h, 0e8h
+    ret
+AsmReadDr5  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr6.S b/MdePkg/Library/BaseLib/X64/ReadDr6.S
new file mode 100644
index 0000000000..6a159d8762
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr6.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr6.S
+#
+# Abstract:
+#
+#   AsmReadDr6 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr6 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr6;
+.align 16;
+_AsmReadDr6:
+    mov	%dr6, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr6.asm b/MdePkg/Library/BaseLib/X64/ReadDr6.asm
new file mode 100644
index 0000000000..a3dafb9b9f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr6.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr6.Asm
+;
+; Abstract:
+;
+;   AsmReadDr6 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr6 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr6  PROC
+    mov     rax, dr6
+    ret
+AsmReadDr6  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr7.S b/MdePkg/Library/BaseLib/X64/ReadDr7.S
new file mode 100644
index 0000000000..9ffb09d13a
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr7.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDr7.S
+#
+# Abstract:
+#
+#   AsmReadDr7 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadDr7 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDr7;
+.align 16;
+_AsmReadDr7:
+    mov	%dr7, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDr7.asm b/MdePkg/Library/BaseLib/X64/ReadDr7.asm
new file mode 100644
index 0000000000..0cff14b5c4
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDr7.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDr7.Asm
+;
+; Abstract:
+;
+;   AsmReadDr7 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadDr7 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDr7  PROC
+    mov     rax, dr7
+    ret
+AsmReadDr7  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadDs.S b/MdePkg/Library/BaseLib/X64/ReadDs.S
new file mode 100644
index 0000000000..58bee11beb
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDs.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadDs.S
+#
+# Abstract:
+#
+#   AsmReadDs function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadDs (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadDs;
+.align 16;
+_AsmReadDs:
+    movl	%ds, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadDs.asm b/MdePkg/Library/BaseLib/X64/ReadDs.asm
new file mode 100644
index 0000000000..6f2629872b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadDs.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadDs.Asm
+;
+; Abstract:
+;
+;   AsmReadDs function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadDs (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadDs   PROC
+    mov     eax, ds
+    ret
+AsmReadDs   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadEflags.S b/MdePkg/Library/BaseLib/X64/ReadEflags.S
new file mode 100644
index 0000000000..e895387673
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadEflags.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadEflags.S
+#
+# Abstract:
+#
+#   AsmReadEflags function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmReadEflags (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadEflags;
+.align 16;
+_AsmReadEflags:
+    pushfq
+    pop     %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadEflags.asm b/MdePkg/Library/BaseLib/X64/ReadEflags.asm
new file mode 100644
index 0000000000..174ae95887
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadEflags.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadEflags.Asm
+;
+; Abstract:
+;
+;   AsmReadEflags function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmReadEflags (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadEflags   PROC
+    pushfq
+    pop     rax
+    ret
+AsmReadEflags   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadEs.S b/MdePkg/Library/BaseLib/X64/ReadEs.S
new file mode 100644
index 0000000000..93df650371
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadEs.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadEs.S
+#
+# Abstract:
+#
+#   AsmReadEs function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadEs (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadEs;
+.align 16;
+_AsmReadEs:
+    mov     %es, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadEs.asm b/MdePkg/Library/BaseLib/X64/ReadEs.asm
new file mode 100644
index 0000000000..d5fe84d73f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadEs.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadEs.Asm
+;
+; Abstract:
+;
+;   AsmReadEs function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadEs (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadEs   PROC
+    mov     eax, es
+    ret
+AsmReadEs   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadFs.S b/MdePkg/Library/BaseLib/X64/ReadFs.S
new file mode 100644
index 0000000000..ff658e1248
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadFs.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadFs.S
+#
+# Abstract:
+#
+#   AsmReadFs function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadFs (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadFs;
+.align 16;
+_AsmReadFs:
+    mov     %fs, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadFs.asm b/MdePkg/Library/BaseLib/X64/ReadFs.asm
new file mode 100644
index 0000000000..d44ee545af
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadFs.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadFs.Asm
+;
+; Abstract:
+;
+;   AsmReadFs function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadFs (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadFs   PROC
+    mov     eax, fs
+    ret
+AsmReadFs   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadGdtr.S b/MdePkg/Library/BaseLib/X64/ReadGdtr.S
new file mode 100644
index 0000000000..c271a02d78
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadGdtr.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadGdtr.S
+#
+# Abstract:
+#
+#   AsmReadGdtr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86ReadGdtr (
+#   OUT IA32_DESCRIPTOR  *Gdtr
+#   );
+#------------------------------------------------------------------------------
+.global _InternalX86ReadGdtr;
+.align 16;
+_InternalX86ReadGdtr:
+    sgdt  (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadGdtr.asm b/MdePkg/Library/BaseLib/X64/ReadGdtr.asm
new file mode 100644
index 0000000000..0bc2949b54
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadGdtr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadGdtr.Asm
+;
+; Abstract:
+;
+;   AsmReadGdtr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86ReadGdtr (
+;   OUT IA32_DESCRIPTOR  *Gdtr
+;   );
+;------------------------------------------------------------------------------
+InternalX86ReadGdtr   PROC
+    sgdt    fword ptr [rcx]
+    ret
+InternalX86ReadGdtr   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadGs.S b/MdePkg/Library/BaseLib/X64/ReadGs.S
new file mode 100644
index 0000000000..f92776c35d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadGs.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadGs.S
+#
+# Abstract:
+#
+#   AsmReadGs function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadGs (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadGs;
+.align 16;
+_AsmReadGs:
+    mov     %gs, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadGs.asm b/MdePkg/Library/BaseLib/X64/ReadGs.asm
new file mode 100644
index 0000000000..bc5de7691b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadGs.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadGs.Asm
+;
+; Abstract:
+;
+;   AsmReadGs function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadGs (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadGs   PROC
+    mov     eax, gs
+    ret
+AsmReadGs   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadIdtr.S b/MdePkg/Library/BaseLib/X64/ReadIdtr.S
new file mode 100644
index 0000000000..cd7c09e6b7
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadIdtr.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadIdtr.AS
+#
+# Abstract:
+#
+#   AsmReadIdtr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86ReadIdtr (
+#   OUT     IA32_DESCRIPTOR           *Idtr
+#   );
+#------------------------------------------------------------------------------
+.global _InternalX86ReadIdtr;
+.align 16;
+_InternalX86ReadIdtr:
+    sidt    (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadIdtr.asm b/MdePkg/Library/BaseLib/X64/ReadIdtr.asm
new file mode 100644
index 0000000000..db684f3671
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadIdtr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadIdtr.Asm
+;
+; Abstract:
+;
+;   AsmReadIdtr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86ReadIdtr (
+;   OUT     IA32_DESCRIPTOR           *Idtr
+;   );
+;------------------------------------------------------------------------------
+InternalX86ReadIdtr   PROC
+    sidt    fword ptr [rcx]
+    ret
+InternalX86ReadIdtr   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadLdtr.S b/MdePkg/Library/BaseLib/X64/ReadLdtr.S
new file mode 100644
index 0000000000..fac8e25d74
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadLdtr.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadLdtr.AS
+#
+# Abstract:
+#
+#   AsmReadLdtr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadLdtr (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadLdtr;
+.align 16;
+_AsmReadLdtr:
+    sldt    %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadLdtr.asm b/MdePkg/Library/BaseLib/X64/ReadLdtr.asm
new file mode 100644
index 0000000000..3d6a2f8843
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadLdtr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadLdtr.Asm
+;
+; Abstract:
+;
+;   AsmReadLdtr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadLdtr (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadLdtr PROC
+    sldt    eax
+    ret
+AsmReadLdtr ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm0.S b/MdePkg/Library/BaseLib/X64/ReadMm0.S
new file mode 100644
index 0000000000..b5912ca0b4
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm0.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm0.S
+#
+# Abstract:
+#
+#   AsmReadMm0 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm0 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm0;
+.align 16;
+_AsmReadMm0:
+    #DB      48h, 0fh, 7eh, 0c0h
+    movd 	%mm0, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm0.asm b/MdePkg/Library/BaseLib/X64/ReadMm0.asm
new file mode 100644
index 0000000000..0ed5c8f8ae
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm0.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm0.Asm
+;
+; Abstract:
+;
+;   AsmReadMm0 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm0 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm0  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0c0h
+    ret
+AsmReadMm0  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm1.S b/MdePkg/Library/BaseLib/X64/ReadMm1.S
new file mode 100644
index 0000000000..1f26cd4483
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm1.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm1.S
+#
+# Abstract:
+#
+#   AsmReadMm1 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm1 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm1;
+.align 16;
+_AsmReadMm1:
+    #DB      48h, 0fh, 7eh, 0c8h
+    movd	%mm1, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm1.asm b/MdePkg/Library/BaseLib/X64/ReadMm1.asm
new file mode 100644
index 0000000000..e24fcb5f9d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm1.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm1.Asm
+;
+; Abstract:
+;
+;   AsmReadMm1 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm1 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm1  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0c8h
+    ret
+AsmReadMm1  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm2.S b/MdePkg/Library/BaseLib/X64/ReadMm2.S
new file mode 100644
index 0000000000..ef864af090
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm2.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm2.S
+#
+# Abstract:
+#
+#   AsmReadMm2 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm2 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm2;
+.align 16;
+_AsmReadMm2:
+    #DB      48h, 0fh, 7eh, 0d0h
+    movd	%mm2, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm2.asm b/MdePkg/Library/BaseLib/X64/ReadMm2.asm
new file mode 100644
index 0000000000..860326b375
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm2.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm2.Asm
+;
+; Abstract:
+;
+;   AsmReadMm2 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm2 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm2  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0d0h
+    ret
+AsmReadMm2  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm3.S b/MdePkg/Library/BaseLib/X64/ReadMm3.S
new file mode 100644
index 0000000000..bd76cb20a2
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm3.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm3.S
+#
+# Abstract:
+#
+#   AsmReadMm3 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm3 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm3;
+.align 16;
+_AsmReadMm3:
+    #DB      48h, 0fh, 7eh, 0d8h
+    movd	%mm3, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm3.asm b/MdePkg/Library/BaseLib/X64/ReadMm3.asm
new file mode 100644
index 0000000000..aca6f3d2df
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm3.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm3.Asm
+;
+; Abstract:
+;
+;   AsmReadMm3 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm3 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm3  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0d8h
+    ret
+AsmReadMm3  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm4.S b/MdePkg/Library/BaseLib/X64/ReadMm4.S
new file mode 100644
index 0000000000..99d766887c
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm4.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm4.AS
+#
+# Abstract:
+#
+#   AsmReadMm4 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm4 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm4;
+.align 16;
+_AsmReadMm4:
+    #DB      48h, 0fh, 7eh, 0e0h
+    movd	%mm4, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm4.asm b/MdePkg/Library/BaseLib/X64/ReadMm4.asm
new file mode 100644
index 0000000000..dd52f99436
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm4.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm4.Asm
+;
+; Abstract:
+;
+;   AsmReadMm4 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm4 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm4  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0e0h
+    ret
+AsmReadMm4  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm5.S b/MdePkg/Library/BaseLib/X64/ReadMm5.S
new file mode 100644
index 0000000000..7a01c53ca5
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm5.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm5.S
+#
+# Abstract:
+#
+#   AsmReadMm5 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm5 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm5;
+.align 16;
+_AsmReadMm5:
+    #DB      48h, 0fh, 7eh, 0e8h
+    movd	%mm5, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm5.asm b/MdePkg/Library/BaseLib/X64/ReadMm5.asm
new file mode 100644
index 0000000000..1f30e4bed4
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm5.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm5.Asm
+;
+; Abstract:
+;
+;   AsmReadMm5 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm5 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm5  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0e8h
+    ret
+AsmReadMm5  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm6.S b/MdePkg/Library/BaseLib/X64/ReadMm6.S
new file mode 100644
index 0000000000..0c7ea79858
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm6.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm6.S
+#
+# Abstract:
+#
+#   AsmReadMm6 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm6 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm6;
+.align 16;
+_AsmReadMm6:
+    #DB      48h, 0fh, 7eh, 0f0h
+    movd	%mm6, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm6.asm b/MdePkg/Library/BaseLib/X64/ReadMm6.asm
new file mode 100644
index 0000000000..4e1f2a824b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm6.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm6.Asm
+;
+; Abstract:
+;
+;   AsmReadMm6 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm6 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm6  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0f0h
+    ret
+AsmReadMm6  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm7.S b/MdePkg/Library/BaseLib/X64/ReadMm7.S
new file mode 100644
index 0000000000..68f1dbdd30
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm7.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMm7.S
+#
+# Abstract:
+#
+#   AsmReadMm7 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMm7 (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMm7;
+.align 16;
+_AsmReadMm7:
+    #DB      48h, 0fh, 7eh, 0f8h
+    movd	%mm7, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMm7.asm b/MdePkg/Library/BaseLib/X64/ReadMm7.asm
new file mode 100644
index 0000000000..d871a9f8dc
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMm7.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMm7.Asm
+;
+; Abstract:
+;
+;   AsmReadMm7 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMm7 (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadMm7  PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 7eh, 0f8h
+    ret
+AsmReadMm7  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMsr64.S b/MdePkg/Library/BaseLib/X64/ReadMsr64.S
new file mode 100644
index 0000000000..ac101cd670
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMsr64.S
@@ -0,0 +1,38 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadMsr64.S
+#
+# Abstract:
+#
+#   AsmReadMsr64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadMsr64 (
+#   IN UINT32  Index
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadMsr64;
+.align 16;
+_AsmReadMsr64:
+    rdmsr                               # edx & eax are zero extended
+    shl     $0x20, %rdx
+    or      %rdx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadMsr64.asm b/MdePkg/Library/BaseLib/X64/ReadMsr64.asm
new file mode 100644
index 0000000000..580c0761a4
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMsr64.asm
@@ -0,0 +1,40 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadMsr64.Asm
+;
+; Abstract:
+;
+;   AsmReadMsr64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadMsr64 (
+;   IN UINT32  Index
+;   );
+;------------------------------------------------------------------------------
+AsmReadMsr64    PROC
+    rdmsr                               ; edx & eax are zero extended
+    shl     rdx, 20h
+    or      rax, rdx
+    ret
+AsmReadMsr64    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadMsr64.c b/MdePkg/Library/BaseLib/X64/ReadMsr64.c
new file mode 100644
index 0000000000..15a573fc09
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadMsr64.c
@@ -0,0 +1,31 @@
+/** @file
+  CpuBreakpoint function.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+unsigned __int64 __readmsr (int register);
+
+#pragma intrinsic(__readmsr)
+
+
+UINT64
+EFIAPI
+AsmReadMsr64 (
+  IN UINT32  Index
+  )
+{
+  return __readmsr (Index);
+}
+
diff --git a/MdePkg/Library/BaseLib/X64/ReadPmc.S b/MdePkg/Library/BaseLib/X64/ReadPmc.S
new file mode 100644
index 0000000000..115f6335c7
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadPmc.S
@@ -0,0 +1,38 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadPmc.S
+#
+# Abstract:
+#
+#   AsmReadPmc function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadPmc (
+#   IN UINT32   PmcIndex
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadPmc;
+.align 16;
+_AsmReadPmc:
+    rdpmc
+    shl     $0x20, %rdx
+    or      %rdx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadPmc.asm b/MdePkg/Library/BaseLib/X64/ReadPmc.asm
new file mode 100644
index 0000000000..5ca60fa85f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadPmc.asm
@@ -0,0 +1,40 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadPmc.Asm
+;
+; Abstract:
+;
+;   AsmReadPmc function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadPmc (
+;   IN UINT32   PmcIndex
+;   );
+;------------------------------------------------------------------------------
+AsmReadPmc  PROC
+    rdpmc
+    shl     rdx, 20h
+    or      rax, rdx
+    ret
+AsmReadPmc  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadSs.S b/MdePkg/Library/BaseLib/X64/ReadSs.S
new file mode 100644
index 0000000000..a93a7032cf
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadSs.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadSs.S
+#
+# Abstract:
+#
+#   AsmReadSs function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadSs (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadSs;
+.align 16;
+_AsmReadSs:
+    movl     %ss, %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadSs.asm b/MdePkg/Library/BaseLib/X64/ReadSs.asm
new file mode 100644
index 0000000000..2c2be564ac
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadSs.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadSs.Asm
+;
+; Abstract:
+;
+;   AsmReadSs function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadSs (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadSs   PROC
+    mov     eax, ss
+    ret
+AsmReadSs   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadTr.S b/MdePkg/Library/BaseLib/X64/ReadTr.S
new file mode 100644
index 0000000000..5e3146bf27
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadTr.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadTr.S
+#
+# Abstract:
+#
+#   AsmReadTr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT16
+# EFIAPI
+# AsmReadTr (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadTr;
+.align 16;
+_AsmReadTr: 
+    str     %eax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadTr.asm b/MdePkg/Library/BaseLib/X64/ReadTr.asm
new file mode 100644
index 0000000000..7cf8cdfd43
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadTr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadTr.Asm
+;
+; Abstract:
+;
+;   AsmReadTr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT16
+; EFIAPI
+; AsmReadTr (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadTr   PROC
+    str     eax
+    ret
+AsmReadTr   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/ReadTsc.S b/MdePkg/Library/BaseLib/X64/ReadTsc.S
new file mode 100644
index 0000000000..776ffc2265
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadTsc.S
@@ -0,0 +1,38 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ReadTsc.S
+#
+# Abstract:
+#
+#   AsmReadTsc function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmReadTsc (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmReadTsc;
+.align 16;
+_AsmReadTsc:
+    rdtsc
+    shl     $0x20, %rdx
+    or      %rdx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/ReadTsc.asm b/MdePkg/Library/BaseLib/X64/ReadTsc.asm
new file mode 100644
index 0000000000..7c45eebd54
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/ReadTsc.asm
@@ -0,0 +1,40 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ReadTsc.Asm
+;
+; Abstract:
+;
+;   AsmReadTsc function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmReadTsc (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmReadTsc  PROC
+    rdtsc
+    shl     rdx, 20h
+    or      rax, rdx
+    ret
+AsmReadTsc  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/SetJump.S b/MdePkg/Library/BaseLib/X64/SetJump.S
new file mode 100644
index 0000000000..eaaa43bf98
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/SetJump.S
@@ -0,0 +1,42 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetJump.S
+#
+# Abstract:
+#
+#   Implementation of SetJump() on x86_64
+#
+#------------------------------------------------------------------------------
+
+.extern InternalAssertJumpBuffer;
+.global _SetJump;
+_SetJump:
+    push   %rcx
+    add    $0xffffffffffffffe0,%rsp
+    call   _InternalAssertJumpBuffer
+    add    $0x20,%rsp
+    pop    %rcx
+    pop    %rdx
+    mov    %rbx,(%rcx)
+    mov    %rsp,0x8(%rcx)
+    mov    %rbp,0x10(%rcx)
+    mov    %rdi,0x18(%rcx)
+    mov    %rsi,0x20(%rcx)
+    mov    %r12,0x28(%rcx)
+    mov    %r13,0x30(%rcx)
+    mov    %r14,0x38(%rcx)
+    mov    %r15,0x40(%rcx)
+    mov    %rdx,0x48(%rcx)
+    xor    %rax,%rax
+    jmpq   *%rdx
diff --git a/MdePkg/Library/BaseLib/X64/SetJump.asm b/MdePkg/Library/BaseLib/X64/SetJump.asm
new file mode 100644
index 0000000000..2ed581ea9d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/SetJump.asm
@@ -0,0 +1,54 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetJump.Asm
+;
+; Abstract:
+;
+;   Implementation of SetJump() on x64.
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+EXTERNDEF   InternalAssertJumpBuffer:PROC
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; SetJump (
+;   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
+;   );
+;------------------------------------------------------------------------------
+SetJump     PROC
+    push    rcx
+    add     rsp, -20h
+    call    InternalAssertJumpBuffer
+    add     rsp, 20h
+    pop     rcx
+    pop     rdx
+    mov     [rcx], rbx
+    mov     [rcx + 8], rsp
+    mov     [rcx + 10h], rbp
+    mov     [rcx + 18h], rdi
+    mov     [rcx + 20h], rsi
+    mov     [rcx + 28h], r12
+    mov     [rcx + 30h], r13
+    mov     [rcx + 38h], r14
+    mov     [rcx + 40h], r15
+    mov     [rcx + 48h], rdx
+    xor     rax, rax
+    jmp     rdx
+SetJump     ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/SwitchStack.S b/MdePkg/Library/BaseLib/X64/SwitchStack.S
new file mode 100644
index 0000000000..85cdb4306d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/SwitchStack.S
@@ -0,0 +1,44 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SwitchStack.S
+#
+# Abstract:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# Routine Description:
+#
+#   Routine for switching stacks with 1 parameter
+#
+# Arguments:
+#
+#   (rdi) EntryPoint    - Entry point with new stack.
+#   (rsi) Context1      - Parameter1 for entry point.
+#   (rdx)  Context2     - Parameter2 for entry point.
+#   (rcx)  NewStack     - Pointer to new stack.
+#
+# Returns:
+#
+#   None
+#
+#------------------------------------------------------------------------------
+.global _InternalSwitchStack;
+_InternalSwitchStack:
+    mov     %rcx, %rax
+    mov     %rdx, %rcx
+    mov     %r8, %rdx
+    lea     -0x20(%r9), %rsp
+    call    *%rax
diff --git a/MdePkg/Library/BaseLib/X64/SwitchStack.asm b/MdePkg/Library/BaseLib/X64/SwitchStack.asm
new file mode 100644
index 0000000000..53d1417f0b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/SwitchStack.asm
@@ -0,0 +1,47 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SwitchStack.Asm
+;
+; Abstract:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; Routine Description:
+;
+;   Routine for switching stacks with 1 parameter
+;
+; Arguments:
+;
+;   (rcx) EntryPoint    - Entry point with new stack.
+;   (rdx) Context       - Parameter for entry point.
+;   (r8)  Context2      - Parameter2 for entry point.
+;   (r9)  NewStack      - Pointer to new stack.
+;
+; Returns:
+;
+;   None
+;
+;------------------------------------------------------------------------------
+InternalSwitchStack PROC
+    mov     rax, rcx
+    mov     rcx, rdx
+    mov     rdx, r8
+    lea     rsp, [r9 - 20h]
+    call    rax
+InternalSwitchStack ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/Thunk16.S b/MdePkg/Library/BaseLib/X64/Thunk16.S
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/MdePkg/Library/BaseLib/X64/Thunk16.asm b/MdePkg/Library/BaseLib/X64/Thunk16.asm
new file mode 100644
index 0000000000..ef4d9fc997
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Thunk16.asm
@@ -0,0 +1,289 @@
+//
+// Include common header file for this module.
+//
+#include <BaseLibInternals.h>
+
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   Thunk.asm
+;
+; Abstract:
+;
+;   Real mode thunk
+;
+;------------------------------------------------------------------------------
+
+EXTERNDEF   m16Start:BYTE
+EXTERNDEF   m16Size:WORD
+EXTERNDEF   mThunk16Attr:WORD
+EXTERNDEF   m16Gdt:WORD
+EXTERNDEF   m16GdtrBase:WORD
+EXTERNDEF   mTransition:WORD
+
+IA32_REGS   STRUC   4t
+_EDI        DD      ?
+_ESI        DD      ?
+_EBP        DD      ?
+_ESP        DD      ?
+_EBX        DD      ?
+_EDX        DD      ?
+_ECX        DD      ?
+_EAX        DD      ?
+_DS         DW      ?
+_ES         DW      ?
+_FS         DW      ?
+_GS         DW      ?
+_EFLAGS     DQ      ?
+_EIP        DD      ?
+_CS         DW      ?
+_SS         DW      ?
+IA32_REGS   ENDS
+
+    .const
+
+m16Size         DW      InternalAsmThunk16 - m16Start
+mThunk16Attr    DW      _ThunkAttr - m16Start
+m16Gdt          DW      _NullSeg - m16Start
+m16GdtrBase     DW      _16GdtrBase - m16Start
+mTransition     DW      _EntryPoint - m16Start
+
+    .code
+
+m16Start    LABEL   BYTE
+
+SavedGdt    LABEL   FWORD
+            DW      ?
+            DQ      ?
+
+;------------------------------------------------------------------------------
+; _BackFromUserCode() takes control in real mode after 'retf' has been executed
+; by user code. It will be shadowed to somewhere in memory below 1MB.
+;------------------------------------------------------------------------------
+_BackFromUserCode   PROC
+    ;
+    ; The order of saved registers on the stack matches the order they appears
+    ; in IA32_REGS structure. This facilitates wrapper function to extract them
+    ; into that structure.
+    ;
+    ; Some instructions for manipulation of segment registers have to be written
+    ; in opcode since 64-bit MASM prevents accesses to those registers.
+    ;
+    DB      16h                         ; push ss
+    DB      0eh                         ; push cs
+    DB      66h
+    call    @Base                       ; push eip
+@Base:
+    DB      66h
+    push    0                           ; reserved high order 32 bits of EFlags
+    pushf                               ; pushfd actually
+    cli                                 ; disable interrupts
+    push    gs
+    push    fs
+    DB      6                           ; push es
+    DB      1eh                         ; push ds
+    DB      66h, 60h                    ; pushad
+    DB      66h, 0bah                   ; mov edx, imm32
+_ThunkAttr  DD      ?
+    test    dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15
+    jz      @1
+    mov     eax, 15cd2401h              ; mov ax, 2401h & int 15h
+    cli                                 ; disable interrupts
+    jnc     @2
+@1:
+    test    dl, THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL
+    jz      @2
+    in      al, 92h
+    or      al, 2
+    out     92h, al                     ; deactivate A20M#
+@2:
+    mov     eax, ss
+    lea     bp, [esp + sizeof (IA32_REGS)]
+    ;
+    ; rsi in the following 2 instructions is indeed bp in 16-bit code
+    ;
+    mov     word ptr (IA32_REGS ptr [rsi - sizeof (IA32_REGS)])._ESP, bp
+    DB      66h
+    mov     ebx, (IA32_REGS ptr [rsi - sizeof (IA32_REGS)])._EIP
+    shl     ax, 4                       ; shl eax, 4
+    add     bp, ax                      ; add ebp, eax
+    mov     ax, cs
+    shl     ax, 4
+    lea     ax, [eax + ebx + (@64BitCode - @Base)]
+    DB      66h, 2eh, 89h, 87h          ; mov cs:[bx + (@64Eip - @Base)], eax
+    DW      @64Eip - @Base
+    DB      66h, 0b8h                   ; mov eax, imm32
+SavedCr4    DD      ?
+    mov     cr4, rax
+    ;
+    ; rdi in the instruction below is indeed bx in 16-bit code
+    ;
+    DB      66h, 2eh                    ; 2eh is "cs:" segment override
+    lgdt    fword ptr [rdi + (SavedGdt - @Base)]
+    DB      66h
+    mov     ecx, 0c0000080h
+    rdmsr
+    or      ah, 1
+    wrmsr
+    DB      66h, 0b8h                   ; mov eax, imm32
+SavedCr0    DD      ?
+    mov     cr0, rax
+    DB      66h, 0eah                   ; jmp far cs:@64Bit
+@64Eip      DD      ?
+SavedCs     DW      ?
+@64BitCode:
+    mov     rsp, r8                     ; restore stack
+    ret
+_BackFromUserCode   ENDP
+
+_EntryPoint DD      _ToUserCode - m16Start
+            DW      CODE16
+_16Gdtr     LABEL   FWORD
+            DW      GDT_SIZE - 1
+_16GdtrBase DQ      _NullSeg
+_16Idtr     FWORD   (1 SHL 10) - 1
+
+;------------------------------------------------------------------------------
+; _ToUserCode() takes control in real mode before passing control to user code.
+; It will be shadowed to somewhere in memory below 1MB.
+;------------------------------------------------------------------------------
+_ToUserCode PROC
+    mov     ss, edx                     ; set new segment selectors
+    mov     ds, edx
+    mov     es, edx
+    mov     fs, edx
+    mov     gs, edx
+    DB      66h
+    mov     ecx, 0c0000080h
+    mov     cr0, rax                    ; real mode starts at next instruction
+    rdmsr
+    and     ah, NOT 1
+    wrmsr
+    mov     cr4, rbp
+    mov     ss, esi                     ; set up 16-bit stack segment
+    mov     sp, bx                      ; set up 16-bit stack pointer
+    DB      66h                         ; make the following call 32-bit
+    call    @Base                       ; push eip
+@Base:
+    pop     bp                          ; ebp <- address of @Base
+    push    [esp + sizeof (IA32_REGS) + 2]
+    lea     eax, [rsi + (@RealMode - @Base)]    ; rsi is "bp" in 16-bit code
+    push    rax
+    retf                                ; execution begins at next instruction
+@RealMode:
+    DB      66h, 2eh                    ; CS and operand size override
+    lidt    fword ptr [rsi + (_16Idtr - @Base)]
+    DB      66h, 61h                    ; popad
+    DB      1fh                         ; pop ds
+    DB      07h                         ; pop es
+    pop     fs
+    pop     gs
+    popf                                ; popfd
+    lea     sp, [esp + 4]               ; skip high order 32 bits of EFlags
+    DB      66h                         ; make the following retf 32-bit
+    retf                                ; transfer control to user code
+_ToUserCode ENDP
+
+CODE16  = _16Code - $
+DATA16  = _16Data - $
+DATA32  = _32Data - $
+
+_NullSeg    DQ      0
+_16Code     LABEL   QWORD
+            DW      -1
+            DW      0
+            DB      0
+            DB      9bh
+            DB      8fh                 ; 16-bit segment, 4GB limit
+            DB      0
+_16Data     LABEL   QWORD
+            DW      -1
+            DW      0
+            DB      0
+            DB      93h
+            DB      8fh                 ; 16-bit segment, 4GB limit
+            DB      0
+_32Data     LABEL   QWORD
+            DW      -1
+            DW      0
+            DB      0
+            DB      93h
+            DB      0cfh                ; 16-bit segment, 4GB limit
+            DB      0
+
+GDT_SIZE = $ - _NullSeg
+
+;------------------------------------------------------------------------------
+; IA32_REGISTER_SET *
+; EFIAPI
+; InternalAsmThunk16 (
+;   IN      IA32_REGISTER_SET         *RegisterSet,
+;   IN OUT  VOID                      *Transition
+;   );
+;------------------------------------------------------------------------------
+InternalAsmThunk16  PROC    USES    rbp rbx rsi rdi
+    mov     r10d, ds                    ; r9 ~ r11 are not accessible in 16-bit
+    mov     r11d, es                    ; so use them for saving seg registers
+    mov     r9d, ss
+    push    fs
+    push    gs
+    mov     rsi, rcx
+    movzx   r8d, (IA32_REGS ptr [rsi])._SS
+    mov     edi, (IA32_REGS ptr [rsi])._ESP
+    lea     rdi, [edi - (sizeof (IA32_REGS) + 4)]
+    imul    eax, r8d, 16                ; eax <- r8d(stack segment) * 16
+    mov     ebx, edi                    ; ebx <- stack for 16-bit code
+    push    sizeof (IA32_REGS) / 4
+    add     edi, eax                    ; edi <- linear address of 16-bit stack
+    pop     rcx
+    rep     movsd                       ; copy RegSet
+    lea     ecx, [rdx + (SavedCr4 - m16Start)]
+    mov     eax, edx                    ; eax <- transition code address
+    and     edx, 0fh
+    shl     eax, 12                     ; segment address in high order 16 bits
+    lea     ax, [rdx + (_BackFromUserCode - m16Start)]  ; offset address
+    stosd                               ; [edi] <- return address of user code
+    sgdt    fword ptr [rcx + (SavedGdt - SavedCr4)]
+    sidt    fword ptr [rsp + 38h]       ; save IDT stack in argument space
+    mov     rax, cr0
+    mov     [rcx + (SavedCr0 - SavedCr4)], eax
+    and     eax, 7ffffffeh              ; clear PE, PG bits
+    mov     rbp, cr4
+    mov     [rcx], ebp                  ; save CR4 in SavedCr4
+    and     ebp, 300h                   ; clear all but PCE and OSFXSR bits
+    mov     esi, r8d                    ; esi <- 16-bit stack segment
+    DB      6ah, DATA32                 ; push DATA32
+    pop     rdx                         ; rdx <- 32-bit data segment selector
+    lgdt    fword ptr [rcx + (_16Gdtr - SavedCr4)]
+    mov     ss, edx
+    pushfq
+    lea     edx, [rdx + DATA16 - DATA32]
+    lea     r8, @RetFromRealMode
+    push    r8
+    mov     r8d, cs
+    mov     [rcx + (SavedCs - SavedCr4)], r8w
+    mov     r8, rsp
+    jmp     fword ptr [rcx + (_EntryPoint - SavedCr4)]
+@RetFromRealMode:
+    popfq
+    lidt    fword ptr [rsp + 38h]       ; restore protected mode IDTR
+    lea     eax, [rbp - sizeof (IA32_REGS)]
+    pop     gs
+    pop     fs
+    mov     ss, r9d
+    mov     es, r11d
+    mov     ds, r10d
+    ret
+InternalAsmThunk16  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/Wbinvd.S b/MdePkg/Library/BaseLib/X64/Wbinvd.S
new file mode 100644
index 0000000000..a4b9704d2d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Wbinvd.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   Wbinvd.S
+#
+# Abstract:
+#
+#   AsmWbinvd function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWbinvd (
+#   VOID
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWbinvd;
+.align 16;
+_AsmWbinvd:
+    wbinvd
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/Wbinvd.asm b/MdePkg/Library/BaseLib/X64/Wbinvd.asm
new file mode 100644
index 0000000000..ca0cb252b3
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/Wbinvd.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   Wbinvd.Asm
+;
+; Abstract:
+;
+;   AsmWbinvd function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWbinvd (
+;   VOID
+;   );
+;------------------------------------------------------------------------------
+AsmWbinvd   PROC
+    wbinvd
+    ret
+AsmWbinvd   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr0.S b/MdePkg/Library/BaseLib/X64/WriteCr0.S
new file mode 100644
index 0000000000..f77dc815bf
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr0.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteCr0.S
+#
+# Abstract:
+#
+#   AsmWriteCr0 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteCr0 (
+#   UINTN  Cr0
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteCr0;
+_AsmWriteCr0:
+    mov    %rcx,%cr0
+    mov    %rcx,%rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr0.asm b/MdePkg/Library/BaseLib/X64/WriteCr0.asm
new file mode 100644
index 0000000000..caf1904d2e
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr0.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteCr0.Asm
+;
+; Abstract:
+;
+;   AsmWriteCr0 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteCr0 (
+;   UINTN  Cr0
+;   );
+;------------------------------------------------------------------------------
+AsmWriteCr0 PROC
+    mov     cr0, rcx
+    mov     rax, rcx
+    ret
+AsmWriteCr0 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr2.S b/MdePkg/Library/BaseLib/X64/WriteCr2.S
new file mode 100644
index 0000000000..66821616e1
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr2.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteCr2.S
+#
+# Abstract:
+#
+#   AsmWriteCr2 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteCr2 (
+#   UINTN  Cr2
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteCr2;
+_AsmWriteCr0:
+    mov    %rcx,%cr2
+    mov    %rcx,%rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr2.asm b/MdePkg/Library/BaseLib/X64/WriteCr2.asm
new file mode 100644
index 0000000000..ee5b546262
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr2.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteCr2.Asm
+;
+; Abstract:
+;
+;   AsmWriteCr2 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteCr2 (
+;   UINTN  Cr2
+;   );
+;------------------------------------------------------------------------------
+AsmWriteCr2 PROC
+    mov     cr2, rcx
+    mov     rax, rcx
+    ret
+AsmWriteCr2 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr3.S b/MdePkg/Library/BaseLib/X64/WriteCr3.S
new file mode 100644
index 0000000000..880ed9737b
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr3.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteCr3.S
+#
+# Abstract:
+#
+#   AsmWriteCr3 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteCr3 (
+#   UINTN  Cr3
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteCr3;
+_AsmWriteCr3:
+    mov    %rcx,%cr3
+    mov    %rcx,%rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr3.asm b/MdePkg/Library/BaseLib/X64/WriteCr3.asm
new file mode 100644
index 0000000000..e63229820e
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr3.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteCr3.Asm
+;
+; Abstract:
+;
+;   AsmWriteCr3 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteCr3 (
+;   UINTN  Cr3
+;   );
+;------------------------------------------------------------------------------
+AsmWriteCr3 PROC
+    mov     cr3, rcx
+    mov     rax, rcx
+    ret
+AsmWriteCr3 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr4.S b/MdePkg/Library/BaseLib/X64/WriteCr4.S
new file mode 100644
index 0000000000..046936352f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr4.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteCr4.S
+#
+# Abstract:
+#
+#   AsmWriteCr4 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteCr4 (
+#   UINTN  Cr4
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteCr4;
+_AsmWriteCr4:
+    mov    %rcx,%cr4
+    mov    %rcx,%rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteCr4.asm b/MdePkg/Library/BaseLib/X64/WriteCr4.asm
new file mode 100644
index 0000000000..3e79fe23e4
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteCr4.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteCr4.Asm
+;
+; Abstract:
+;
+;   AsmWriteCr4 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteCr4 (
+;   UINTN  Cr4
+;   );
+;------------------------------------------------------------------------------
+AsmWriteCr4 PROC
+    mov     cr4, rcx
+    mov     rax, rcx
+    ret
+AsmWriteCr4 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr0.S b/MdePkg/Library/BaseLib/X64/WriteDr0.S
new file mode 100644
index 0000000000..080e56aeb5
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr0.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr0.S
+#
+# Abstract:
+#
+#   AsmWriteDr0 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr0 (
+#   UINTN  Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr0;
+.align 16;
+_AsmWriteDr0:
+    mov     %rcx, %dr0
+    mov     %rcx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr0.asm b/MdePkg/Library/BaseLib/X64/WriteDr0.asm
new file mode 100644
index 0000000000..a1131fead9
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr0.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr0.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr0 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr0 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr0 PROC
+    mov     dr0, rcx
+    mov     rax, rcx
+    ret
+AsmWriteDr0 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr1.S b/MdePkg/Library/BaseLib/X64/WriteDr1.S
new file mode 100644
index 0000000000..af61b68e88
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr1.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr1.S
+#
+# Abstract:
+#
+#   AsmWriteDr1 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr1 (
+#   UINTN  Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr1;
+.align 16;
+_AsmWriteDr1:
+    mov     %rcx, %dr1
+    mov     %rcx, rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr1.asm b/MdePkg/Library/BaseLib/X64/WriteDr1.asm
new file mode 100644
index 0000000000..366edb6ef8
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr1.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr1.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr1 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr1 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr1 PROC
+    mov     dr1, rcx
+    mov     rax, rcx
+    ret
+AsmWriteDr1 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr2.S b/MdePkg/Library/BaseLib/X64/WriteDr2.S
new file mode 100644
index 0000000000..a9e5369175
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr2.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr2.S
+#
+# Abstract:
+#
+#   AsmWriteDr2 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr2 (
+#   UINTN  Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr2;
+.align 16;
+_AsmWriteDr2:
+    mov     %rcx, %dr2
+    mov     %rcx, rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr2.asm b/MdePkg/Library/BaseLib/X64/WriteDr2.asm
new file mode 100644
index 0000000000..bde8e3d929
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr2.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr2.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr2 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr2 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr2 PROC
+    mov     dr2, rcx
+    mov     rax, rcx
+    ret
+AsmWriteDr2 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr3.S b/MdePkg/Library/BaseLib/X64/WriteDr3.S
new file mode 100644
index 0000000000..04017cc886
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr3.S
@@ -0,0 +1,37 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr3.S
+#
+# Abstract:
+#
+#   AsmWriteDr3 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr3 (
+#   UINTN  Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr3;
+.align 16;
+_AsmWriteDr3:
+    mov     %rcx, %dr3
+    mov     %rcx, rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr3.asm b/MdePkg/Library/BaseLib/X64/WriteDr3.asm
new file mode 100644
index 0000000000..65180a27d5
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr3.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr3.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr3 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr3 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr3 PROC
+    mov     dr3, rcx
+    mov     rax, rcx
+    ret
+AsmWriteDr3 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr4.S b/MdePkg/Library/BaseLib/X64/WriteDr4.S
new file mode 100644
index 0000000000..b6b4e7821c
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr4.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr4.S
+#
+# Abstract:
+#
+#   AsmWriteDr4 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr4 (
+#   IN UINTN Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr4;
+_AsmWriteDr4:
+    mov     %rcx, %dr4
+    mov     %rcx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr4.asm b/MdePkg/Library/BaseLib/X64/WriteDr4.asm
new file mode 100644
index 0000000000..188a9d4ddc
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr4.asm
@@ -0,0 +1,43 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr4.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr4 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr4 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr4 PROC
+    ;
+    ; There's no obvious reason to access this register, since it's aliased to
+    ; DR6 when DE=0 or an exception generated when DE=1
+    ;
+    DB      0fh, 23h, 0e1h
+    mov     rax, rcx
+    ret
+AsmWriteDr4 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr5.S b/MdePkg/Library/BaseLib/X64/WriteDr5.S
new file mode 100644
index 0000000000..7539095890
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr5.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr5.S
+#
+# Abstract:
+#
+#   AsmWriteDr5 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr5 (
+#   IN UINTN Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr5;
+_AsmWriteDr5:
+    mov     %rcx, %dr5
+    mov     %rcx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr5.asm b/MdePkg/Library/BaseLib/X64/WriteDr5.asm
new file mode 100644
index 0000000000..86009c3287
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr5.asm
@@ -0,0 +1,43 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr5.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr5 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr6 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr5 PROC
+    ;
+    ; There's no obvious reason to access this register, since it's aliased to
+    ; DR7 when DE=0 or an exception generated when DE=1
+    ;
+    DB      0fh, 23h, 0e9h
+    mov     rax, rcx
+    ret
+AsmWriteDr5 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr6.S b/MdePkg/Library/BaseLib/X64/WriteDr6.S
new file mode 100644
index 0000000000..862726079e
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr6.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr6.S
+#
+# Abstract:
+#
+#   AsmWriteDr6 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr6 (
+#   IN UINTN Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr6;
+_AsmWriteDr6:
+    mov     %rcx, %dr6
+    mov     %rcx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr6.asm b/MdePkg/Library/BaseLib/X64/WriteDr6.asm
new file mode 100644
index 0000000000..f1ddae8bfc
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr6.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr6.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr6 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr6 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr6 PROC
+    mov     dr6, rcx
+    mov     rax, rcx
+    ret
+AsmWriteDr6 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr7.S b/MdePkg/Library/BaseLib/X64/WriteDr7.S
new file mode 100644
index 0000000000..8699d9536f
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr7.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteDr7.S
+#
+# Abstract:
+#
+#   AsmWriteDr7 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINTN
+# EFIAPI
+# AsmWriteDr7 (
+#   IN UINTN Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteDr7;
+_AsmWriteDr7:
+    mov     %rcx, %dr7
+    mov     %rcx, %rax
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteDr7.asm b/MdePkg/Library/BaseLib/X64/WriteDr7.asm
new file mode 100644
index 0000000000..6a0cbfa6ff
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteDr7.asm
@@ -0,0 +1,39 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteDr7.Asm
+;
+; Abstract:
+;
+;   AsmWriteDr7 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINTN
+; EFIAPI
+; AsmWriteDr7 (
+;   IN UINTN Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteDr7 PROC
+    mov     dr7, rcx
+    mov     rax, rcx
+    ret
+AsmWriteDr7 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteGdtr.S b/MdePkg/Library/BaseLib/X64/WriteGdtr.S
new file mode 100644
index 0000000000..1e9d84b426
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteGdtr.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteGdtr.S
+#
+# Abstract:
+#
+#   AsmWriteGdtr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86WriteGdtr (
+#   IN      CONST IA32_DESCRIPTOR     *Idtr
+#   );
+#------------------------------------------------------------------------------
+.global _InternalX86WriteGdtr;
+_InternalX86WriteGdtr:
+    lgdt    (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteGdtr.asm b/MdePkg/Library/BaseLib/X64/WriteGdtr.asm
new file mode 100644
index 0000000000..fa99a499e7
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteGdtr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteGdtr.Asm
+;
+; Abstract:
+;
+;   AsmWriteGdtr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86WriteGdtr (
+;   IN      CONST IA32_DESCRIPTOR     *Idtr
+;   );
+;------------------------------------------------------------------------------
+InternalX86WriteGdtr  PROC
+    lgdt    fword ptr [rcx]
+    ret
+InternalX86WriteGdtr  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteIdtr.S b/MdePkg/Library/BaseLib/X64/WriteIdtr.S
new file mode 100644
index 0000000000..feb085ff58
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteIdtr.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteIdtr.S
+#
+# Abstract:
+#
+#   AsmWriteIdtr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# InternalX86WriteIdtr (
+#   IN      CONST IA32_DESCRIPTOR     *Idtr
+#   );
+#------------------------------------------------------------------------------
+.global _InternalX86WriteIdtr;
+.align 16;
+_InternalX86WriteIdtr:
+    lidt    (%rcx)
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteIdtr.asm b/MdePkg/Library/BaseLib/X64/WriteIdtr.asm
new file mode 100644
index 0000000000..2f6c081ab6
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteIdtr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteIdtr.Asm
+;
+; Abstract:
+;
+;   AsmWriteIdtr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; InternalX86WriteIdtr (
+;   IN      CONST IA32_DESCRIPTOR     *Idtr
+;   );
+;------------------------------------------------------------------------------
+InternalX86WriteIdtr  PROC
+    lidt    fword ptr [rcx]
+    ret
+InternalX86WriteIdtr  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteLdtr.S b/MdePkg/Library/BaseLib/X64/WriteLdtr.S
new file mode 100644
index 0000000000..c07ab831f9
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteLdtr.S
@@ -0,0 +1,36 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteLdtr.S
+#
+# Abstract:
+#
+#   AsmWriteLdtr function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteLdtr (
+#   IN UINT16 Ldtr
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteLdtr;
+.align 16;
+_AsmWriteLdtr:
+    lldt    %cx
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteLdtr.asm b/MdePkg/Library/BaseLib/X64/WriteLdtr.asm
new file mode 100644
index 0000000000..d85ae38f29
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteLdtr.asm
@@ -0,0 +1,38 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteLdtr.Asm
+;
+; Abstract:
+;
+;   AsmWriteLdtr function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteLdtr (
+;   IN UINT16 Ldtr
+;   );
+;------------------------------------------------------------------------------
+AsmWriteLdtr    PROC
+    lldt    cx
+    ret
+AsmWriteLdtr    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm0.S b/MdePkg/Library/BaseLib/X64/WriteMm0.S
new file mode 100644
index 0000000000..2d805a14dc
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm0.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm0.S
+#
+# Abstract:
+#
+#   AsmWriteMm0 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm0 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm0;
+_AsmWriteMm0:
+    movd	%rcx, %xmm0
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm0.asm b/MdePkg/Library/BaseLib/X64/WriteMm0.asm
new file mode 100644
index 0000000000..7496362d86
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm0.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm0.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm0 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm0 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm0 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0c1h
+    ret
+AsmWriteMm0 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm1.S b/MdePkg/Library/BaseLib/X64/WriteMm1.S
new file mode 100644
index 0000000000..ff8162e727
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm1.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm1.S
+#
+# Abstract:
+#
+#   AsmWriteMm1 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm1 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm1;
+_AsmWriteMm1:
+    movd	%rcx, %mm1
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm1.asm b/MdePkg/Library/BaseLib/X64/WriteMm1.asm
new file mode 100644
index 0000000000..a00f551f8a
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm1.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm1.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm1 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm1 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm1 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0c9h
+    ret
+AsmWriteMm1 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm2.S b/MdePkg/Library/BaseLib/X64/WriteMm2.S
new file mode 100644
index 0000000000..a98e73650c
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm2.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm2.S
+#
+# Abstract:
+#
+#   AsmWriteMm2 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm2 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm2; 
+_AsmWriteMm2:
+    movd	%rcx, %mm2
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm2.asm b/MdePkg/Library/BaseLib/X64/WriteMm2.asm
new file mode 100644
index 0000000000..01db79007d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm2.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm2.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm2 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm2 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm2 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0d1h
+    ret
+AsmWriteMm2 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm3.S b/MdePkg/Library/BaseLib/X64/WriteMm3.S
new file mode 100644
index 0000000000..81561e3594
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm3.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm3.S
+#
+# Abstract:
+#
+#   AsmWriteMm3 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm3 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm3;
+_AsmWriteMm3:
+    movd	%rcx, %mm3
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm3.asm b/MdePkg/Library/BaseLib/X64/WriteMm3.asm
new file mode 100644
index 0000000000..59464641eb
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm3.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm3.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm3 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm3 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm3 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0d9h
+    ret
+AsmWriteMm3 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm4.S b/MdePkg/Library/BaseLib/X64/WriteMm4.S
new file mode 100644
index 0000000000..124d946dde
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm4.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm4.S
+#
+# Abstract:
+#
+#   AsmWriteMm4 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm4 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm4;
+_AsmWriteMm4:
+    movd	%rcx, %mm4
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm4.asm b/MdePkg/Library/BaseLib/X64/WriteMm4.asm
new file mode 100644
index 0000000000..6848dbf7ec
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm4.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm4.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm4 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm4 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm4 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0e1h
+    ret
+AsmWriteMm4 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm5.S b/MdePkg/Library/BaseLib/X64/WriteMm5.S
new file mode 100644
index 0000000000..0935ddc0b1
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm5.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm5.S
+#
+# Abstract:
+#
+#   AsmWriteMm5 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm5 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm5;
+_AsmWriteMm5:
+    movd	%rcx, %mm5
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm5.asm b/MdePkg/Library/BaseLib/X64/WriteMm5.asm
new file mode 100644
index 0000000000..fbe44ae078
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm5.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm5.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm5 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm5 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm5 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0e9h
+    ret
+AsmWriteMm5 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm6.S b/MdePkg/Library/BaseLib/X64/WriteMm6.S
new file mode 100644
index 0000000000..02b50cf055
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm6.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm6.S
+#
+# Abstract:
+#
+#   AsmWriteMm6 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm6 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm6;
+_AsmWriteMm6:
+    movd	%rcx, %mm6
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm6.asm b/MdePkg/Library/BaseLib/X64/WriteMm6.asm
new file mode 100644
index 0000000000..cd5938828d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm6.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm6.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm6 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm6 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm6 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0f1h
+    ret
+AsmWriteMm6 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm7.S b/MdePkg/Library/BaseLib/X64/WriteMm7.S
new file mode 100644
index 0000000000..60292721e8
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm7.S
@@ -0,0 +1,35 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMm7.S
+#
+# Abstract:
+#
+#   AsmWriteMm7 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# VOID
+# EFIAPI
+# AsmWriteMm7 (
+#   IN UINT64   Value
+#   );
+#------------------------------------------------------------------------------
+.global _AsmWriteMm7;
+_AsmWriteMm7:
+    movd	%rcx, %mm7
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMm7.asm b/MdePkg/Library/BaseLib/X64/WriteMm7.asm
new file mode 100644
index 0000000000..9636a4cd8d
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMm7.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMm7.Asm
+;
+; Abstract:
+;
+;   AsmWriteMm7 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; VOID
+; EFIAPI
+; AsmWriteMm7 (
+;   IN UINT64   Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMm7 PROC
+    ;
+    ; 64-bit MASM doesn't support MMX instructions, so use opcode here
+    ;
+    DB      48h, 0fh, 6eh, 0f9h
+    ret
+AsmWriteMm7 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMsr64.S b/MdePkg/Library/BaseLib/X64/WriteMsr64.S
new file mode 100644
index 0000000000..88ff48bf26
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMsr64.S
@@ -0,0 +1,40 @@
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   WriteMsr64.S
+#
+# Abstract:
+#
+#   AsmWriteMsr64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+
+#------------------------------------------------------------------------------
+# UINT64
+# EFIAPI
+# AsmWriteMsr64 (
+#   IN UINT32  Index,
+#   IN UINT64  Value
+#   );
+# TODO:
+#------------------------------------------------------------------------------
+.global _AsmWriteMsr64;
+.align 16;
+_AsmWriteMsr64:
+    mov	%rdx, %rax
+    shr $0x20, %rdx
+    wrmsr
+    ret
diff --git a/MdePkg/Library/BaseLib/X64/WriteMsr64.asm b/MdePkg/Library/BaseLib/X64/WriteMsr64.asm
new file mode 100644
index 0000000000..b7704b8185
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMsr64.asm
@@ -0,0 +1,41 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   WriteMsr64.Asm
+;
+; Abstract:
+;
+;   AsmWriteMsr64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; UINT64
+; EFIAPI
+; AsmWriteMsr64 (
+;   IN UINT32  Index,
+;   IN UINT64  Value
+;   );
+;------------------------------------------------------------------------------
+AsmWriteMsr64   PROC
+    mov     rax, rdx                    ; meanwhile, rax <- return value
+    shr     rdx, 20h                    ; edx:eax contains the value to write
+    wrmsr
+    ret
+AsmWriteMsr64   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseLib/X64/WriteMsr64.c b/MdePkg/Library/BaseLib/X64/WriteMsr64.c
new file mode 100644
index 0000000000..1d1e0bc332
--- /dev/null
+++ b/MdePkg/Library/BaseLib/X64/WriteMsr64.c
@@ -0,0 +1,32 @@
+/** @file
+  CpuBreakpoint function.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+//
+// Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics
+//
+void __writemsr (unsigned long Register, unsigned __int64 Value);
+
+#pragma intrinsic(__writemsr)
+
+UINT64
+EFIAPI
+AsmWriteMsr64 (
+  IN UINT32  Index,
+  IN UINT64  Value
+  )
+{
+  __writemsr (Index, Value);
+  return Value;
+}
+
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.S
index 3968604ca6..725367b2f9 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.S
@@ -1,58 +1,53 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   CompareMem.Asm
-#
-# Abstract:
-#
-#   CompareMem function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemCompareMem
-
-#------------------------------------------------------------------------------
-# INTN
-# EFIAPI
-# InternalMemCompareMem (
-#   IN      CONST VOID                *DestinationBuffer,
-#   IN      CONST VOID                *SourceBuffer,
-#   IN      UINTN                     Length
-#   );
-#------------------------------------------------------------------------------
-_InternalMemCompareMem:
-    push    %esi
-    push    %edi
-    movl    12(%esp), %esi
-    movl    16(%esp), %edi
-    movl    20(%esp), %ecx
-    repe    cmpsb
-    movzbl  -1(%esi), %eax
-    movzbl  -1(%edi), %edx
-    subl    %edx, %eax
-    pop     %edi
-    pop     %esi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CompareMem.Asm
+#
+# Abstract:
+#
+#   CompareMem function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemCompareMem
+
+#------------------------------------------------------------------------------
+# INTN
+# EFIAPI
+# InternalMemCompareMem (
+#   IN      CONST VOID                *DestinationBuffer,
+#   IN      CONST VOID                *SourceBuffer,
+#   IN      UINTN                     Length
+#   );
+#------------------------------------------------------------------------------
+_InternalMemCompareMem:
+    push    %esi
+    push    %edi
+    movl    12(%esp), %esi
+    movl    16(%esp), %edi
+    movl    20(%esp), %ecx
+    repe    cmpsb
+    movzbl  -1(%esi), %eax
+    movzbl  -1(%edi), %edx
+    subl    %edx, %eax
+    pop     %edi
+    pop     %esi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.asm
index 2509e40bd8..1d0e7fad39 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CompareMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.S
index a83fc04634..a95b33759c 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.S
@@ -1,70 +1,65 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   CopyMem.Asm
-#
-# Abstract:
-#
-#   CopyMem function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemCopyMem
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  EFIAPI
-#  InternalMemCopyMem (
-#    IN VOID   *Destination,
-#    IN VOID   *Source,
-#    IN UINTN  Count
-#    );
-#------------------------------------------------------------------------------
-_InternalMemCopyMem:
-    push    %esi
-    push    %edi
-    movl    16(%esp), %esi              # esi <- Source
-    movl    12(%esp), %edi              # edi <- Destination
-    movl    20(%esp), %edx              # edx <- Count
-    leal    -1(%esi, %edx), %eax        # eax <- End of Source
-    cmpl    %edi, %esi
-    jae     L0
-    cmpl    %edi, %eax
-    jae     L_CopyBackward              # Copy backward if overlapped
-L0:
-    movl    %edx, %ecx
-    andl    $3, %edx
-    shrl    $2, %ecx
-    rep
-    movsl                               # Copy as many Dwords as possible
-    jmp     L_CopyBytes
-L_CopyBackward:
-    movl    %eax, %esi                  # esi <- End of Source
-    leal    -1(%edi, %edx), %edi        # edi <- End of Destination
-    std
-L_CopyBytes:
-    movl    %edx, %ecx
-    rep
-    movsb                               # Copy bytes backward
-    cld
-    movl    12(%esp), %eax              # eax <- Destination as return value
-    pop     %edi
-    pop     %esi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CopyMem.Asm
+#
+# Abstract:
+#
+#   CopyMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemCopyMem
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  EFIAPI
+#  InternalMemCopyMem (
+#    IN VOID   *Destination,
+#    IN VOID   *Source,
+#    IN UINTN  Count
+#    );
+#------------------------------------------------------------------------------
+_InternalMemCopyMem:
+    push    %esi
+    push    %edi
+    movl    16(%esp), %esi              # esi <- Source
+    movl    12(%esp), %edi              # edi <- Destination
+    movl    20(%esp), %edx              # edx <- Count
+    leal    -1(%esi, %edx), %eax        # eax <- End of Source
+    cmpl    %edi, %esi
+    jae     L0
+    cmpl    %edi, %eax
+    jae     L_CopyBackward              # Copy backward if overlapped
+L0:
+    movl    %edx, %ecx
+    andl    $3, %edx
+    shrl    $2, %ecx
+    rep
+    movsl                               # Copy as many Dwords as possible
+    jmp     L_CopyBytes
+L_CopyBackward:
+    movl    %eax, %esi                  # esi <- End of Source
+    leal    -1(%edi, %edx), %edi        # edi <- End of Destination
+    std
+L_CopyBytes:
+    movl    %edx, %ecx
+    rep
+    movsb                               # Copy bytes backward
+    cld
+    movl    12(%esp), %eax              # eax <- Destination as return value
+    pop     %edi
+    pop     %esi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.asm
index 8b4366e976..86677ef614 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/CopyMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.S
index 276b4ff29f..5e65b9667a 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.S
@@ -1,55 +1,50 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem16.Asm
-#
-# Abstract:
-#
-#   ScanMem16 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem16
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem16 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT16                    Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem16:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    8(%esp), %edi
-    movl    16(%esp), %eax
-    repne   scasw
-    leal    -2(%edi), %eax
-    cmovnz  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem16.Asm
+#
+# Abstract:
+#
+#   ScanMem16 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem16
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem16 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT16                    Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem16:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    8(%esp), %edi
+    movl    16(%esp), %eax
+    repne   scasw
+    leal    -2(%edi), %eax
+    cmovnz  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.asm
index 6b5c81f556..57fab61b77 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem16.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.S
index fced1b2362..5d46ed2bc1 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.S
@@ -1,55 +1,50 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem32.Asm
-#
-# Abstract:
-#
-#   ScanMem32 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem32
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem32 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT32                    Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem32:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    8(%esp), %edi
-    movl    16(%esp), %eax
-    repne   scasl
-    leal    -4(%edi), %eax
-    cmovnz  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem32.Asm
+#
+# Abstract:
+#
+#   ScanMem32 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem32
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem32 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT32                    Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem32:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    8(%esp), %edi
+    movl    16(%esp), %eax
+    repne   scasl
+    leal    -4(%edi), %eax
+    cmovnz  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.asm
index cb0feed6be..6ac857ce16 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem32.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.S
index 37dc3bbf67..3ba69650ab 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.S
@@ -1,64 +1,59 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem64.Asm
-#
-# Abstract:
-#
-#   ScanMem64 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem64
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem64 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT64                    Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem64:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    16(%esp), %eax
-    movl    20(%esp), %edx
-    movl    8(%esp), %edi
-L0:
-    cmpl    (%edi), %eax
-    leal    8(%edi), %edi
-    loopne  L0
-    jne     L1
-    cmpl    -4(%edi), %edx
-    jecxz   L1
-    jne     L0
-L1:
-    leal    -8(%edi), %eax
-    cmovne  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem64.Asm
+#
+# Abstract:
+#
+#   ScanMem64 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem64
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem64 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT64                    Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem64:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    16(%esp), %eax
+    movl    20(%esp), %edx
+    movl    8(%esp), %edi
+L0:
+    cmpl    (%edi), %eax
+    leal    8(%edi), %edi
+    loopne  L0
+    jne     L1
+    cmpl    -4(%edi), %edx
+    jecxz   L1
+    jne     L0
+L1:
+    leal    -8(%edi), %eax
+    cmovne  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.asm
index ee0deddc61..ca54f13738 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem64.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.S
index e7d2a26cad..7a834a5635 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.S
@@ -1,55 +1,50 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem8.Asm
-#
-# Abstract:
-#
-#   ScanMem8 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem8
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem8 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT8                     Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem8:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    8(%esp), %edi
-    movb    16(%esp), %al
-    repne   scasb
-    leal    -1(%edi), %eax
-    cmovnz  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem8.Asm
+#
+# Abstract:
+#
+#   ScanMem8 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem8
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem8 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT8                     Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem8:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    8(%esp), %edi
+    movb    16(%esp), %al
+    repne   scasb
+    leal    -1(%edi), %eax
+    cmovnz  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.asm
index 97d201abb5..a3f65b64fa 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ScanMem8.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.S
index 46029950be..4ddf6c490b 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.S
@@ -1,51 +1,46 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem.Asm
-#
-# Abstract:
-#
-#   SetMem function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-    .386:
-    .code:
-
-.globl _InternalMemSetMem
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  InternalMemSetMem (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT8  Value
-#    )
-#------------------------------------------------------------------------------
-_InternalMemSetMem:
-    push    %edi
-    movl    16(%esp),%eax
-    movl    8(%esp),%edi
-    movl    12(%esp),%ecx
-    rep
-    stosb
-    movl    8(%esp),%eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem.Asm
+#
+# Abstract:
+#
+#   SetMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+    .386:
+    .code:
+
+.globl _InternalMemSetMem
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  InternalMemSetMem (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT8  Value
+#    )
+#------------------------------------------------------------------------------
+_InternalMemSetMem:
+    push    %edi
+    movl    16(%esp),%eax
+    movl    8(%esp),%edi
+    movl    12(%esp),%ecx
+    rep
+    stosb
+    movl    8(%esp),%eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.asm
index b48cffc1ee..98b1ed84c2 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.S
index ff62e947a4..6e7c136222 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.S
@@ -1,48 +1,43 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem16.Asm
-#
-# Abstract:
-#
-#   SetMem16 function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemSetMem16
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  InternalMemSetMem16 (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT16 Value
-#    )
-#------------------------------------------------------------------------------
-_InternalMemSetMem16:
-    push    %edi
-    movl    16(%esp), %eax
-    movl    8(%esp), %edi
-    movl    12(%esp), %ecx
-    rep
-    stosw
-    movl    8(%esp), %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem16.Asm
+#
+# Abstract:
+#
+#   SetMem16 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemSetMem16
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  InternalMemSetMem16 (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT16 Value
+#    )
+#------------------------------------------------------------------------------
+_InternalMemSetMem16:
+    push    %edi
+    movl    16(%esp), %eax
+    movl    8(%esp), %edi
+    movl    12(%esp), %ecx
+    rep
+    stosw
+    movl    8(%esp), %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.asm
index 1319614d51..7f4a8955f9 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem16.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.S
index 8b94d563af..455af20573 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.S
@@ -1,48 +1,43 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem32.Asm
-#
-# Abstract:
-#
-#   SetMem32 function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemSetMem32
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  InternalMemSetMem32 (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT32 Value
-#    )
-#------------------------------------------------------------------------------
-_InternalMemSetMem32:
-    push    %edi
-    movl    16(%esp),%eax
-    movl    8(%esp),%edi
-    movl    12(%esp),%ecx
-    rep
-    stosl
-    movl    8(%esp),%eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem32.Asm
+#
+# Abstract:
+#
+#   SetMem32 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemSetMem32
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  InternalMemSetMem32 (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT32 Value
+#    )
+#------------------------------------------------------------------------------
+_InternalMemSetMem32:
+    push    %edi
+    movl    16(%esp),%eax
+    movl    8(%esp),%edi
+    movl    12(%esp),%ecx
+    rep
+    stosl
+    movl    8(%esp),%eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.asm
index 34f4b8e5d7..5876f4a741 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem32.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.S
index 68418cca6c..b4afff0fd4 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.S
@@ -1,51 +1,46 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem64.Asm
-#
-# Abstract:
-#
-#   SetMem64 function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemSetMem64
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  InternalMemSetMem64 (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT64 Value
-#    )
-#------------------------------------------------------------------------------
-_InternalMemSetMem64:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    16(%esp), %eax
-    movl    20(%esp), %edx
-    movl    8(%esp), %edi
-L0:
-    mov     %eax, -8(%edi, %ecx, 8)
-    mov     %edx, -4(%edi, %ecx, 8)
-    loop    L0
-    movl    %edi, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem64.Asm
+#
+# Abstract:
+#
+#   SetMem64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemSetMem64
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  InternalMemSetMem64 (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT64 Value
+#    )
+#------------------------------------------------------------------------------
+_InternalMemSetMem64:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    16(%esp), %eax
+    movl    20(%esp), %edx
+    movl    8(%esp), %edi
+L0:
+    mov     %eax, -8(%edi, %ecx, 8)
+    mov     %edx, -4(%edi, %ecx, 8)
+    loop    L0
+    movl    %edi, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.asm
index 3aa24ef7e4..687c18f312 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/SetMem64.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.S b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.S
index 9551c1a4a6..8465d7cf65 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.S
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.S
@@ -1,54 +1,49 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ZeroMem.Asm
-#
-# Abstract:
-#
-#   ZeroMem function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemZeroMem
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  InternalMemZeroMem (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count
-#    );
-#------------------------------------------------------------------------------
-_InternalMemZeroMem:
-    push    %edi
-    xorl    %eax,%eax
-    movl    8(%esp),%edi
-    movl    12(%esp),%ecx
-    movl    %ecx,%edx
-    shrl    $2,%ecx
-    andl    $3,%edx
-    pushl   %edi
-    rep
-    stosl
-    movl    %edx,%ecx
-    rep
-    stosb
-    popl    %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ZeroMem.Asm
+#
+# Abstract:
+#
+#   ZeroMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemZeroMem
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  InternalMemZeroMem (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count
+#    );
+#------------------------------------------------------------------------------
+_InternalMemZeroMem:
+    push    %edi
+    xorl    %eax,%eax
+    movl    8(%esp),%edi
+    movl    12(%esp),%ecx
+    movl    %ecx,%edx
+    shrl    $2,%ecx
+    andl    $3,%edx
+    pushl   %edi
+    rep
+    stosl
+    movl    %edx,%ecx
+    rep
+    stosb
+    popl    %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.asm
index fe569250ae..b3b8b5d1f1 100644
--- a/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.asm
+++ b/MdePkg/Library/BaseMemoryLibRepStr/Ia32/ZeroMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/CompareMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/CompareMem.asm
new file mode 100644
index 0000000000..554bc07c64
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/CompareMem.asm
@@ -0,0 +1,52 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CompareMem.Asm
+;
+; Abstract:
+;
+;   CompareMem function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; INTN
+; EFIAPI
+; InternalMemCompareMem (
+;   IN      CONST VOID                *DestinationBuffer,
+;   IN      CONST VOID                *SourceBuffer,
+;   IN      UINTN                     Length
+;   );
+;------------------------------------------------------------------------------
+InternalMemCompareMem   PROC    USES    rsi rdi
+    mov     rsi, rcx
+    mov     rdi, rdx
+    mov     rcx, r8
+    repe    cmpsb
+    movzx   rax, byte ptr [rsi - 1]
+    movzx   rdx, byte ptr [rdi - 1]
+    sub     rax, rdx
+    ret
+InternalMemCompareMem   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/CopyMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/CopyMem.asm
new file mode 100644
index 0000000000..a2e04056fd
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/CopyMem.asm
@@ -0,0 +1,61 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CopyMem.Asm
+;
+; Abstract:
+;
+;   CopyMem function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  EFIAPI
+;  InternalMemCopyMem (
+;    IN VOID   *Destination,
+;    IN VOID   *Source,
+;    IN UINTN  Count
+;    )
+;------------------------------------------------------------------------------
+InternalMemCopyMem  PROC    USES    rsi rdi
+    mov     rsi, rdx                    ; rsi <- Source
+    mov     rdi, rcx                    ; rdi <- Destination
+    lea     r9, [rsi + r8 - 1]          ; r9 <- End of Source
+    cmp     rsi, rdi
+    mov     rax, rdi                    ; rax <- Destination as return value
+    jae     @F
+    cmp     r9, rsi
+    jae     @CopyBackward               ; Copy backward if overlapped
+@@:
+    mov     rcx, r8
+    and     r8, 7
+    shr     rcx, 3
+    rep     movsq                       ; Copy as many Qwords as possible
+    jmp     @CopyBytes
+@CopyBackward:
+    mov     rsi, r9                     ; rsi <- End of Source
+    lea     rdi, [rdi + r8 - 1]         ; esi <- End of Destination
+    std                                 ; set direction flag
+@CopyBytes:
+    mov     rcx, r8
+    rep     movsb                       ; Copy bytes backward
+    cld
+    ret
+InternalMemCopyMem  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem16.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem16.asm
new file mode 100644
index 0000000000..a2538c2cca
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem16.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem16.Asm
+;
+; Abstract:
+;
+;   ScanMem16 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem16 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT16                    Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem16    PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    mov     rcx, rdx
+    repne   scasw
+    lea     rax, [rdi - 2]
+    cmovnz  rax, rcx
+    ret
+InternalMemScanMem16    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem32.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem32.asm
new file mode 100644
index 0000000000..e0523d8547
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem32.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem32.Asm
+;
+; Abstract:
+;
+;   ScanMem32 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem32 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT32                    Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem32    PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    mov     rcx, rdx
+    repne   scasd
+    lea     rax, [rdi - 4]
+    cmovnz  rax, rcx
+    ret
+InternalMemScanMem32    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem64.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem64.asm
new file mode 100644
index 0000000000..0e7e9c782f
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem64.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem64.Asm
+;
+; Abstract:
+;
+;   ScanMem64 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem64 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT64                    Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem64    PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    mov     rcx, rdx
+    repne   scasq
+    lea     rax, [rdi - 8]
+    cmovnz  rax, rcx
+    ret
+InternalMemScanMem64    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem8.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem8.asm
new file mode 100644
index 0000000000..879273f960
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/ScanMem8.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem8.Asm
+;
+; Abstract:
+;
+;   ScanMem8 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem8 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT8                     Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem8 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rcx, rdx
+    mov     rax, r8
+    repne   scasb
+    lea     rax, [rdi - 1]
+    cmovnz  rax, rcx                    ; set rax to 0 if not found
+    ret
+InternalMemScanMem8 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem.asm
new file mode 100644
index 0000000000..5306520169
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem.asm
@@ -0,0 +1,44 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem.Asm
+;
+; Abstract:
+;
+;   SetMem function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  EFIAPI
+;  InternalMemSetMem (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT8  Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem   PROC    USES    rdi
+    mov     rax, r8
+    mov     rdi, rcx
+    xchg    rcx, rdx
+    rep     stosb
+    mov     rax, rdx
+    ret
+InternalMemSetMem   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem16.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem16.asm
new file mode 100644
index 0000000000..fce9ed7ed5
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem16.asm
@@ -0,0 +1,44 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem16.Asm
+;
+; Abstract:
+;
+;   SetMem16 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  EFIAPI
+;  InternalMemSetMem16 (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT16 Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem16 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    xchg    rcx, rdx
+    rep     stosw
+    mov     rax, rdx
+    ret
+InternalMemSetMem16 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem32.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem32.asm
new file mode 100644
index 0000000000..ce9e54da85
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem32.asm
@@ -0,0 +1,44 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem32.Asm
+;
+; Abstract:
+;
+;   SetMem32 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  EFIAPI
+;  InternalMemSetMem32 (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT32 Value
+;    );
+;------------------------------------------------------------------------------
+InternalMemSetMem32 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    xchg    rcx, rdx
+    rep     stosd
+    mov     rax, rdx
+    ret
+InternalMemSetMem32 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem64.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem64.asm
new file mode 100644
index 0000000000..97884a36fe
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/SetMem64.asm
@@ -0,0 +1,43 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem64.Asm
+;
+; Abstract:
+;
+;   SetMem64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemSetMem64 (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT64 Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem64 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    xchg    rcx, rdx
+    rep     stosq
+    mov     rax, rdx
+    ret
+InternalMemSetMem64 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibRepStr/x64/ZeroMem.asm b/MdePkg/Library/BaseMemoryLibRepStr/x64/ZeroMem.asm
new file mode 100644
index 0000000000..c01af8e6e4
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibRepStr/x64/ZeroMem.asm
@@ -0,0 +1,47 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ZeroMem.Asm
+;
+; Abstract:
+;
+;   ZeroMem function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemZeroMem (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count
+;    );
+;------------------------------------------------------------------------------
+InternalMemZeroMem  PROC    USES    rdi
+    push    rcx
+    xor     rax, rax
+    mov     rdi, rcx
+    mov     rcx, rdx
+    shr     rcx, 3
+    and     rdx, 7
+    rep     stosq
+    mov     ecx, edx
+    rep     stosb
+    pop     rax
+    ret
+InternalMemZeroMem  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.S
index 3968604ca6..725367b2f9 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.S
@@ -1,58 +1,53 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   CompareMem.Asm
-#
-# Abstract:
-#
-#   CompareMem function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemCompareMem
-
-#------------------------------------------------------------------------------
-# INTN
-# EFIAPI
-# InternalMemCompareMem (
-#   IN      CONST VOID                *DestinationBuffer,
-#   IN      CONST VOID                *SourceBuffer,
-#   IN      UINTN                     Length
-#   );
-#------------------------------------------------------------------------------
-_InternalMemCompareMem:
-    push    %esi
-    push    %edi
-    movl    12(%esp), %esi
-    movl    16(%esp), %edi
-    movl    20(%esp), %ecx
-    repe    cmpsb
-    movzbl  -1(%esi), %eax
-    movzbl  -1(%edi), %edx
-    subl    %edx, %eax
-    pop     %edi
-    pop     %esi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CompareMem.Asm
+#
+# Abstract:
+#
+#   CompareMem function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemCompareMem
+
+#------------------------------------------------------------------------------
+# INTN
+# EFIAPI
+# InternalMemCompareMem (
+#   IN      CONST VOID                *DestinationBuffer,
+#   IN      CONST VOID                *SourceBuffer,
+#   IN      UINTN                     Length
+#   );
+#------------------------------------------------------------------------------
+_InternalMemCompareMem:
+    push    %esi
+    push    %edi
+    movl    12(%esp), %esi
+    movl    16(%esp), %edi
+    movl    20(%esp), %ecx
+    repe    cmpsb
+    movzbl  -1(%esi), %eax
+    movzbl  -1(%edi), %edx
+    subl    %edx, %eax
+    pop     %edi
+    pop     %esi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.asm
index 2509e40bd8..1d0e7fad39 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CompareMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.S
index 82a2b94d0b..ddbcbaf1b1 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.S
@@ -1,90 +1,85 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   CopyMem.asm
-#
-# Abstract:
-#
-#   CopyMem function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemCopyMem
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  EFIAPI
-#  InternalMemCopyMem (
-#    IN VOID   *Destination,
-#    IN VOID   *Source,
-#    IN UINTN  Count
-#    );
-#------------------------------------------------------------------------------
-_InternalMemCopyMem:
-    push    %esi
-    push    %edi
-    movl    16(%esp), %esi              # esi <- Source
-    movl    12(%esp), %edi              # edi <- Destination
-    movl    20(%esp), %edx              # edx <- Count
-    leal    -1(%esi,%edx,), %eax        # eax <- End of Source
-    cmpl    %edi, %esi
-    jae     L0
-    cmpl    %edi, %eax                  # Overlapped?
-    jae     L_CopyBackward               # Copy backward if overlapped
-L0:
-    xorl    %ecx, %ecx
-    subl    %edi, %ecx
-    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
-    jz      L1
-    cmpl    %edx, %ecx
-    cmova   %edx, %ecx
-    subl    %ecx, %edx                  # edx <- remaining bytes to copy
-    rep
-    movsb
-L1:
-    movl    %edx, %ecx
-    andl    $15, %edx
-    shrl    $4, %ecx                    # ecx <- # of DQwords to copy
-    jz      L_CopyBytes
-    addl    $-16, %esp
-    movdqu  %xmm0, (%esp)
-L2:
-    movdqu  (%esi), %xmm0
-    movntdq %xmm0, (%edi)
-    addl    $16, %esi
-    addl    $16, %edi
-    loop    L2
-    mfence
-    movdqu  (%esp),%xmm0
-    addl    $16, %esp                   # stack cleanup
-    jmp     L_CopyBytes
-L_CopyBackward:
-    movl    %eax, %esi                  # esi <- Last byte in Source
-    leal    -1(%edi,%edx,), %edi        # edi <- Last byte in Destination
-    std
-L_CopyBytes:
-    movl    %edx, %ecx
-    rep
-    movsb
-    cld
-    movl    12(%esp), %eax              # eax <- Destination as return value
-    pop     %edi
-    pop     %esi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   CopyMem.asm
+#
+# Abstract:
+#
+#   CopyMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemCopyMem
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  EFIAPI
+#  InternalMemCopyMem (
+#    IN VOID   *Destination,
+#    IN VOID   *Source,
+#    IN UINTN  Count
+#    );
+#------------------------------------------------------------------------------
+_InternalMemCopyMem:
+    push    %esi
+    push    %edi
+    movl    16(%esp), %esi              # esi <- Source
+    movl    12(%esp), %edi              # edi <- Destination
+    movl    20(%esp), %edx              # edx <- Count
+    leal    -1(%esi,%edx,), %eax        # eax <- End of Source
+    cmpl    %edi, %esi
+    jae     L0
+    cmpl    %edi, %eax                  # Overlapped?
+    jae     L_CopyBackward               # Copy backward if overlapped
+L0:
+    xorl    %ecx, %ecx
+    subl    %edi, %ecx
+    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
+    jz      L1
+    cmpl    %edx, %ecx
+    cmova   %edx, %ecx
+    subl    %ecx, %edx                  # edx <- remaining bytes to copy
+    rep
+    movsb
+L1:
+    movl    %edx, %ecx
+    andl    $15, %edx
+    shrl    $4, %ecx                    # ecx <- # of DQwords to copy
+    jz      L_CopyBytes
+    addl    $-16, %esp
+    movdqu  %xmm0, (%esp)
+L2:
+    movdqu  (%esi), %xmm0
+    movntdq %xmm0, (%edi)
+    addl    $16, %esi
+    addl    $16, %edi
+    loop    L2
+    mfence
+    movdqu  (%esp),%xmm0
+    addl    $16, %esp                   # stack cleanup
+    jmp     L_CopyBytes
+L_CopyBackward:
+    movl    %eax, %esi                  # esi <- Last byte in Source
+    leal    -1(%edi,%edx,), %edi        # edi <- Last byte in Destination
+    std
+L_CopyBytes:
+    movl    %edx, %ecx
+    rep
+    movsb
+    cld
+    movl    12(%esp), %eax              # eax <- Destination as return value
+    pop     %edi
+    pop     %esi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.asm
index 034918af2f..77fb786d98 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/CopyMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.S
index 276b4ff29f..5e65b9667a 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.S
@@ -1,55 +1,50 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem16.Asm
-#
-# Abstract:
-#
-#   ScanMem16 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem16
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem16 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT16                    Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem16:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    8(%esp), %edi
-    movl    16(%esp), %eax
-    repne   scasw
-    leal    -2(%edi), %eax
-    cmovnz  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem16.Asm
+#
+# Abstract:
+#
+#   ScanMem16 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem16
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem16 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT16                    Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem16:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    8(%esp), %edi
+    movl    16(%esp), %eax
+    repne   scasw
+    leal    -2(%edi), %eax
+    cmovnz  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.asm
index 6b5c81f556..57fab61b77 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem16.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.S
index fced1b2362..5d46ed2bc1 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.S
@@ -1,55 +1,50 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem32.Asm
-#
-# Abstract:
-#
-#   ScanMem32 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem32
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem32 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT32                    Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem32:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    8(%esp), %edi
-    movl    16(%esp), %eax
-    repne   scasl
-    leal    -4(%edi), %eax
-    cmovnz  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem32.Asm
+#
+# Abstract:
+#
+#   ScanMem32 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem32
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem32 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT32                    Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem32:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    8(%esp), %edi
+    movl    16(%esp), %eax
+    repne   scasl
+    leal    -4(%edi), %eax
+    cmovnz  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.asm
index cb0feed6be..6ac857ce16 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem32.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.S
index 37dc3bbf67..3ba69650ab 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.S
@@ -1,64 +1,59 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem64.Asm
-#
-# Abstract:
-#
-#   ScanMem64 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem64
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem64 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT64                    Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem64:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    16(%esp), %eax
-    movl    20(%esp), %edx
-    movl    8(%esp), %edi
-L0:
-    cmpl    (%edi), %eax
-    leal    8(%edi), %edi
-    loopne  L0
-    jne     L1
-    cmpl    -4(%edi), %edx
-    jecxz   L1
-    jne     L0
-L1:
-    leal    -8(%edi), %eax
-    cmovne  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem64.Asm
+#
+# Abstract:
+#
+#   ScanMem64 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem64
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem64 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT64                    Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem64:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    16(%esp), %eax
+    movl    20(%esp), %edx
+    movl    8(%esp), %edi
+L0:
+    cmpl    (%edi), %eax
+    leal    8(%edi), %edi
+    loopne  L0
+    jne     L1
+    cmpl    -4(%edi), %edx
+    jecxz   L1
+    jne     L0
+L1:
+    leal    -8(%edi), %eax
+    cmovne  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.asm
index ee0deddc61..ca54f13738 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem64.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.S
index e7d2a26cad..7a834a5635 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.S
@@ -1,55 +1,50 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ScanMem8.Asm
-#
-# Abstract:
-#
-#   ScanMem8 function
-#
-# Notes:
-#
-#   The following BaseMemoryLib instances share the same version of this file:
-#
-#       BaseMemoryLibRepStr
-#       BaseMemoryLibMmx
-#       BaseMemoryLibSse2
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemScanMem8
-
-#------------------------------------------------------------------------------
-# CONST VOID *
-# EFIAPI
-# InternalMemScanMem8 (
-#   IN      CONST VOID                *Buffer,
-#   IN      UINTN                     Length,
-#   IN      UINT8                     Value
-#   );
-#------------------------------------------------------------------------------
-_InternalMemScanMem8:
-    push    %edi
-    movl    12(%esp), %ecx
-    movl    8(%esp), %edi
-    movb    16(%esp), %al
-    repne   scasb
-    leal    -1(%edi), %eax
-    cmovnz  %ecx, %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ScanMem8.Asm
+#
+# Abstract:
+#
+#   ScanMem8 function
+#
+# Notes:
+#
+#   The following BaseMemoryLib instances share the same version of this file:
+#
+#       BaseMemoryLibRepStr
+#       BaseMemoryLibMmx
+#       BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemScanMem8
+
+#------------------------------------------------------------------------------
+# CONST VOID *
+# EFIAPI
+# InternalMemScanMem8 (
+#   IN      CONST VOID                *Buffer,
+#   IN      UINTN                     Length,
+#   IN      UINT8                     Value
+#   );
+#------------------------------------------------------------------------------
+_InternalMemScanMem8:
+    push    %edi
+    movl    12(%esp), %ecx
+    movl    8(%esp), %edi
+    movb    16(%esp), %al
+    repne   scasb
+    leal    -1(%edi), %eax
+    cmovnz  %ecx, %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.asm
index 97d201abb5..a3f65b64fa 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ScanMem8.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.S
index aa6f59fb4f..86bba889f2 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.S
@@ -1,81 +1,76 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem.asm
-#
-# Abstract:
-#
-#   SetMem function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-    .686:
-    #.MODEL flat,C
-    .xmm:
-    .code:
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  _mem_SetMem (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT8  Value
-#    );
-#------------------------------------------------------------------------------
-.globl _InternalMemSetMem
-_InternalMemSetMem:
-    push    %edi
-    movl    12(%esp), %edx              # edx <- Count
-    movl    8(%esp), %edi               # edi <- Buffer
-    movb    16(%esp), %al               # al <- Value
-    xorl    %ecx, %ecx
-    subl    %edi, %ecx
-    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
-    jz      L0
-    cmpl    %edx, %ecx
-    cmova   %edx, %ecx
-    subl    %ecx, %edx
-    rep
-    stosb
-L0:
-    movl    %edx, %ecx
-    andl    $15, %edx
-    shrl    $4, %ecx                    # ecx <- # of DQwords to set
-    jz      L_SetBytes
-    movb    %al, %ah                    # ax <- Value | (Value << 8)
-    addl    $-16, %esp
-    movdqu  %xmm0, (%esp)
-    movd    %eax, %xmm0
-    pshuflw $0, %xmm0, %xmm0
-    movlhps %xmm0, %xmm0
-L1:
-    movntdq %xmm0, (%edi)
-    addl    $16, %edi
-    loop   L1
-    mfence
-    movdqu  (%esp), %xmm0
-    addl    $16, %esp                   # stack cleanup
-L_SetBytes:
-    movl    %edx, %ecx
-    rep
-    stosb
-    movl    8(%esp), %eax               # eax <- Buffer as return value
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem.asm
+#
+# Abstract:
+#
+#   SetMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+    .686:
+    #.MODEL flat,C
+    .xmm:
+    .code:
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  _mem_SetMem (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT8  Value
+#    );
+#------------------------------------------------------------------------------
+.globl _InternalMemSetMem
+_InternalMemSetMem:
+    push    %edi
+    movl    12(%esp), %edx              # edx <- Count
+    movl    8(%esp), %edi               # edi <- Buffer
+    movb    16(%esp), %al               # al <- Value
+    xorl    %ecx, %ecx
+    subl    %edi, %ecx
+    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
+    jz      L0
+    cmpl    %edx, %ecx
+    cmova   %edx, %ecx
+    subl    %ecx, %edx
+    rep
+    stosb
+L0:
+    movl    %edx, %ecx
+    andl    $15, %edx
+    shrl    $4, %ecx                    # ecx <- # of DQwords to set
+    jz      L_SetBytes
+    movb    %al, %ah                    # ax <- Value | (Value << 8)
+    addl    $-16, %esp
+    movdqu  %xmm0, (%esp)
+    movd    %eax, %xmm0
+    pshuflw $0, %xmm0, %xmm0
+    movlhps %xmm0, %xmm0
+L1:
+    movntdq %xmm0, (%edi)
+    addl    $16, %edi
+    loop   L1
+    mfence
+    movdqu  (%esp), %xmm0
+    addl    $16, %esp                   # stack cleanup
+L_SetBytes:
+    movl    %edx, %ecx
+    rep
+    stosb
+    movl    8(%esp), %eax               # eax <- Buffer as return value
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.asm
index ab89482d6f..a4de29c521 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.S
index fac9a722b0..8ec96a9b6c 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.S
@@ -1,74 +1,69 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem16.asm
-#
-# Abstract:
-#
-#   SetMem16 function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemSetMem16
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  EFIAPI
-#  InternalMemSetMem16 (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT16 Value
-#    )
-#------------------------------------------------------------------------------
-_InternalMemSetMem16:
-    push    %edi
-    movl    12(%esp), %edx
-    movl    8(%esp), %edi
-    xorl    %ecx, %ecx
-    subl    %edi, %ecx
-    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
-    movl    16(%esp), %eax
-    jz      L0
-    shrl    %ecx
-    cmpl    %edx, %ecx
-    cmova   %edx, %ecx
-    subl    %ecx, %edx
-    rep
-    stosw
-L0:
-    movl    %edx, %ecx
-    andl    $7, %edx
-    shrl    $3, %ecx
-    jz      L_SetWords
-    movd    %eax, %xmm0
-    pshuflw $0, %xmm0, %xmm0
-    movlhps %xmm0, %xmm0
-L1:
-    movntdq %xmm0, (%edi)
-    addl    $16, %edi
-    loop    L1
-    mfence
-L_SetWords:
-    movl    %edx, %ecx
-    rep
-    stosw
-    movl    8(%esp), %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem16.asm
+#
+# Abstract:
+#
+#   SetMem16 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemSetMem16
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  EFIAPI
+#  InternalMemSetMem16 (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT16 Value
+#    )
+#------------------------------------------------------------------------------
+_InternalMemSetMem16:
+    push    %edi
+    movl    12(%esp), %edx
+    movl    8(%esp), %edi
+    xorl    %ecx, %ecx
+    subl    %edi, %ecx
+    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
+    movl    16(%esp), %eax
+    jz      L0
+    shrl    %ecx
+    cmpl    %edx, %ecx
+    cmova   %edx, %ecx
+    subl    %ecx, %edx
+    rep
+    stosw
+L0:
+    movl    %edx, %ecx
+    andl    $7, %edx
+    shrl    $3, %ecx
+    jz      L_SetWords
+    movd    %eax, %xmm0
+    pshuflw $0, %xmm0, %xmm0
+    movlhps %xmm0, %xmm0
+L1:
+    movntdq %xmm0, (%edi)
+    addl    $16, %edi
+    loop    L1
+    mfence
+L_SetWords:
+    movl    %edx, %ecx
+    rep
+    stosw
+    movl    8(%esp), %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.asm
index 75abe18b1d..a709899fe2 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem16.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.S
index 8b0095a1e2..f91169a6e0 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.S
@@ -1,73 +1,68 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   SetMem32.asm
-#
-# Abstract:
-#
-#   SetMem32 function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemSetMem32
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  EFIAPI
-#  InternalMemSetMem32 (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count,
-#    IN UINT32 Value
-#    );
-#------------------------------------------------------------------------------
-_InternalMemSetMem32:
-    push    %edi
-    movl    12(%esp), %edx
-    movl    8(%esp), %edi
-    xorl    %ecx, %ecx
-    subl    %edi, %ecx
-    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
-    movl    16(%esp), %eax
-    jz      L0
-    shrl    $2, %ecx
-    cmpl    %edx, %ecx
-    cmova   %edx, %ecx
-    subl    %ecx, %edx
-    rep
-    stosl
-L0:
-    movl    %edx, %ecx
-    andl    $3, %edx
-    shrl    $2, %ecx
-    jz      L_SetDwords
-    movd    %eax, %xmm0
-    pshufd  $0, %xmm0, %xmm0
-L1:
-    movntdq %xmm0, (%edi)
-    addl    $16, %edi
-    loop    L1
-    mfence
-L_SetDwords:
-    movl    %edx, %ecx
-    rep
-    stosl
-    movl    8(%esp), %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   SetMem32.asm
+#
+# Abstract:
+#
+#   SetMem32 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemSetMem32
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  EFIAPI
+#  InternalMemSetMem32 (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count,
+#    IN UINT32 Value
+#    );
+#------------------------------------------------------------------------------
+_InternalMemSetMem32:
+    push    %edi
+    movl    12(%esp), %edx
+    movl    8(%esp), %edi
+    xorl    %ecx, %ecx
+    subl    %edi, %ecx
+    andl    $15, %ecx                   # ecx + edi aligns on 16-byte boundary
+    movl    16(%esp), %eax
+    jz      L0
+    shrl    $2, %ecx
+    cmpl    %edx, %ecx
+    cmova   %edx, %ecx
+    subl    %ecx, %edx
+    rep
+    stosl
+L0:
+    movl    %edx, %ecx
+    andl    $3, %edx
+    shrl    $2, %ecx
+    jz      L_SetDwords
+    movd    %eax, %xmm0
+    pshufd  $0, %xmm0, %xmm0
+L1:
+    movntdq %xmm0, (%edi)
+    addl    $16, %edi
+    loop    L1
+    mfence
+L_SetDwords:
+    movl    %edx, %ecx
+    rep
+    stosl
+    movl    8(%esp), %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.asm
index c12af90e79..99954a5e4b 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem32.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S
index bf42354572..ef9918f0f9 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
 #------------------------------------------------------------------------------
 #
 # Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.asm
index 17f0eb4bea..69406707a6 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.S
index 657584d4df..8b4157f741 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.S
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.S
@@ -1,70 +1,65 @@
-//
-// Include common header file for this module.
-//
-#include "CommonHeader.h"
-
-#------------------------------------------------------------------------------
-#
-# Copyright (c) 2006, Intel Corporation
-# All rights reserved. This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-# Module Name:
-#
-#   ZeroMem.asm
-#
-# Abstract:
-#
-#   ZeroMem function
-#
-# Notes:
-#
-#------------------------------------------------------------------------------
-
-.globl _InternalMemZeroMem
-
-#------------------------------------------------------------------------------
-#  VOID *
-#  EFIAPI
-#  InternalMemZeroMem (
-#    IN VOID   *Buffer,
-#    IN UINTN  Count
-#    );
-#------------------------------------------------------------------------------
-_InternalMemZeroMem:
-    push    %edi
-    movl    8(%esp), %edi
-    movl    12(%esp), %edx
-    xorl    %ecx, %ecx
-    subl    %edi, %ecx
-    xorl    %eax, %eax
-    andl    $15, %ecx
-    jz      L0
-    cmpl    %edx, %ecx
-    cmova   %edx, %ecx
-    subl    %ecx, %edx
-    rep
-    stosb
-L0:
-    movl    %edx, %ecx
-    andl    $15, %edx
-    shrl    $4, %ecx
-    jz      L_ZeroBytes
-    pxor    %xmm0, %xmm0
-L1:
-    movntdq %xmm0, (%edi)
-    addl    $16, %edi
-    loop    L1
-    mfence
-L_ZeroBytes:
-    movl    %edx, %ecx
-    rep
-    stosb
-    movl    8(%esp), %eax
-    pop     %edi
-    ret
+#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+#   ZeroMem.asm
+#
+# Abstract:
+#
+#   ZeroMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+.globl _InternalMemZeroMem
+
+#------------------------------------------------------------------------------
+#  VOID *
+#  EFIAPI
+#  InternalMemZeroMem (
+#    IN VOID   *Buffer,
+#    IN UINTN  Count
+#    );
+#------------------------------------------------------------------------------
+_InternalMemZeroMem:
+    push    %edi
+    movl    8(%esp), %edi
+    movl    12(%esp), %edx
+    xorl    %ecx, %ecx
+    subl    %edi, %ecx
+    xorl    %eax, %eax
+    andl    $15, %ecx
+    jz      L0
+    cmpl    %edx, %ecx
+    cmova   %edx, %ecx
+    subl    %ecx, %edx
+    rep
+    stosb
+L0:
+    movl    %edx, %ecx
+    andl    $15, %edx
+    shrl    $4, %ecx
+    jz      L_ZeroBytes
+    pxor    %xmm0, %xmm0
+L1:
+    movntdq %xmm0, (%edi)
+    addl    $16, %edi
+    loop    L1
+    mfence
+L_ZeroBytes:
+    movl    %edx, %ecx
+    rep
+    stosb
+    movl    8(%esp), %eax
+    pop     %edi
+    ret
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.asm b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.asm
index 294e8ce041..3792c88879 100644
--- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.asm
+++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/ZeroMem.asm
@@ -1,8 +1,3 @@
-//
-// Include common header file for this module.
-//
-
-
 ;------------------------------------------------------------------------------
 ;
 ; Copyright (c) 2006, Intel Corporation
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm
new file mode 100644
index 0000000000..554bc07c64
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/CompareMem.asm
@@ -0,0 +1,52 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CompareMem.Asm
+;
+; Abstract:
+;
+;   CompareMem function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; INTN
+; EFIAPI
+; InternalMemCompareMem (
+;   IN      CONST VOID                *DestinationBuffer,
+;   IN      CONST VOID                *SourceBuffer,
+;   IN      UINTN                     Length
+;   );
+;------------------------------------------------------------------------------
+InternalMemCompareMem   PROC    USES    rsi rdi
+    mov     rsi, rcx
+    mov     rdi, rdx
+    mov     rcx, r8
+    repe    cmpsb
+    movzx   rax, byte ptr [rsi - 1]
+    movzx   rdx, byte ptr [rdi - 1]
+    sub     rax, rdx
+    ret
+InternalMemCompareMem   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm
new file mode 100644
index 0000000000..03ffe0c00f
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/CopyMem.asm
@@ -0,0 +1,79 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   CopyMem.asm
+;
+; Abstract:
+;
+;   CopyMem function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  EFIAPI
+;  InternalMemCopyMem (
+;    IN VOID   *Destination,
+;    IN VOID   *Source,
+;    IN UINTN  Count
+;    );
+;------------------------------------------------------------------------------
+InternalMemCopyMem  PROC    USES    rsi rdi
+    mov     rsi, rdx                    ; rsi <- Source
+    mov     rdi, rcx                    ; rdi <- Destination
+    lea     r9, [rsi + r8 - 1]          ; r9 <- Last byte of Source
+    cmp     rsi, rdi
+    mov     rax, rdi                    ; rax <- Destination as return value
+    jae     @F                          ; Copy forward if Source > Destination
+    cmp     r9, rdi                     ; Overlapped?
+    jae     @CopyBackward               ; Copy backward if overlapped
+@@:
+    xor     rcx, rcx
+    sub     rcx, rdi                    ; rcx <- -rdi
+    and     rcx, 15                     ; rcx + rsi should be 16 bytes aligned
+    jz      @F                          ; skip if rcx == 0
+    cmp     rcx, r8
+    cmova   rcx, r8
+    sub     r8, rcx
+    rep     movsb
+@@:
+    mov     rcx, r8
+    and     r8, 15
+    shr     rcx, 4                      ; rcx <- # of DQwords to copy
+    jz      @CopyBytes
+    movdqa  [rsp + 18h], xmm0           ; save xmm0 on stack
+@@:
+    movdqu  xmm0, [rsi]                 ; rsi may not be 16-byte aligned
+    movntdq [rdi], xmm0                 ; rdi should be 16-byte aligned
+    add     rsi, 16
+    add     rdi, 16
+    loop    @B
+    mfence
+    movdqa  xmm0, [rsp + 18h]           ; restore xmm0
+    jmp     @CopyBytes                  ; copy remaining bytes
+@CopyBackward:
+    mov     rsi, r9                     ; rsi <- Last byte of Source
+    lea     rdi, [rdi + r8 - 1]         ; rdi <- Last byte of Destination
+    std
+@CopyBytes:
+    mov     rcx, r8
+    rep     movsb
+    cld
+    ret
+InternalMemCopyMem  ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm
new file mode 100644
index 0000000000..a2538c2cca
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem16.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem16.Asm
+;
+; Abstract:
+;
+;   ScanMem16 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem16 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT16                    Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem16    PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    mov     rcx, rdx
+    repne   scasw
+    lea     rax, [rdi - 2]
+    cmovnz  rax, rcx
+    ret
+InternalMemScanMem16    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm
new file mode 100644
index 0000000000..e0523d8547
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem32.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem32.Asm
+;
+; Abstract:
+;
+;   ScanMem32 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem32 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT32                    Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem32    PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    mov     rcx, rdx
+    repne   scasd
+    lea     rax, [rdi - 4]
+    cmovnz  rax, rcx
+    ret
+InternalMemScanMem32    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm
new file mode 100644
index 0000000000..0e7e9c782f
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem64.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem64.Asm
+;
+; Abstract:
+;
+;   ScanMem64 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem64 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT64                    Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem64    PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rax, r8
+    mov     rcx, rdx
+    repne   scasq
+    lea     rax, [rdi - 8]
+    cmovnz  rax, rcx
+    ret
+InternalMemScanMem64    ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm
new file mode 100644
index 0000000000..879273f960
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ScanMem8.asm
@@ -0,0 +1,51 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ScanMem8.Asm
+;
+; Abstract:
+;
+;   ScanMem8 function
+;
+; Notes:
+;
+;   The following BaseMemoryLib instances share the same version of this file:
+;
+;       BaseMemoryLibRepStr
+;       BaseMemoryLibMmx
+;       BaseMemoryLibSse2
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+; CONST VOID *
+; EFIAPI
+; InternalMemScanMem8 (
+;   IN      CONST VOID                *Buffer,
+;   IN      UINTN                     Length,
+;   IN      UINT8                     Value
+;   );
+;------------------------------------------------------------------------------
+InternalMemScanMem8 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     rcx, rdx
+    mov     rax, r8
+    repne   scasb
+    lea     rax, [rdi - 1]
+    cmovnz  rax, rcx                    ; set rax to 0 if not found
+    ret
+InternalMemScanMem8 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm
new file mode 100644
index 0000000000..25cfcf0d12
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem.asm
@@ -0,0 +1,69 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem.asm
+;
+; Abstract:
+;
+;   SetMem function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemSetMem (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT8  Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem   PROC    USES    rdi
+    mov     rdi, rcx                    ; rdi <- Buffer
+    mov     al, r8b                     ; al <- Value
+    mov     r9, rdi                     ; r9 <- Buffer as return value
+    xor     rcx, rcx
+    sub     rcx, rdi
+    and     rcx, 15                     ; rcx + rdi aligns on 16-byte boundary
+    jz      @F
+    cmp     rcx, rdx
+    cmova   rcx, rdx
+    sub     rdx, rcx
+    rep     stosb
+@@:
+    mov     rcx, rdx
+    and     rdx, 15
+    shr     rcx, 4
+    jz      @SetBytes
+    mov     ah, al                      ; ax <- Value repeats twice
+    movdqa  [rsp + 10h], xmm0           ; save xmm0
+    movd    xmm0, eax                   ; xmm0[0..16] <- Value repeats twice
+    pshuflw xmm0, xmm0, 0               ; xmm0[0..63] <- Value repeats 8 times
+    movlhps xmm0, xmm0                  ; xmm0 <- Value repeats 16 times
+@@:
+    movntdq [rdi], xmm0                 ; rdi should be 16-byte aligned
+    add     rdi, 16
+    loop    @B
+    mfence
+    movdqa  xmm0, [rsp + 10h]           ; restore xmm0
+@SetBytes:
+    mov     ecx, edx                    ; high 32 bits of rcx are always zero
+    rep     stosb
+    mov     rax, r9                     ; rax <- Return value
+    ret
+InternalMemSetMem   ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm
new file mode 100644
index 0000000000..77b8cf43aa
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem16.asm
@@ -0,0 +1,67 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem16.asm
+;
+; Abstract:
+;
+;   SetMem16 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemSetMem16 (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT16 Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem16 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     r9, rdi
+    xor     rcx, rcx
+    sub     rcx, rdi
+    and     rcx, 15
+    mov     rax, r8
+    jz      @F
+    shr     rcx, 1
+    cmp     rcx, rdx
+    cmova   rcx, rdx
+    sub     rdx, rcx
+    rep     stosw
+@@:
+    mov     rcx, rdx
+    and     edx, 7
+    shr     rcx, 3
+    jz      @SetWords
+    movd    xmm0, eax
+    pshuflw xmm0, xmm0, 0
+    movlhps xmm0, xmm0
+@@:
+    movntdq [rdi], xmm0
+    add     rdi, 16
+    loop    @B
+    mfence
+@SetWords:
+    mov     ecx, edx
+    rep     stosw
+    mov     rax, r9
+    ret
+InternalMemSetMem16 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm
new file mode 100644
index 0000000000..eba29bb88d
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem32.asm
@@ -0,0 +1,66 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem32.asm
+;
+; Abstract:
+;
+;   SetMem32 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemSetMem32 (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT8  Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem32 PROC    USES    rdi
+    mov     rdi, rcx
+    mov     r9, rdi
+    xor     rcx, rcx
+    sub     rcx, rdi
+    and     rcx, 15
+    mov     rax, r8
+    jz      @F
+    shr     rcx, 2
+    cmp     rcx, rdx
+    cmova   rcx, rdx
+    sub     rdx, rcx
+    rep     stosd
+@@:
+    mov     rcx, rdx
+    and     edx, 3
+    shr     rcx, 2
+    jz      @SetDwords
+    movd    xmm0, eax
+    pshufd  xmm0, xmm0, 0
+@@:
+    movntdq [rdi], xmm0
+    add     rdi, 16
+    loop    @B
+    mfence
+@SetDwords:
+    mov     ecx, edx
+    rep     stosd
+    mov     rax, r9
+    ret
+InternalMemSetMem32 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm
new file mode 100644
index 0000000000..a26b9412d4
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/SetMem64.asm
@@ -0,0 +1,59 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   SetMem64.asm
+;
+; Abstract:
+;
+;   SetMem64 function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemSetMem64 (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count,
+;    IN UINT64 Value
+;    )
+;------------------------------------------------------------------------------
+InternalMemSetMem64 PROC
+    mov     rax, rcx                    ; rax <- Buffer
+    xchg    rcx, rdx                    ; rcx <- Count & rdx <- Buffer
+    test    dl, 8
+    movd    xmm0, r8
+    jz      @F
+    mov     [rdx], r8
+    add     rdx, 8
+    dec     rcx
+@@:
+    shr     rcx, 1
+    jz      @SetQwords
+    movlhps xmm0, xmm0
+@@:
+    movntdq [rdx], xmm0
+    lea     rdx, [rdx + 16]
+    loop    @B
+    mfence
+@SetQwords:
+    jnc     @F
+    mov     [rdx], r8
+@@:
+    ret
+InternalMemSetMem64 ENDP
+
+    END
diff --git a/MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm b/MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm
new file mode 100644
index 0000000000..7eebd3a8ef
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibSse2/x64/ZeroMem.asm
@@ -0,0 +1,63 @@
+;------------------------------------------------------------------------------
+;
+; Copyright (c) 2006, Intel Corporation
+; All rights reserved. This program and the accompanying materials
+; are licensed and made available under the terms and conditions of the BSD License
+; which accompanies this distribution.  The full text of the license may be found at
+; http://opensource.org/licenses/bsd-license.php
+;
+; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+;
+; Module Name:
+;
+;   ZeroMem.asm
+;
+; Abstract:
+;
+;   ZeroMem function
+;
+; Notes:
+;
+;------------------------------------------------------------------------------
+
+    .code
+
+;------------------------------------------------------------------------------
+;  VOID *
+;  InternalMemZeroMem (
+;    IN VOID   *Buffer,
+;    IN UINTN  Count
+;    )
+;------------------------------------------------------------------------------
+InternalMemZeroMem  PROC    USES    rdi
+    mov     rdi, rcx
+    xor     rcx, rcx
+    xor     eax, eax
+    sub     rcx, rdi
+    and     rcx, 15
+    mov     r8, rdi
+    jz      @F
+    cmp     rcx, rdx
+    cmova   rcx, rdx
+    sub     rdx, rcx
+    rep     stosb
+@@:
+    mov     rcx, rdx
+    and     edx, 15
+    shr     rcx, 4
+    jz      @ZeroBytes
+    pxor    xmm0, xmm0
+@@:
+    movntdq [rdi], xmm0                 ; rdi should be 16-byte aligned
+    add     rdi, 16
+    loop    @B
+    mfence
+@ZeroBytes:
+    mov     ecx, edx
+    rep     stosb
+    mov     rax, r8
+    ret
+InternalMemZeroMem  ENDP
+
+    END
diff --git a/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf b/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
index e90d5da488..bcebb4dac0 100644
--- a/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+++ b/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
@@ -1,7 +1,7 @@
 #/** @file
 # Runtime driver library
 #
-# Instance of runtime driver library, Hook VitualAddressChange and 
+# Instance of runtime driver library, Hook VitualAddressChange and
 #  BooterviceExit event and provide runtime service.
 # Copyright (c) 2006 - 2007, Intel Corporation.
 #
@@ -22,11 +22,11 @@
 ################################################################################
 [Defines]
   INF_VERSION                    = 0x00010005
-  BASE_NAME                      = EdkUefiRuntimeLib
+  BASE_NAME                      = UefiRuntimeLib
   FILE_GUID                      = b1ee6c28-54aa-4d17-b705-3e28ccb27b2e
   MODULE_TYPE                    = DXE_RUNTIME_DRIVER
   VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = UefiRuntimeLib|DXE_RUNTIME_DRIVER DXE_SAL_DRIVER 
+  LIBRARY_CLASS                  = UefiRuntimeLib|DXE_RUNTIME_DRIVER DXE_SAL_DRIVER
   EDK_RELEASE_VERSION            = 0x00020000
   EFI_SPECIFICATION_VERSION      = 0x00020000
 
@@ -36,7 +36,7 @@
 #
 # The following information is for reference only and not required by the build tools.
 #
-#  VALID_ARCHITECTURES           = IA32 X64 EBC
+  VALID_ARCHITECTURES           = IA32 X64 EBC
 #
 
 ################################################################################
diff --git a/MdePkg/MdePkg.dsc b/MdePkg/MdePkg.dsc
index d109164c24..6067d4086e 100644
--- a/MdePkg/MdePkg.dsc
+++ b/MdePkg/MdePkg.dsc
@@ -100,7 +100,7 @@
   ${WORKSPACE}/MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
 #  ${WORKSPACE}/MdePkg/Library/DxeSmbusLib/DxeSmbusLib.inf
   ${WORKSPACE}/MdePkg/Library/PeiCoreEntryPoint/PeiCoreEntryPoint.inf
-#  ${WORKSPACE}/MdePkg/Library/PeiHobLib/PeiHobLib.inf
+  ${WORKSPACE}/MdePkg/Library/PeiHobLib/PeiHobLib.inf
   ${WORKSPACE}/MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf
   ${WORKSPACE}/MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
   ${WORKSPACE}/MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
@@ -108,7 +108,6 @@
   ${WORKSPACE}/MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
   ${WORKSPACE}/MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
 #  ${WORKSPACE}/MdePkg/Library/PeiSmbusLib/PeiSmbusLib.inf
-  ${WORKSPACE}/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
   ${WORKSPACE}/MdePkg/Library/SerialPortLibNull/SerialPortLibNull.inf
   ${WORKSPACE}/MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
   ${WORKSPACE}/MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf
@@ -118,7 +117,6 @@
   ${WORKSPACE}/MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
   ${WORKSPACE}/MdePkg/Library/UefiDriverEntryPoint/UefiDriverEntryPoint.inf
   ${WORKSPACE}/MdePkg/Library/UefiLib/UefiLib.inf
-  ${WORKSPACE}/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
   ${WORKSPACE}/MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf
   ${WORKSPACE}\MdePkg\Library/UefiScsiLib/UefiScsiLib.inf
 
@@ -126,9 +124,14 @@
 [Components.IA32]
   ${WORKSPACE}\MdePkg\Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf
   ${WORKSPACE}\MdePkg\Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf
+  ${WORKSPACE}/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+  ${WORKSPACE}/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
 
 [Components.X64]
   ${WORKSPACE}\MdePkg\Library/BaseMemoryLibSse2/BaseMemoryLibSse2.inf
   ${WORKSPACE}\MdePkg\Library/BaseMemoryLibRepStr/BaseMemoryLibRepStr.inf
+  ${WORKSPACE}/MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
+  ${WORKSPACE}/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf
 
-
+[Components.IPF]
+  ${WORKSPACE}/MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf