Blob Blame Raw
Patch carried over from the prior iasl package and updated.  This allows
for builds on big endian systems and cleans up endianness.  Please see
http://lists.acpica.org/pipermail/devel/2010-July/000159.html.  Resolves
BZ#865013 and BZ#856856.
--

Support compiling DSDT tables on big endian architectures.

use the ACPI_MOVE_<N>_TO_<M> macros to swap the data written to the AML file on
big endian architectures (the macros themselves required a few fixes to work
correctly).
In some areas the use of temporary variables was necessary to be able to perform
sanity checks on the data before actually swapping the bytes.

Signed-off-by: Mattia Dongili <malattia@linux.it>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 source/compiler/aslcodegen.c      | 108 +++++++++++++++++-------------
 source/compiler/aslopcodes.c      |   4 +-
 source/compiler/aslrestype1.c     |  69 ++++++++++++++------
 source/compiler/aslrestype1i.c    |  38 +++++++----
 source/compiler/aslrestype2.c     |  25 ++++---
 source/compiler/aslrestype2d.c    | 134 +++++++++++++++++++++-----------------
 source/compiler/aslrestype2e.c    | 117 +++++++++++++++++++++++----------
 source/compiler/aslrestype2q.c    | 117 +++++++++++++++++++++------------
 source/compiler/aslrestype2s.c    |  86 +++++++++++++++++-------
 source/compiler/aslrestype2w.c    | 127 +++++++++++++++++++++---------------
 source/include/acmacros.h         |  15 +++--
 source/include/platform/aclinux.h |   7 +-
 12 file modificati, 541 inserzioni(+), 306 rimozioni(-)

diff --git a/source/compiler/aslcodegen.c b/source/compiler/aslcodegen.c
index 2252ab4..c3c3e06 100644
--- a/source/compiler/aslcodegen.c
+++ b/source/compiler/aslcodegen.c
@@ -238,16 +238,12 @@ CgWriteAmlOpcode (
     ACPI_PARSE_OBJECT       *Op)
 {
     UINT8                   PkgLenFirstByte;
-    UINT32                  i;
-    union {
-        UINT16                  Opcode;
-        UINT8                   OpcodeBytes[2];
-    } Aml;
-    union {
-        UINT32                  Len;
-        UINT8                   LenBytes[4];
-    } PkgLen;
-
+    UINT8                   Byte;
+    UINT16                  Word;
+    UINT32                  DWord;
+    UINT64                  QWord;
+    UINT16                  AmlOpcode;
+    UINT32                  PkgLen;
 
     /* We expect some DEFAULT_ARGs, just ignore them */
 
@@ -270,51 +266,52 @@
 
         /* Special opcodes for within a field definition */
 
-        Aml.Opcode = AML_FIELD_OFFSET_OP;
+        AmlOpcode = AML_FIELD_OFFSET_OP;
         break;
 
     case AML_INT_ACCESSFIELD_OP:
 
-        Aml.Opcode = AML_FIELD_ACCESS_OP;
+        AmlOpcode = AML_FIELD_ACCESS_OP;
         break;
 
     case AML_INT_CONNECTION_OP:
 
-        Aml.Opcode = AML_FIELD_CONNECTION_OP;
+        AmlOpcode = AML_FIELD_CONNECTION_OP;
         break;
 
     default:
 
-        Aml.Opcode = Op->Asl.AmlOpcode;
+        AmlOpcode = Op->Asl.AmlOpcode;
         break;
     }
 
 
-    switch (Aml.Opcode)
+    switch (AmlOpcode)
     {
     case AML_PACKAGE_LENGTH:
 
         /* Value is the length to be encoded (Used in field definitions) */
 
-        PkgLen.Len = (UINT32) Op->Asl.Value.Integer;
+        PkgLen = (UINT32) Op->Asl.Value.Integer;
         break;
 
     default:
 
         /* Check for two-byte opcode */
 
-        if (Aml.Opcode > 0x00FF)
+        if (AmlOpcode > 0x00FF)
         {
             /* Write the high byte first */
-
-            CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[1], 1);
+	    Byte = ACPI_HIBYTE(AmlOpcode);
+	    CgLocalWriteAmlData (Op, &Byte, 1);
         }
 
-        CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[0], 1);
+	Byte = ACPI_LOBYTE(AmlOpcode);
+        CgLocalWriteAmlData (Op, &Byte, 1);
 
         /* Subtreelength doesn't include length of package length bytes */
 
-        PkgLen.Len = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes;
+        PkgLen = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes;
         break;
     }
 
@@ -325,8 +321,8 @@ CgWriteAmlOpcode (
         if (Op->Asl.AmlPkgLenBytes == 1)
         {
             /* Simplest case -- no bytes to follow, just write the count */
-
-            CgLocalWriteAmlData (Op, &PkgLen.LenBytes[0], 1);
+            Byte = ACPI_LOBYTE(PkgLen);
+            CgLocalWriteAmlData (Op, &Byte, 1);
         }
         else if (Op->Asl.AmlPkgLenBytes != 0)
         {
@@ -336,7 +332,7 @@ CgWriteAmlOpcode (
              */
             PkgLenFirstByte = (UINT8)
                 (((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) |
-                (PkgLen.LenBytes[0] & 0x0F));
+                (PkgLen & 0x0F));
 
             CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1);
 
@@ -344,37 +340,44 @@ CgWriteAmlOpcode (
              * Shift the length over by the 4 bits we just stuffed
              * in the first byte
              */
-            PkgLen.Len >>= 4;
+            PkgLen >>= 4;
 
             /* Now we can write the remaining bytes - either 1, 2, or 3 bytes */
-
-            for (i = 0; i < (UINT32) (Op->Asl.AmlPkgLenBytes - 1); i++)
+            Byte = ACPI_LOBYTE(PkgLen);
+            CgLocalWriteAmlData (Op, &Byte, 1);
+            if (Op->Asl.AmlPkgLenBytes >= 3)
+            {
+                Byte = ACPI_HIBYTE(PkgLen);
+                CgLocalWriteAmlData (Op, &Byte, 1);
+            }
+            if (Op->Asl.AmlPkgLenBytes >= 4)
             {
-                CgLocalWriteAmlData (Op, &PkgLen.LenBytes[i], 1);
+                Byte = ACPI_LOBYTE(ACPI_HIWORD(PkgLen));
+                CgLocalWriteAmlData (Op, &Byte, 1);
             }
         }
     }
 
-    switch (Aml.Opcode)
+    switch (AmlOpcode)
     {
     case AML_BYTE_OP:
-
-        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 1);
+        Byte = (UINT8) Op->Asl.Value.Integer;
+        CgLocalWriteAmlData (Op, &Byte, 1);
         break;
 
     case AML_WORD_OP:
-
-        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 2);
+        ACPI_MOVE_64_TO_16(&Word, &Op->Asl.Value.Integer);
+        CgLocalWriteAmlData (Op, &Word, 2);
        break;
 
     case AML_DWORD_OP:
-
-        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 4);
+        ACPI_MOVE_64_TO_32(&DWord, &Op->Asl.Value.Integer);
+        CgLocalWriteAmlData (Op, &DWord, 4);
         break;
 
     case AML_QWORD_OP:
-
-        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 8);
+        ACPI_MOVE_64_TO_64(&QWord, &Op->Asl.Value.Integer);
+        CgLocalWriteAmlData (Op, &QWord, 8);
         break;
 
     case AML_STRING_OP:
@@ -408,6 +409,7 @@ CgWriteTableHeader (
     ACPI_PARSE_OBJECT       *Op)
 {
     ACPI_PARSE_OBJECT       *Child;
+    UINT32 DWord;
 
 
     /* AML filename */
@@ -444,7 +446,7 @@ CgWriteTableHeader (
     /* OEM Revision */
 
     Child = Child->Asl.Next;
-    TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer;
+    ACPI_MOVE_64_TO_32(&TableHeader.OemRevision, &Child->Asl.Value.Integer);
 
     /* Compiler ID */
 
@@ -452,11 +453,12 @@ CgWriteTableHeader (
 
     /* Compiler version */
 
-    TableHeader.AslCompilerRevision = ASL_REVISION;
+    DWord = ASL_REVISION;
+    ACPI_MOVE_32_TO_32(&TableHeader.AslCompilerRevision, &DWord);
 
     /* Table length. Checksum zero for now, will rewrite later */
 
-    TableHeader.Length   = Gbl_TableLength;
+    ACPI_MOVE_32_TO_32(&TableHeader.Length, &Gbl_TableLength);
     TableHeader.Checksum = 0;
 
     CgLocalWriteAmlData (Op, &TableHeader, sizeof (ACPI_TABLE_HEADER));
@@ -520,7 +523,10 @@ CgWriteNode (
     ACPI_PARSE_OBJECT       *Op)
 {
     ASL_RESOURCE_NODE       *Rnode;
-
+    UINT8                   Byte;
+    UINT16                  Word;
+    UINT32                  DWord;
+    UINT64                  QWord;
 
     /* Always check for DEFAULT_ARG and other "Noop" nodes */
     /* TBD: this may not be the best place for this check */
@@ -538,13 +544,24 @@ CgWriteNode (
     switch (Op->Asl.AmlOpcode)
     {
     case AML_RAW_DATA_BYTE:
+        Byte = (UINT8) Op->Asl.Value.Integer;
+        CgLocalWriteAmlData (Op, &Byte, 1);
+        return;
+
     case AML_RAW_DATA_WORD:
-    case AML_RAW_DATA_DWORD:
-    case AML_RAW_DATA_QWORD:
+        ACPI_MOVE_64_TO_16(&Word, &Op->Asl.Value.Integer);
+        CgLocalWriteAmlData (Op, &Word, 2);
+        return;
 
-        CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, Op->Asl.AmlLength);
+    case AML_RAW_DATA_DWORD:
+        ACPI_MOVE_64_TO_32(&DWord, &Op->Asl.Value.Integer);
+        CgLocalWriteAmlData (Op, &DWord, 4);
         return;
 
+    case AML_RAW_DATA_QWORD:
+        ACPI_MOVE_64_TO_64(&QWord, &Op->Asl.Value.Integer);
+        CgLocalWriteAmlData (Op, &QWord, 8);
+        return;
 
     case AML_RAW_DATA_BUFFER:
 
diff --git a/source/compiler/aslopcodes.c b/source/compiler/aslopcodes.c
index cddc945..6deddc9 100644
--- a/source/compiler/aslopcodes.c
+++ b/source/compiler/aslopcodes.c
@@ -476,6 +475,7 @@ OpcDoUnicode (
     UINT32                  i;
     UINT8                   *AsciiString;
     UINT16                  *UnicodeString;
+    UINT16                  UChar;
     ACPI_PARSE_OBJECT       *BufferLengthOp;
 
 
@@ -502,7 +502,8 @@ OpcDoUnicode (
 
     for (i = 0; i < Count; i++)
     {
-        UnicodeString[i] = (UINT16) AsciiString[i];
+        UChar = (UINT16) AsciiString[i];
+        ACPI_MOVE_16_TO_16(&UnicodeString[i], &UChar);
     }
 
     /*
diff --git a/source/compiler/aslrestype1.c b/source/compiler/aslrestype1.c
index 5b92151..b1fa5f5 100644
--- a/source/compiler/aslrestype1.c
+++ b/source/compiler/aslrestype1.c
@@ -152,6 +152,11 @@ RsDoMemory24Descriptor (
     ACPI_PARSE_OBJECT       *MaxOp = NULL;
     ACPI_PARSE_OBJECT       *LengthOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  Minimum = 0;
+    UINT16                  Maximum = 0;
+    UINT16                  AddressLength = 0;
+    UINT16                  Alignment = 0;
+    UINT16                  ResourceLength;
     UINT32                  i;
 
 
@@ -160,7 +165,8 @@ RsDoMemory24Descriptor (
 
     Descriptor = Rnode->Buffer;
     Descriptor->Memory24.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY24;
-    Descriptor->Memory24.ResourceLength = 9;
+    ResourceLength = 9;
+    ACPI_MOVE_16_TO_16(&Descriptor->Memory24.ResourceLength, &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -177,7 +183,7 @@ RsDoMemory24Descriptor (
 
         case 1: /* Min Address */
 
-            Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum));
             MinOp = InitializerOp;
@@ -185,7 +191,7 @@ RsDoMemory24Descriptor (
 
         case 2: /* Max Address */
 
-            Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum));
             MaxOp = InitializerOp;
@@ -193,14 +199,14 @@ RsDoMemory24Descriptor (
 
         case 3: /* Alignment */
 
-            Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer;
+            Alignment = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment));
             break;
 
         case 4: /* Length */
 
-            Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength));
             LengthOp = InitializerOp;
@@ -223,12 +229,17 @@ RsDoMemory24Descriptor (
     /* Validate the Min/Max/Len/Align values (Alignment==0 means 64K) */
 
     RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY24,
-        Descriptor->Memory24.Minimum,
-        Descriptor->Memory24.Maximum,
-        Descriptor->Memory24.AddressLength,
-        Descriptor->Memory24.Alignment,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Alignment,
         MinOp, MaxOp, LengthOp, NULL, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Memory24.Minimum, &Minimum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Memory24.Maximum, &Maximum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Memory24.AddressLength, &AddressLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Memory24.Alignment, &Alignment);
+
     return (Rnode);
 }
 
@@ -259,6 +270,11 @@ RsDoMemory32Descriptor (
     ACPI_PARSE_OBJECT       *LengthOp = NULL;
     ACPI_PARSE_OBJECT       *AlignOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT32                  Minimum = 0;
+    UINT32                  Maximum = 0;
+    UINT32                  AddressLength = 0;
+    UINT32                  Alignment = 0;
+    UINT16                  ResourceLength;
     UINT32                  i;
 
 
@@ -267,7 +283,8 @@ RsDoMemory32Descriptor (
 
     Descriptor = Rnode->Buffer;
     Descriptor->Memory32.DescriptorType  = ACPI_RESOURCE_NAME_MEMORY32;
-    Descriptor->Memory32.ResourceLength = 17;
+    ResourceLength = 17;
+    ACPI_MOVE_16_TO_16(&Descriptor->Memory32.ResourceLength, &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -284,7 +301,7 @@ RsDoMemory32Descriptor (
 
         case 1:  /* Min Address */
 
-            Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum));
             MinOp = InitializerOp;
@@ -292,7 +309,7 @@ RsDoMemory32Descriptor (
 
         case 2: /* Max Address */
 
-            Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum));
             MaxOp = InitializerOp;
@@ -300,7 +317,7 @@ RsDoMemory32Descriptor (
 
         case 3: /* Alignment */
 
-            Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer;
+            Alignment = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment));
             AlignOp = InitializerOp;
@@ -308,7 +325,7 @@ RsDoMemory32Descriptor (
 
         case 4: /* Length */
 
-            Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength));
             LengthOp = InitializerOp;
@@ -331,12 +348,17 @@ RsDoMemory32Descriptor (
     /* Validate the Min/Max/Len/Align values */
 
     RsSmallAddressCheck (ACPI_RESOURCE_NAME_MEMORY32,
-        Descriptor->Memory32.Minimum,
-        Descriptor->Memory32.Maximum,
-        Descriptor->Memory32.AddressLength,
-        Descriptor->Memory32.Alignment,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Alignment,
         MinOp, MaxOp, LengthOp, AlignOp, Op);
 
+    ACPI_MOVE_32_TO_32(&Descriptor->Memory32.Minimum, &Minimum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Memory32.Maximum, &Maximum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Memory32.AddressLength, &AddressLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Memory32.Alignment, &Alignment);
+
     return (Rnode);
 }
 
@@ -363,6 +385,7 @@ RsDoMemory32FixedDescriptor (
     AML_RESOURCE            *Descriptor;
     ACPI_PARSE_OBJECT       *InitializerOp;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  ResourceLength;
     UINT32                  i;
 
 
@@ -371,7 +394,8 @@ RsDoMemory32FixedDescriptor (
 
     Descriptor = Rnode->Buffer;
     Descriptor->FixedMemory32.DescriptorType  = ACPI_RESOURCE_NAME_FIXED_MEMORY32;
-    Descriptor->FixedMemory32.ResourceLength = 9;
+    ResourceLength = 9;
+    ACPI_MOVE_16_TO_16(&Descriptor->FixedMemory32.ResourceLength, &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -388,14 +412,16 @@ RsDoMemory32FixedDescriptor (
 
         case 1: /* Address */
 
-            Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer;
+            ACPI_MOVE_64_TO_32(&Descriptor->FixedMemory32.Address,
+                &InitializerOp->Asl.Value.Integer);
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address));
             break;
 
         case 2: /* Length */
 
-            Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
+            ACPI_MOVE_64_TO_32(&Descriptor->FixedMemory32.AddressLength,
+                &InitializerOp->Asl.Value.Integer);
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength));
             break;
diff --git a/source/compiler/aslrestype1i.c b/source/compiler/aslrestype1i.c
index 8335e8f..097eb05 100644
--- a/source/compiler/aslrestype1i.c
+++ b/source/compiler/aslrestype1i.c
@@ -202,6 +202,8 @@ RsDoFixedDmaDescriptor (
     AML_RESOURCE            *Descriptor;
     ACPI_PARSE_OBJECT       *InitializerOp;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  RequestLines = 0;
+    UINT16                  Channels = 0;
     UINT32                  i;
 
 
@@ -220,14 +222,14 @@ RsDoFixedDmaDescriptor (
         {
         case 0: /* DMA Request Lines [WORD] (_DMA) */
 
-            Descriptor->FixedDma.RequestLines = (UINT16) InitializerOp->Asl.Value.Integer;
+            RequestLines = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_DMA,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.RequestLines));
             break;
 
         case 1: /* DMA Channel [WORD] (_TYP) */
 
-            Descriptor->FixedDma.Channels = (UINT16) InitializerOp->Asl.Value.Integer;
+            Channels = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_DMATYPE,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedDma.Channels));
             break;
@@ -252,6 +253,9 @@ RsDoFixedDmaDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
+    ACPI_MOVE_16_TO_16(&Descriptor->FixedDma.RequestLines, &RequestLines);
+    ACPI_MOVE_16_TO_16(&Descriptor->FixedDma.Channels, &Channels);
+
     return (Rnode);
 }
 
@@ -279,6 +283,7 @@ RsDoFixedIoDescriptor (
     ACPI_PARSE_OBJECT       *InitializerOp;
     ACPI_PARSE_OBJECT       *AddressOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  Address = 0;
     UINT32                  i;
 
 
@@ -297,8 +302,7 @@ RsDoFixedIoDescriptor (
         {
         case 0: /* Base Address */
 
-            Descriptor->FixedIo.Address =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Address = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address));
             AddressOp = InitializerOp;
@@ -328,11 +332,13 @@ RsDoFixedIoDescriptor (
 
     /* Error checks */
 
-    if (Descriptor->FixedIo.Address > 0x03FF)
+    if (Address > 0x03FF)
     {
         AslError (ASL_WARNING, ASL_MSG_ISA_ADDRESS, AddressOp, NULL);
     }
 
+    ACPI_MOVE_16_TO_16(&Descriptor->FixedIo.Address, &Address);
+
     return (Rnode);
 }
 
@@ -363,6 +369,8 @@ RsDoIoDescriptor (
     ACPI_PARSE_OBJECT       *LengthOp = NULL;
     ACPI_PARSE_OBJECT       *AlignOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  Minimum = 0;
+    UINT16                  Maximum = 0;
     UINT32                  i;
 
 
@@ -388,8 +396,7 @@ RsDoIoDescriptor (
 
         case 1:  /* Min Address */
 
-            Descriptor->Io.Minimum =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum));
             MinOp = InitializerOp;
@@ -397,8 +404,7 @@ RsDoIoDescriptor (
 
         case 2: /* Max Address */
 
-            Descriptor->Io.Maximum =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum));
             MaxOp = InitializerOp;
@@ -439,12 +445,15 @@ RsDoIoDescriptor (
     /* Validate the Min/Max/Len/Align values */
 
     RsSmallAddressCheck (ACPI_RESOURCE_NAME_IO,
-        Descriptor->Io.Minimum,
-        Descriptor->Io.Maximum,
+        Minimum,
+        Maximum,
         Descriptor->Io.AddressLength,
         Descriptor->Io.Alignment,
         MinOp, MaxOp, LengthOp, AlignOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Io.Minimum, &Minimum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Io.Maximum, &Maximum);
+
     return (Rnode);
 }
 
@@ -565,9 +574,9 @@ RsDoIrqDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
-    /* Now we can set the channel mask */
+    /* Now we can set the interrupt mask */
 
-    Descriptor->Irq.IrqMask = IrqMask;
+    ACPI_MOVE_16_TO_16(&Descriptor->Irq.IrqMask, &IrqMask);
     return (Rnode);
 }
 
@@ -667,6 +676,6 @@ RsDoIrqNoFlagsDescriptor (
 
     /* Now we can set the interrupt mask */
 
-    Descriptor->Irq.IrqMask = IrqMask;
+    ACPI_MOVE_16_TO_16(&Descriptor->Irq.IrqMask, &IrqMask);
     return (Rnode);
 }
diff --git a/source/compiler/aslrestype2.c b/source/compiler/aslrestype2.c
index f0de854..b6d8d1d 100644
--- a/source/compiler/aslrestype2.c
+++ b/source/compiler/aslrestype2.c
@@ -79,6 +79,7 @@ RsDoGeneralRegisterDescriptor (
     AML_RESOURCE            *Descriptor;
     ACPI_PARSE_OBJECT       *InitializerOp;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  ResourceLength;
     UINT32                  i;
 
 
@@ -87,7 +88,9 @@ RsDoGeneralRegisterDescriptor (
 
     Descriptor = Rnode->Buffer;
     Descriptor->GenericReg.DescriptorType = ACPI_RESOURCE_NAME_GENERIC_REGISTER;
-    Descriptor->GenericReg.ResourceLength = 12;
+    ResourceLength = 12;
+    ACPI_MOVE_16_TO_16(&Descriptor->GenericReg.ResourceLength,
+		    &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -118,7 +121,8 @@ RsDoGeneralRegisterDescriptor (
 
         case 3: /* Register Address */
 
-            Descriptor->GenericReg.Address = InitializerOp->Asl.Value.Integer;
+	    ACPI_MOVE_64_TO_64(&Descriptor->GenericReg.Address,
+			    &InitializerOp->Asl.Value.Integer);
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_ADDRESS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address));
             break;
@@ -176,6 +180,7 @@ RsDoInterruptDescriptor (
     AML_RESOURCE            *Rover = NULL;
     ACPI_PARSE_OBJECT       *InitializerOp;
     ASL_RESOURCE_NODE       *Rnode;
+    UINT16                  ResourceLength = 0;
     UINT16                  StringLength = 0;
     UINT32                  OptionIndex = 0;
     UINT32                  i;
@@ -222,7 +227,7 @@ RsDoInterruptDescriptor (
      * Initial descriptor length -- may be enlarged if there are
      * optional fields present
      */
-    Descriptor->ExtendedIrq.ResourceLength  = 2;  /* Flags and table length byte */
+    ResourceLength  = 2;  /* Flags and table length byte */
     Descriptor->ExtendedIrq.InterruptCount  = 0;
 
     Rover = ACPI_CAST_PTR (AML_RESOURCE,
@@ -330,10 +335,11 @@ RsDoInterruptDescriptor (
 
             /* Save the integer and move pointer to the next one */
 
-            Rover->DwordItem = (UINT32) InitializerOp->Asl.Value.Integer;
+            ACPI_MOVE_64_TO_32(&Rover->DwordItem,
+                &InitializerOp->Asl.Value.Integer);
             Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->DwordItem), 4);
             Descriptor->ExtendedIrq.InterruptCount++;
-            Descriptor->ExtendedIrq.ResourceLength += 4;
+            ResourceLength += 4;
 
             /* Case 7: First interrupt number in list */
 
@@ -369,7 +376,7 @@ RsDoInterruptDescriptor (
     {
         Rover->ByteItem = ResSourceIndex;
         Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->ByteItem), 1);
-        Descriptor->ExtendedIrq.ResourceLength += 1;
+        ResourceLength += 1;
     }
 
     /* Add optional ResSource string if present */
@@ -381,13 +387,14 @@ RsDoInterruptDescriptor (
         Rover = ACPI_ADD_PTR (
                     AML_RESOURCE, &(Rover->ByteItem), StringLength);
 
-        Descriptor->ExtendedIrq.ResourceLength = (UINT16)
-            (Descriptor->ExtendedIrq.ResourceLength + StringLength);
+        ResourceLength = (UINT16) (ResourceLength + StringLength);
     }
 
     Rnode->BufferLength = (ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]) -
                            ASL_RESDESC_OFFSET (ExtendedIrq.DescriptorType))
                            + OptionIndex + StringLength;
+    ACPI_MOVE_16_TO_16(&Descriptor->ExtendedIrq.ResourceLength,
+		    &ResourceLength);
     return (Rnode);
 }
 
@@ -438,7 +445,7 @@ RsDoVendorLargeDescriptor (
 
     Descriptor = Rnode->Buffer;
     Descriptor->VendorLarge.DescriptorType  = ACPI_RESOURCE_NAME_VENDOR_LARGE;
-    Descriptor->VendorLarge.ResourceLength = (UINT16) i;
+    ACPI_MOVE_32_TO_16(&Descriptor->VendorLarge.ResourceLength, &i);
 
     /* Point to end-of-descriptor for vendor data */
 
diff --git a/source/compiler/aslrestype2d.c b/source/compiler/aslrestype2d.c
index 1ca0f2d..5bebd30 100644
--- a/source/compiler/aslrestype2d.c
+++ b/source/compiler/aslrestype2d.c
@@ -83,7 +83,13 @@ RsDoDwordIoDescriptor (
     ACPI_PARSE_OBJECT       *GranOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT32                  Minimum = 0;
+    UINT32                  Maximum = 0;
+    UINT32                  AddressLength = 0;
+    UINT32                  Granularity = 0;
+    UINT32                  TranslationOffset = 0;
     UINT8                   *OptionalFields;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
@@ -104,8 +110,7 @@ RsDoDwordIoDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
-    Descriptor->Address32.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS32) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS32) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -149,8 +154,7 @@ RsDoDwordIoDescriptor (
 
         case 5: /* Address Granularity */
 
-            Descriptor->Address32.Granularity =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Granularity = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
             GranOp = InitializerOp;
@@ -158,8 +162,7 @@ RsDoDwordIoDescriptor (
 
         case 6: /* Address Min */
 
-            Descriptor->Address32.Minimum =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
             MinOp = InitializerOp;
@@ -167,8 +170,7 @@ RsDoDwordIoDescriptor (
 
         case 7: /* Address Max */
 
-            Descriptor->Address32.Maximum =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
             MaxOp = InitializerOp;
@@ -176,16 +178,14 @@ RsDoDwordIoDescriptor (
 
         case 8: /* Translation Offset */
 
-            Descriptor->Address32.TranslationOffset =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            TranslationOffset = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
             break;
 
         case 9: /* Address Length */
 
-            Descriptor->Address32.AddressLength =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
             LengthOp = InitializerOp;
@@ -199,7 +199,7 @@ RsDoDwordIoDescriptor (
 
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address32.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -213,8 +213,7 @@ RsDoDwordIoDescriptor (
                 {
                     /* Found a valid ResourceSource */
 
-                    Descriptor->Address32.ResourceLength = (UINT16)
-                        (Descriptor->Address32.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -274,13 +273,20 @@ RsDoDwordIoDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        (UINT64) Descriptor->Address32.Minimum,
-        (UINT64) Descriptor->Address32.Maximum,
-        (UINT64) Descriptor->Address32.AddressLength,
-        (UINT64) Descriptor->Address32.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address32.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address32.ResourceLength, &ResourceLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Minimum, &Minimum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Maximum, &Maximum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.AddressLength, &AddressLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Granularity, &Granularity);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
                             OptionIndex + StringLength;
     return (Rnode);
@@ -315,7 +321,13 @@ RsDoDwordMemoryDescriptor (
     ASL_RESOURCE_NODE       *Rnode;
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT32                  Minimum = 0;
+    UINT32                  Maximum = 0;
+    UINT32                  AddressLength = 0;
+    UINT32                  Granularity = 0;
+    UINT32                  TranslationOffset = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -335,11 +347,9 @@ RsDoDwordMemoryDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
-    Descriptor->Address32.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS32) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS32) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
-
     /* Process all child initialization nodes */
 
     for (i = 0; InitializerOp; i++)
@@ -388,8 +398,7 @@ RsDoDwordMemoryDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->Address32.Granularity =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Granularity = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
             GranOp = InitializerOp;
@@ -397,8 +406,7 @@ RsDoDwordMemoryDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->Address32.Minimum =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
             MinOp = InitializerOp;
@@ -406,8 +414,7 @@ RsDoDwordMemoryDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->Address32.Maximum =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
             MaxOp = InitializerOp;
@@ -415,16 +422,14 @@ RsDoDwordMemoryDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->Address32.TranslationOffset =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            TranslationOffset = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->Address32.AddressLength =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
             LengthOp = InitializerOp;
@@ -436,7 +441,7 @@ RsDoDwordMemoryDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address32.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -448,8 +453,8 @@ RsDoDwordMemoryDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address32.ResourceLength = (UINT16)
-                        (Descriptor->Address32.ResourceLength + StringLength);
+
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -510,13 +515,20 @@ RsDoDwordMemoryDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        (UINT64) Descriptor->Address32.Minimum,
-        (UINT64) Descriptor->Address32.Maximum,
-        (UINT64) Descriptor->Address32.AddressLength,
-        (UINT64) Descriptor->Address32.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address32.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address32.ResourceLength, &ResourceLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Minimum, &Minimum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Maximum, &Maximum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.AddressLength, &AddressLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Granularity, &Granularity);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
                             OptionIndex + StringLength;
     return (Rnode);
@@ -551,7 +563,13 @@ RsDoDwordSpaceDescriptor (
     ASL_RESOURCE_NODE       *Rnode;
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT32                  Minimum = 0;
+    UINT32                  Maximum = 0;
+    UINT32                  AddressLength = 0;
+    UINT32                  Granularity = 0;
+    UINT32                  TranslationOffset = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -570,8 +588,7 @@ RsDoDwordSpaceDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
-    Descriptor->Address32.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS32) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS32) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -620,8 +637,7 @@ RsDoDwordSpaceDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->Address32.Granularity =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Granularity = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
             GranOp = InitializerOp;
@@ -629,8 +645,7 @@ RsDoDwordSpaceDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->Address32.Minimum =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
             MinOp = InitializerOp;
@@ -638,8 +651,7 @@ RsDoDwordSpaceDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->Address32.Maximum =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
             MaxOp = InitializerOp;
@@ -647,16 +661,14 @@ RsDoDwordSpaceDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->Address32.TranslationOffset =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            TranslationOffset = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->Address32.AddressLength =
-                (UINT32) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
             LengthOp = InitializerOp;
@@ -668,7 +680,7 @@ RsDoDwordSpaceDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address32.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -680,8 +692,7 @@ RsDoDwordSpaceDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address32.ResourceLength = (UINT16)
-                        (Descriptor->Address32.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -728,13 +739,20 @@ RsDoDwordSpaceDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        (UINT64) Descriptor->Address32.Minimum,
-        (UINT64) Descriptor->Address32.Maximum,
-        (UINT64) Descriptor->Address32.AddressLength,
-        (UINT64) Descriptor->Address32.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address32.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address32.ResourceLength, &ResourceLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Minimum, &Minimum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Maximum, &Maximum);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.AddressLength, &AddressLength);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.Granularity, &Granularity);
+    ACPI_MOVE_32_TO_32(&Descriptor->Address32.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
                             OptionIndex + StringLength;
     return (Rnode);
diff --git a/source/compiler/aslrestype2e.c b/source/compiler/aslrestype2e.c
index e5fff47..d701880 100644
--- a/source/compiler/aslrestype2e.c
+++ b/source/compiler/aslrestype2e.c
@@ -82,6 +82,13 @@ RsDoExtendedIoDescriptor (
     ACPI_PARSE_OBJECT       *GranOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
+    UINT64                  Minimum = 0;
+    UINT64                  Maximum = 0;
+    UINT64                  AddressLength = 0;
+    UINT64                  Granularity = 0;
+    UINT64                  TranslationOffset = 0;
+    UINT64                  TypeSpecific = 0;
     UINT32                  i;
 
 
@@ -96,9 +103,10 @@ RsDoExtendedIoDescriptor (
     Descriptor->ExtAddress64.ResourceType    = ACPI_ADDRESS_TYPE_IO_RANGE;
     Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
 
-    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
-        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
+    ResourceLength  = (UINT16) (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
+    ACPI_MOVE_16_TO_16(&Descriptor->ExtAddress64.ResourceLength,
+        &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -141,7 +149,7 @@ RsDoExtendedIoDescriptor (
 
         case 5: /* Address Granularity */
 
-            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
+            Granularity = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
             GranOp = InitializerOp;
@@ -149,7 +157,7 @@ RsDoExtendedIoDescriptor (
 
         case 6: /* Address Min */
 
-            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
+            Minimum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
             MinOp = InitializerOp;
@@ -157,7 +165,7 @@ RsDoExtendedIoDescriptor (
 
         case 7: /* Address Max */
 
-            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
+            Maximum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
             MaxOp = InitializerOp;
@@ -165,14 +173,14 @@ RsDoExtendedIoDescriptor (
 
         case 8: /* Translation Offset */
 
-            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+            TranslationOffset = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
             break;
 
         case 9: /* Address Length */
 
-            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
+            AddressLength = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
             LengthOp = InitializerOp;
@@ -180,7 +188,7 @@ RsDoExtendedIoDescriptor (
 
         case 10: /* Type-Specific Attributes */
 
-            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
+            TypeSpecific = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
             break;
@@ -216,13 +224,20 @@ RsDoExtendedIoDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        Descriptor->ExtAddress64.Minimum,
-        Descriptor->ExtAddress64.Maximum,
-        Descriptor->ExtAddress64.AddressLength,
-        Descriptor->ExtAddress64.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->ExtAddress64.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Minimum, &Minimum);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Maximum, &Maximum);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.AddressLength, &AddressLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Granularity, &Granularity);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TranslationOffset, &TranslationOffset);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TypeSpecific, &TypeSpecific);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
     return (Rnode);
 }
@@ -255,6 +270,13 @@ RsDoExtendedMemoryDescriptor (
     ACPI_PARSE_OBJECT       *GranOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
+    UINT64                  Minimum = 0;
+    UINT64                  Maximum = 0;
+    UINT64                  AddressLength = 0;
+    UINT64                  Granularity = 0;
+    UINT64                  TranslationOffset = 0;
+    UINT64                  TypeSpecific = 0;
     UINT32                  i;
 
 
@@ -269,9 +291,10 @@ RsDoExtendedMemoryDescriptor (
     Descriptor->ExtAddress64.ResourceType    = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
     Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
 
-    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
-        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
+    ResourceLength  = (UINT16) (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
+    ACPI_MOVE_16_TO_16(&Descriptor->ExtAddress64.ResourceLength,
+        &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -321,7 +344,7 @@ RsDoExtendedMemoryDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
+            Granularity = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
             GranOp = InitializerOp;
@@ -329,7 +352,7 @@ RsDoExtendedMemoryDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
+            Minimum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
             MinOp = InitializerOp;
@@ -337,7 +360,7 @@ RsDoExtendedMemoryDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
+            Maximum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
             MaxOp = InitializerOp;
@@ -345,14 +368,14 @@ RsDoExtendedMemoryDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+            TranslationOffset = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
+            AddressLength = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
             LengthOp = InitializerOp;
@@ -360,7 +383,7 @@ RsDoExtendedMemoryDescriptor (
 
         case 11: /* Type-Specific Attributes */
 
-            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
+            TypeSpecific = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
             break;
@@ -397,13 +420,20 @@ RsDoExtendedMemoryDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        Descriptor->ExtAddress64.Minimum,
-        Descriptor->ExtAddress64.Maximum,
-        Descriptor->ExtAddress64.AddressLength,
-        Descriptor->ExtAddress64.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->ExtAddress64.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Minimum, &Minimum);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Maximum, &Maximum);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.AddressLength, &AddressLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Granularity, &Granularity);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TranslationOffset, &TranslationOffset);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TypeSpecific, &TypeSpecific);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
     return (Rnode);
 }
@@ -436,6 +466,13 @@ RsDoExtendedSpaceDescriptor (
     ACPI_PARSE_OBJECT       *GranOp = NULL;
     ASL_RESOURCE_NODE       *Rnode;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
+    UINT64                  Minimum = 0;
+    UINT64                  Maximum = 0;
+    UINT64                  AddressLength = 0;
+    UINT64                  Granularity = 0;
+    UINT64                  TranslationOffset = 0;
+    UINT64                  TypeSpecific = 0;
     UINT32                  i;
 
 
@@ -449,9 +486,10 @@ RsDoExtendedSpaceDescriptor (
     Descriptor->ExtAddress64.DescriptorType  = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
     Descriptor->ExtAddress64.RevisionID      = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
 
-    Descriptor->ExtAddress64.ResourceLength  = (UINT16)
-        (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
+    ResourceLength  = (UINT16) (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
+    ACPI_MOVE_16_TO_16(&Descriptor->ExtAddress64.ResourceLength,
+        &ResourceLength);
 
     /* Process all child initialization nodes */
 
@@ -499,7 +537,7 @@ RsDoExtendedSpaceDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
+            Granularity = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
             GranOp = InitializerOp;
@@ -507,7 +545,7 @@ RsDoExtendedSpaceDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
+            Minimum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
             MinOp = InitializerOp;
@@ -515,7 +553,7 @@ RsDoExtendedSpaceDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
+            Maximum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
             MaxOp = InitializerOp;
@@ -523,14 +561,14 @@ RsDoExtendedSpaceDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+            TranslationOffset = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
+            AddressLength = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
             LengthOp = InitializerOp;
@@ -538,7 +576,7 @@ RsDoExtendedSpaceDescriptor (
 
         case 11: /* Type-Specific Attributes */
 
-            Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
+            TypeSpecific = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
             break;
@@ -560,13 +598,20 @@ RsDoExtendedSpaceDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        Descriptor->ExtAddress64.Minimum,
-        Descriptor->ExtAddress64.Maximum,
-        Descriptor->ExtAddress64.AddressLength,
-        Descriptor->ExtAddress64.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->ExtAddress64.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Minimum, &Minimum);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Maximum, &Maximum);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.AddressLength, &AddressLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.Granularity, &Granularity);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TranslationOffset, &TranslationOffset);
+    ACPI_MOVE_64_TO_64(&Descriptor->ExtAddress64.TypeSpecific, &TypeSpecific);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
     return (Rnode);
 }
diff --git a/source/compiler/aslrestype2q.c b/source/compiler/aslrestype2q.c
index 65c242a..c92d545 100644
--- a/source/compiler/aslrestype2q.c
+++ b/source/compiler/aslrestype2q.c
@@ -84,7 +84,13 @@ RsDoQwordIoDescriptor (
     ASL_RESOURCE_NODE       *Rnode;
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT64                  Minimum = 0;
+    UINT64                  Maximum = 0;
+    UINT64                  AddressLength = 0;
+    UINT64                  Granularity = 0;
+    UINT64                  TranslationOffset = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -104,8 +110,7 @@ RsDoQwordIoDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
-    Descriptor->Address64.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS64) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS64) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -149,7 +154,7 @@ RsDoQwordIoDescriptor (
 
         case 5: /* Address Granularity */
 
-            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
+            Granularity = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
             GranOp = InitializerOp;
@@ -157,7 +162,7 @@ RsDoQwordIoDescriptor (
 
         case 6: /* Address Min */
 
-            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
+            Minimum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
             MinOp = InitializerOp;
@@ -165,7 +170,7 @@ RsDoQwordIoDescriptor (
 
         case 7: /* Address Max */
 
-            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
+            Maximum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
             MaxOp = InitializerOp;
@@ -173,14 +178,14 @@ RsDoQwordIoDescriptor (
 
         case 8: /* Translation Offset */
 
-            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+            TranslationOffset = InitializerOp->Asl.Value.Integer;
             RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
             break;
 
         case 9: /* Address Length */
 
-            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
+            AddressLength = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
             LengthOp = InitializerOp;
@@ -192,7 +197,7 @@ RsDoQwordIoDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address64.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -204,8 +209,7 @@ RsDoQwordIoDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address64.ResourceLength = (UINT16)
-                        (Descriptor->Address64.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -265,13 +269,20 @@ RsDoQwordIoDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        Descriptor->Address64.Minimum,
-        Descriptor->Address64.Maximum,
-        Descriptor->Address64.AddressLength,
-        Descriptor->Address64.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address64.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address64.ResourceLength, &ResourceLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Minimum, &Minimum);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Maximum, &Maximum);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.AddressLength, &AddressLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Granularity, &Granularity);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
                             OptionIndex + StringLength;
     return (Rnode);
@@ -306,7 +317,13 @@ RsDoQwordMemoryDescriptor (
     ASL_RESOURCE_NODE       *Rnode;
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT64                  Minimum = 0;
+    UINT64                  Maximum = 0;
+    UINT64                  AddressLength = 0;
+    UINT64                  Granularity = 0;
+    UINT64                  TranslationOffset = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -326,8 +343,7 @@ RsDoQwordMemoryDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
-    Descriptor->Address64.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS64) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS64) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -378,7 +394,7 @@ RsDoQwordMemoryDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
+            Granularity = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
             GranOp = InitializerOp;
@@ -386,7 +402,7 @@ RsDoQwordMemoryDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
+            Minimum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
             MinOp = InitializerOp;
@@ -394,7 +410,7 @@ RsDoQwordMemoryDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
+            Maximum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
             MaxOp = InitializerOp;
@@ -402,14 +418,14 @@ RsDoQwordMemoryDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+            TranslationOffset = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
+            AddressLength = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
             LengthOp = InitializerOp;
@@ -421,7 +437,7 @@ RsDoQwordMemoryDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address64.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -433,8 +449,7 @@ RsDoQwordMemoryDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address64.ResourceLength = (UINT16)
-                        (Descriptor->Address64.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -495,13 +510,20 @@ RsDoQwordMemoryDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        Descriptor->Address64.Minimum,
-        Descriptor->Address64.Maximum,
-        Descriptor->Address64.AddressLength,
-        Descriptor->Address64.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address64.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address64.ResourceLength, &ResourceLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Minimum, &Minimum);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Maximum, &Maximum);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.AddressLength, &AddressLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Granularity, &Granularity);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
                             OptionIndex + StringLength;
     return (Rnode);
@@ -536,8 +558,14 @@ RsDoQwordSpaceDescriptor (
     ASL_RESOURCE_NODE       *Rnode;
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  OptionIndex = 0;
     UINT32                  i;
+    UINT64                  Minimum = 0;
+    UINT64                  Maximum = 0;
+    UINT64                  AddressLength = 0;
+    UINT64                  Granularity = 0;
+    UINT64                  TranslationOffset = 0;
     BOOLEAN                 ResSourceIndex = FALSE;
 
 
@@ -555,8 +583,7 @@ RsDoQwordSpaceDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
-    Descriptor->Address64.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS64) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS64) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -605,7 +632,7 @@ RsDoQwordSpaceDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
+            Granularity = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
             GranOp = InitializerOp;
@@ -613,7 +640,7 @@ RsDoQwordSpaceDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
+            Minimum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
             MinOp = InitializerOp;
@@ -621,7 +648,7 @@ RsDoQwordSpaceDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
+            Maximum = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
             MaxOp = InitializerOp;
@@ -629,14 +656,14 @@ RsDoQwordSpaceDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+            TranslationOffset = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
+            AddressLength = InitializerOp->Asl.Value.Integer;
             RsCreateQwordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
             LengthOp = InitializerOp;
@@ -648,7 +675,7 @@ RsDoQwordSpaceDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address64.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -660,8 +687,7 @@ RsDoQwordSpaceDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address64.ResourceLength = (UINT16)
-                        (Descriptor->Address64.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -707,13 +733,20 @@ RsDoQwordSpaceDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        Descriptor->Address64.Minimum,
-        Descriptor->Address64.Maximum,
-        Descriptor->Address64.AddressLength,
-        Descriptor->Address64.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address64.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address64.ResourceLength, &ResourceLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Minimum, &Minimum);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Maximum, &Maximum);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.AddressLength, &AddressLength);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.Granularity, &Granularity);
+    ACPI_MOVE_64_TO_64(&Descriptor->Address64.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
                             OptionIndex + StringLength;
     return (Rnode);
diff --git a/source/compiler/aslrestype2s.c b/source/compiler/aslrestype2s.c
index a9d24cd..4d9c7db 100644
--- a/source/compiler/aslrestype2s.c
+++ b/source/compiler/aslrestype2s.c
@@ -293,6 +293,9 @@ RsDoGpioIntDescriptor (
     UINT16                  VendorLength;
     UINT16                  InterruptLength;
     UINT16                  DescriptorSize;
+    UINT16                  IntFlags = 0;
+    UINT16                  DebounceTimeout = 0;
+    UINT16                  Flags = 0;
     UINT32                  i;
 
 
@@ -348,21 +351,21 @@ RsDoGpioIntDescriptor (
         {
         case 0: /* Interrupt Mode - edge/level [Flag] (_MOD) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 0, 0);
+            RsSetFlagBits16 (&IntFlags, InitializerOp, 0, 0);
             RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0);
             break;
 
         case 1: /* Interrupt Polarity - Active high/low [Flags] (_POL) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 1, 0);
+            RsSetFlagBits16 (&IntFlags, InitializerOp, 1, 0);
             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_POLARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 1, 2);
             break;
 
         case 2: /* Share Type - Default: exclusive (0) [Flags] (_SHR) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 3, 0);
+            RsSetFlagBits16 (&IntFlags, InitializerOp, 3, 0);
             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3, 2);
             break;
@@ -376,7 +379,7 @@ RsDoGpioIntDescriptor (
 
         case 4: /* Debounce Timeout [WORD] (_DBT) */
 
-            Descriptor->Gpio.DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer;
+            DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout));
             break;
@@ -402,7 +405,7 @@ RsDoGpioIntDescriptor (
 
         case 7: /* Resource Usage (consumer/producer) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.Flags, InitializerOp, 0, 1);
+            RsSetFlagBits16 (&Flags, InitializerOp, 0, 1);
             break;
 
         case 8: /* Resource Tag (Descriptor Name) */
@@ -466,6 +469,10 @@ RsDoGpioIntDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.IntFlags, &IntFlags);
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.DebounceTimeout, &DebounceTimeout);
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.Flags, &Flags);
+
     return (Rnode);
 }
 
@@ -499,6 +506,10 @@ RsDoGpioIoDescriptor (
     UINT16                  VendorLength;
     UINT16                  InterruptLength;
     UINT16                  DescriptorSize;
+    UINT16                  IntFlags = 0;
+    UINT16                  DebounceTimeout = 0;
+    UINT16                  DriveStrength = 0;
+    UINT16                  Flags = 0;
     UINT32                  i;
 
 
@@ -554,7 +565,7 @@ RsDoGpioIoDescriptor (
         {
         case 0: /* Share Type [Flags] (_SHR) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 3, 0);
+            RsSetFlagBits16 (&IntFlags, InitializerOp, 3, 0);
             RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 3);
             break;
@@ -568,21 +579,21 @@ RsDoGpioIoDescriptor (
 
         case 2: /* Debounce Timeout [WORD] (_DBT) */
 
-            Descriptor->Gpio.DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer;
+            DebounceTimeout = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_DEBOUNCETIME,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DebounceTimeout));
             break;
 
         case 3: /* Drive Strength [WORD] (_DRS) */
 
-            Descriptor->Gpio.DriveStrength = (UINT16) InitializerOp->Asl.Value.Integer;
+            DriveStrength = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_DRIVESTRENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.DriveStrength));
             break;
 
         case 4: /* I/O Restriction [Flag] (_IOR) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.IntFlags, InitializerOp, 0, 0);
+            RsSetFlagBits16 (&IntFlags, InitializerOp, 0, 0);
             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_IORESTRICTION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Gpio.IntFlags), 0, 2);
             break;
@@ -608,7 +619,7 @@ RsDoGpioIoDescriptor (
 
         case 7: /* Resource Usage (consumer/producer) */
 
-            RsSetFlagBits16 (&Descriptor->Gpio.Flags, InitializerOp, 0, 1);
+            RsSetFlagBits16 (&Flags, InitializerOp, 0, 1);
             break;
 
         case 8: /* Resource Tag (Descriptor Name) */
@@ -671,6 +683,11 @@ RsDoGpioIoDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.IntFlags, &IntFlags);
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.DebounceTimeout, &DebounceTimeout);
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.DriveStrength, &DriveStrength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Gpio.Flags, &Flags);
+
     return (Rnode);
 }
 
@@ -702,6 +719,9 @@ RsDoI2cSerialBusDescriptor (
     UINT16                  ResSourceLength;
     UINT16                  VendorLength;
     UINT16                  DescriptorSize;
+    UINT16                  SlaveAddress = 0;
+    UINT32                  ConnectionSpeed = 0;
+    UINT16                  TypeSpecificFlags = 0;
     UINT32                  i;
 
 
@@ -749,7 +769,7 @@ RsDoI2cSerialBusDescriptor (
         {
         case 0: /* Slave Address [WORD] (_ADR) */
 
-            Descriptor->I2cSerialBus.SlaveAddress = (UINT16) InitializerOp->Asl.Value.Integer;
+            SlaveAddress = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.SlaveAddress));
             break;
@@ -763,14 +783,14 @@ RsDoI2cSerialBusDescriptor (
 
         case 2: /* Connection Speed [DWORD] (_SPE) */
 
-            Descriptor->I2cSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer;
+            ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.ConnectionSpeed));
             break;
 
         case 3: /* Addressing Mode [Flag] (_MOD) */
 
-            RsSetFlagBits16 (&Descriptor->I2cSerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 0, 0);
             RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (I2cSerialBus.TypeSpecificFlags), 0);
             break;
@@ -818,6 +837,9 @@ RsDoI2cSerialBusDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
+    ACPI_MOVE_16_TO_16(&Descriptor->I2cSerialBus.SlaveAddress, &SlaveAddress);
+    ACPI_MOVE_32_TO_32(&Descriptor->I2cSerialBus.ConnectionSpeed, &ConnectionSpeed);
+    ACPI_MOVE_16_TO_16(&Descriptor->I2cSerialBus.TypeSpecificFlags, &TypeSpecificFlags);
     return (Rnode);
 }
 
@@ -849,6 +871,9 @@ RsDoSpiSerialBusDescriptor (
     UINT16                  ResSourceLength;
     UINT16                  VendorLength;
     UINT16                  DescriptorSize;
+    UINT16                  DeviceSelection = 0;
+    UINT32                  ConnectionSpeed = 0;
+    UINT16                  TypeSpecificFlags = 0;
     UINT32                  i;
 
 
@@ -896,21 +921,21 @@ RsDoSpiSerialBusDescriptor (
         {
         case 0: /* Device Selection [WORD] (_ADR) */
 
-            Descriptor->SpiSerialBus.DeviceSelection = (UINT16) InitializerOp->Asl.Value.Integer;
+            DeviceSelection = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_ADDRESS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.DeviceSelection));
             break;
 
         case 1: /* Device Polarity [Flag] (_DPL) */
 
-            RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 1, 0);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 1, 0);
             RsCreateBitField (InitializerOp, ACPI_RESTAG_DEVICEPOLARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 1);
             break;
 
         case 2: /* Wire Mode [Flag] (_MOD) */
 
-            RsSetFlagBits16 (&Descriptor->SpiSerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 0, 0);
             RsCreateBitField (InitializerOp, ACPI_RESTAG_MODE,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.TypeSpecificFlags), 0);
             break;
@@ -931,7 +956,7 @@ RsDoSpiSerialBusDescriptor (
 
         case 5: /* Connection Speed [DWORD] (_SPE) */
 
-            Descriptor->SpiSerialBus.ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer;
+            ConnectionSpeed = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (SpiSerialBus.ConnectionSpeed));
             break;
@@ -993,6 +1017,10 @@ RsDoSpiSerialBusDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
+    ACPI_MOVE_16_TO_16(&Descriptor->SpiSerialBus.DeviceSelection, &DeviceSelection);
+    ACPI_MOVE_32_TO_32(&Descriptor->SpiSerialBus.ConnectionSpeed, &ConnectionSpeed);
+    ACPI_MOVE_16_TO_16(&Descriptor->SpiSerialBus.TypeSpecificFlags, &TypeSpecificFlags);
+
     return (Rnode);
 }
 
@@ -1024,6 +1052,10 @@ RsDoUartSerialBusDescriptor (
     UINT16                  ResSourceLength;
     UINT16                  VendorLength;
     UINT16                  DescriptorSize;
+    UINT32                  DefaultBaudRate = 0;
+    UINT16                  TypeSpecificFlags = 0;
+    UINT16                  RxFifoSize = 0;
+    UINT16                  TxFifoSize = 0;
     UINT32                  i;
 
 
@@ -1071,21 +1103,21 @@ RsDoUartSerialBusDescriptor (
         {
         case 0: /* Connection Speed (Baud Rate) [DWORD] (_SPE) */
 
-            Descriptor->UartSerialBus.DefaultBaudRate = (UINT32) InitializerOp->Asl.Value.Integer;
+            DefaultBaudRate = (UINT32) InitializerOp->Asl.Value.Integer;
             RsCreateDwordField (InitializerOp, ACPI_RESTAG_SPEED,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.DefaultBaudRate));
             break;
 
         case 1: /* Bits Per Byte [Flags] (_LEN) */
 
-            RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 4, 3);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 4, 3);
             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 4, 3);
             break;
 
         case 2: /* Stop Bits [Flags] (_STB) */
 
-            RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 2, 1);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 2, 1);
             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_STOPBITS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 2, 2);
             break;
@@ -1099,7 +1131,7 @@ RsDoUartSerialBusDescriptor (
 
         case 4: /* Endianness [Flag] (_END) */
 
-            RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 7, 0);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 7, 0);
             RsCreateBitField (InitializerOp, ACPI_RESTAG_ENDIANNESS,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 7);
             break;
@@ -1113,21 +1145,21 @@ RsDoUartSerialBusDescriptor (
 
         case 6: /* Flow Control [Flags] (_FLC) */
 
-            RsSetFlagBits16 (&Descriptor->UartSerialBus.TypeSpecificFlags, InitializerOp, 0, 0);
+            RsSetFlagBits16 (&TypeSpecificFlags, InitializerOp, 0, 0);
             RsCreateMultiBitField (InitializerOp, ACPI_RESTAG_FLOWCONTROL,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TypeSpecificFlags), 0, 2);
             break;
 
         case 7: /* Rx Buffer Size [WORD] (_RXL) */
 
-            Descriptor->UartSerialBus.RxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer;
+            RxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_RX,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.RxFifoSize));
             break;
 
         case 8: /* Tx Buffer Size [WORD] (_TXL) */
 
-            Descriptor->UartSerialBus.TxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer;
+            TxFifoSize = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH_TX,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (UartSerialBus.TxFifoSize));
             break;
@@ -1185,5 +1216,10 @@ RsDoUartSerialBusDescriptor (
         InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
     }
 
+    ACPI_MOVE_32_TO_32(&Descriptor->UartSerialBus.DefaultBaudRate, &DefaultBaudRate);
+    ACPI_MOVE_16_TO_16(&Descriptor->UartSerialBus.TypeSpecificFlags, &TypeSpecificFlags);
+    ACPI_MOVE_16_TO_16(&Descriptor->UartSerialBus.RxFifoSize, &RxFifoSize);
+    ACPI_MOVE_16_TO_16(&Descriptor->UartSerialBus.TxFifoSize, &TxFifoSize);
+
     return (Rnode);
 }
diff --git a/source/compiler/aslrestype2w.c b/source/compiler/aslrestype2w.c
index 79d7bcc..77acbcc 100644
--- a/source/compiler/aslrestype2w.c
+++ b/source/compiler/aslrestype2w.c
@@ -85,6 +85,12 @@ RsDoWordIoDescriptor (
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT16                  ResourceLength = 0;
+    UINT16                  Minimum = 0;
+    UINT16                  Maximum = 0;
+    UINT16                  AddressLength = 0;
+    UINT16                  Granularity = 0;
+    UINT16                  TranslationOffset = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -104,8 +110,7 @@ RsDoWordIoDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
-    Descriptor->Address16.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS16) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS16) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -149,7 +154,7 @@ RsDoWordIoDescriptor (
 
         case 5: /* Address Granularity */
 
-            Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
+            Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
             GranOp = InitializerOp;
@@ -157,7 +162,7 @@ RsDoWordIoDescriptor (
 
         case 6: /* Address Min */
 
-            Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
             MinOp = InitializerOp;
@@ -165,7 +170,7 @@ RsDoWordIoDescriptor (
 
         case 7: /* Address Max */
 
-            Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
             MaxOp = InitializerOp;
@@ -173,14 +178,14 @@ RsDoWordIoDescriptor (
 
         case 8: /* Translation Offset */
 
-            Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
+            TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
             break;
 
         case 9: /* Address Length */
 
-            Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
                  CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
             LengthOp = InitializerOp;
@@ -192,7 +197,7 @@ RsDoWordIoDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address16.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -204,8 +209,7 @@ RsDoWordIoDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address16.ResourceLength = (UINT16)
-                        (Descriptor->Address16.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -265,13 +269,20 @@ RsDoWordIoDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        (UINT64) Descriptor->Address16.Minimum,
-        (UINT64) Descriptor->Address16.Maximum,
-        (UINT64) Descriptor->Address16.AddressLength,
-        (UINT64) Descriptor->Address16.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address16.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.ResourceLength, &ResourceLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Minimum, &Minimum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Maximum, &Maximum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.AddressLength, &AddressLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Granularity, &Granularity);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
                             OptionIndex + StringLength;
     return (Rnode);
@@ -307,6 +318,12 @@ RsDoWordBusNumberDescriptor (
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT16                  ResourceLength = 0;
+    UINT16                  Minimum = 0;
+    UINT16                  Maximum = 0;
+    UINT16                  AddressLength = 0;
+    UINT16                  Granularity = 0;
+    UINT16                  TranslationOffset = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -326,8 +343,7 @@ RsDoWordBusNumberDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
-    Descriptor->Address16.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS16) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS16) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -364,8 +380,7 @@ RsDoWordBusNumberDescriptor (
 
         case 4: /* Address Granularity */
 
-            Descriptor->Address16.Granularity =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
             GranOp = InitializerOp;
@@ -373,8 +388,7 @@ RsDoWordBusNumberDescriptor (
 
         case 5: /* Min Address */
 
-            Descriptor->Address16.Minimum =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
             MinOp = InitializerOp;
@@ -382,8 +396,7 @@ RsDoWordBusNumberDescriptor (
 
         case 6: /* Max Address */
 
-            Descriptor->Address16.Maximum =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
             MaxOp = InitializerOp;
@@ -391,16 +404,14 @@ RsDoWordBusNumberDescriptor (
 
         case 7: /* Translation Offset */
 
-            Descriptor->Address16.TranslationOffset =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
             break;
 
         case 8: /* Address Length */
 
-            Descriptor->Address16.AddressLength =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
                  CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
             LengthOp = InitializerOp;
@@ -412,7 +423,7 @@ RsDoWordBusNumberDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address16.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -424,8 +435,7 @@ RsDoWordBusNumberDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address16.ResourceLength = (UINT16)
-                        (Descriptor->Address16.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -471,13 +481,20 @@ RsDoWordBusNumberDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        (UINT64) Descriptor->Address16.Minimum,
-        (UINT64) Descriptor->Address16.Maximum,
-        (UINT64) Descriptor->Address16.AddressLength,
-        (UINT64) Descriptor->Address16.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address16.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.ResourceLength, &ResourceLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Minimum, &Minimum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Maximum, &Maximum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.AddressLength, &AddressLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Granularity, &Granularity);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
                             OptionIndex + StringLength;
     return (Rnode);
@@ -513,6 +530,12 @@ RsDoWordSpaceDescriptor (
     UINT8                   *OptionalFields;
     UINT16                  StringLength = 0;
     UINT32                  OptionIndex = 0;
+    UINT16                  Minimum = 0;
+    UINT16                  Maximum = 0;
+    UINT16                  AddressLength = 0;
+    UINT16                  Granularity = 0;
+    UINT16                  TranslationOffset = 0;
+    UINT16                  ResourceLength = 0;
     UINT32                  i;
     BOOLEAN                 ResSourceIndex = FALSE;
 
@@ -531,8 +554,7 @@ RsDoWordSpaceDescriptor (
      * optional fields present
      */
     OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
-    Descriptor->Address16.ResourceLength = (UINT16)
-        (sizeof (AML_RESOURCE_ADDRESS16) -
+    ResourceLength = (UINT16) (sizeof (AML_RESOURCE_ADDRESS16) -
          sizeof (AML_RESOURCE_LARGE_HEADER));
 
     /* Process all child initialization nodes */
@@ -581,8 +603,7 @@ RsDoWordSpaceDescriptor (
 
         case 6: /* Address Granularity */
 
-            Descriptor->Address16.Granularity =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_GRANULARITY,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
             GranOp = InitializerOp;
@@ -590,8 +611,7 @@ RsDoWordSpaceDescriptor (
 
         case 7: /* Min Address */
 
-            Descriptor->Address16.Minimum =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MINADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
             MinOp = InitializerOp;
@@ -599,8 +619,7 @@ RsDoWordSpaceDescriptor (
 
         case 8: /* Max Address */
 
-            Descriptor->Address16.Maximum =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_MAXADDR,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
             MaxOp = InitializerOp;
@@ -608,16 +627,14 @@ RsDoWordSpaceDescriptor (
 
         case 9: /* Translation Offset */
 
-            Descriptor->Address16.TranslationOffset =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_TRANSLATION,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
             break;
 
         case 10: /* Address Length */
 
-            Descriptor->Address16.AddressLength =
-                (UINT16) InitializerOp->Asl.Value.Integer;
+            AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
             RsCreateWordField (InitializerOp, ACPI_RESTAG_LENGTH,
                 CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
             LengthOp = InitializerOp;
@@ -629,7 +646,7 @@ RsDoWordSpaceDescriptor (
             {
                 OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
                 OptionIndex++;
-                Descriptor->Address16.ResourceLength++;
+                ResourceLength++;
                 ResSourceIndex = TRUE;
             }
             break;
@@ -641,8 +658,7 @@ RsDoWordSpaceDescriptor (
             {
                 if (StringLength)
                 {
-                    Descriptor->Address16.ResourceLength = (UINT16)
-                        (Descriptor->Address16.ResourceLength + StringLength);
+                    ResourceLength = (UINT16) (ResourceLength + StringLength);
 
                     strcpy ((char *)
                         &OptionalFields[OptionIndex],
@@ -688,13 +704,20 @@ RsDoWordSpaceDescriptor (
     /* Validate the Min/Max/Len/Gran values */
 
     RsLargeAddressCheck (
-        (UINT64) Descriptor->Address16.Minimum,
-        (UINT64) Descriptor->Address16.Maximum,
-        (UINT64) Descriptor->Address16.AddressLength,
-        (UINT64) Descriptor->Address16.Granularity,
+        Minimum,
+        Maximum,
+        AddressLength,
+        Granularity,
         Descriptor->Address16.Flags,
         MinOp, MaxOp, LengthOp, GranOp, Op);
 
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.ResourceLength, &ResourceLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Minimum, &Minimum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Maximum, &Maximum);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.AddressLength, &AddressLength);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.Granularity, &Granularity);
+    ACPI_MOVE_16_TO_16(&Descriptor->Address16.TranslationOffset, &TranslationOffset);
+
     Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
                             OptionIndex + StringLength;
     return (Rnode);
diff --git a/source/include/acmacros.h b/source/include/acmacros.h
index ee9e745..67fb983 100644
--- a/source/include/acmacros.h
+++ b/source/include/acmacros.h
@@ -107,7 +107,8 @@
 
 /* 32-bit source, 16/32/64 destination */
 
-#define ACPI_MOVE_32_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
+#define ACPI_MOVE_32_TO_16(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\
+                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];}
 
 #define ACPI_MOVE_32_TO_32(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\
                                          ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\
@@ -122,9 +123,13 @@
 
 /* 64-bit source, 16/32/64 destination */
 
-#define ACPI_MOVE_64_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
+#define ACPI_MOVE_64_TO_16(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
+                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];}
 
-#define ACPI_MOVE_64_TO_32(d, s)        ACPI_MOVE_32_TO_32(d, s)    /* Truncate to 32 */
+#define ACPI_MOVE_64_TO_32(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
+                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\
+                                         ((  UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\
+                                         ((  UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[4];}
 
 #define ACPI_MOVE_64_TO_64(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
                                          ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\
@@ -151,7 +156,9 @@
 
 /* 32-bit source, 16/32/64 destination */
 
-#define ACPI_MOVE_32_TO_16(d, s)        ACPI_MOVE_16_TO_16(d, s)    /* Truncate to 16 */
+#define ACPI_MOVE_32_TO_16(d, s)        {((  UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
+                                         ((  UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];}
+
 #define ACPI_MOVE_32_TO_32(d, s)        *(UINT32 *)(void *)(d) = *(UINT32 *)(void *)(s)
 #define ACPI_MOVE_32_TO_64(d, s)        *(UINT64 *)(void *)(d) = *(UINT32 *)(void *)(s)
 
diff --git a/source/include/platform/aclinux.h b/source/include/platform/aclinux.h
index 3bc85bc..1bace7f 100644
--- a/source/include/platform/aclinux.h
+++ b/source/include/platform/aclinux.h
@@ -83,13 +83,14 @@
 #include <stdlib.h>
 #include <ctype.h>
 #include <unistd.h>
+#include <endian.h>
 
 /* Host-dependent types and defines for user-space ACPICA */
 
 #define ACPI_FLUSH_CPU_CACHE()
 #define ACPI_CAST_PTHREAD_T(Pthread) ((ACPI_THREAD_ID) (Pthread))
 
-#if defined(__ia64__) || defined(__x86_64__) || defined(__aarch64__)
+#if __SIZEOF_LONG__ == 8
 #define ACPI_MACHINE_WIDTH          64
 #define COMPILER_DEPENDENT_INT64    long
 #define COMPILER_DEPENDENT_UINT64   unsigned long
@@ -100,6 +99,10 @@
 #define ACPI_USE_NATIVE_DIVIDE
 #endif
 
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define ACPI_BIG_ENDIAN
+#endif
+
 #ifndef __cdecl
 #define __cdecl
 #endif
-- 
1.7.12.1