[llvm] r205528 - MicroMIPS specific little endian fixup data byte ordering.

Zoran Jovanovic zoran.jovanovic at imgtec.com
Thu Apr 3 05:01:01 PDT 2014


Author: zjovanovic
Date: Thu Apr  3 07:01:01 2014
New Revision: 205528

URL: http://llvm.org/viewvc/llvm-project?rev=205528&view=rev
Log:
MicroMIPS specific little endian fixup data byte ordering.
Differential Revision: http://llvm-reviews.chandlerc.com/D3245

Added:
    llvm/trunk/test/MC/Mips/micromips-el-fixup-data.s
Modified:
    llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp

Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp?rev=205528&r1=205527&r2=205528&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp Thu Apr  3 07:01:01 2014
@@ -112,6 +112,22 @@ MCObjectWriter *MipsAsmBackend::createOb
     MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit);
 }
 
+// Little-endian fixup data byte ordering:
+//   mips32r2:   a | b | x | x
+//   microMIPS:  x | x | a | b
+
+static bool needsMMLEByteOrder(unsigned Kind) {
+  return Kind >= Mips::fixup_MICROMIPS_26_S1 &&
+         Kind < Mips::LastTargetFixupKind;
+}
+
+// Calculate index for microMIPS specific little endian byte order
+static unsigned calculateMMLEIndex(unsigned i) {
+  assert(i <= 3 && "Index out of range!");
+
+  return (1 - i / 2) * 2 + i % 2;
+}
+
 /// ApplyFixup - Apply the \p Value for given \p Fixup into the provided
 /// data fragment, at the offset specified by the fixup and following the
 /// fixup kind as appropriate.
@@ -149,8 +165,12 @@ void MipsAsmBackend::applyFixup(const MC
   // Grab current value, if any, from bits.
   uint64_t CurVal = 0;
 
+  bool microMipsLEByteOrder = needsMMLEByteOrder((unsigned) Kind);
+
   for (unsigned i = 0; i != NumBytes; ++i) {
-    unsigned Idx = IsLittle ? i : (FullSize - 1 - i);
+    unsigned Idx = IsLittle ? (microMipsLEByteOrder ? calculateMMLEIndex(i)
+                                                    : i)
+                            : (FullSize - 1 - i);
     CurVal |= (uint64_t)((uint8_t)Data[Offset + Idx]) << (i*8);
   }
 
@@ -160,7 +180,9 @@ void MipsAsmBackend::applyFixup(const MC
 
   // Write out the fixed up bytes back to the code/data bits.
   for (unsigned i = 0; i != NumBytes; ++i) {
-    unsigned Idx = IsLittle ? i : (FullSize - 1 - i);
+    unsigned Idx = IsLittle ? (microMipsLEByteOrder ? calculateMMLEIndex(i)
+                                                    : i)
+                            : (FullSize - 1 - i);
     Data[Offset + Idx] = (uint8_t)((CurVal >> (i*8)) & 0xff);
   }
 }

Added: llvm/trunk/test/MC/Mips/micromips-el-fixup-data.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/micromips-el-fixup-data.s?rev=205528&view=auto
==============================================================================
--- llvm/trunk/test/MC/Mips/micromips-el-fixup-data.s (added)
+++ llvm/trunk/test/MC/Mips/micromips-el-fixup-data.s Thu Apr  3 07:01:01 2014
@@ -0,0 +1,25 @@
+# RUN: llvm-mc %s -triple=mipsel-unknown-linux -mcpu=mips32r2 \
+# RUN:   -mattr=+micromips 2>&1 -filetype=obj > %t.o
+# RUN: llvm-objdump %t.o -triple mipsel -mattr=+micromips -d | FileCheck %s
+
+# Check that fixup data is writen in the microMIPS specific little endian
+# byte order.
+
+    .text
+    .globl  main
+    .align  2
+    .type   main, at function
+    .set    micromips
+    .set    nomips16
+    .ent    main
+main:
+    addiu   $sp, $sp, -16
+    bnez    $9, lab1
+
+# CHECK:    09 b4 04 00    bne $9, $zero, 8
+
+    addu    $zero, $zero, $zero
+lab1:
+    jr  $ra
+    addiu   $sp, $sp, 16
+    .end    main





More information about the llvm-commits mailing list