<div dir="ltr">llvm/include/llvm/Support/Endian.h provides read32le and read32be to read 32-bit little or big-endian integers. Doesn't it work for you?<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 28, 2017 at 9:51 AM, Alexei Starovoitov via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ast<br>
Date: Fri Apr 28 11:51:01 2017<br>
New Revision: 301653<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=301653&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=301653&view=rev</a><br>
Log:<br>
[bpf] add bigendian support to disassembler<br>
<br>
. swap 4-bit register encoding, 16-bit offset and 32-bit imm to support big endian archs<br>
. add a test<br>
<br>
Reported-by: David S. Miller <<a href="mailto:davem@davemloft.net">davem@davemloft.net</a>><br>
Signed-off-by: Alexei Starovoitov <<a href="mailto:ast@kernel.org">ast@kernel.org</a>><br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/BPF/<wbr>mem_offset_be.ll<br>
Modified:<br>
    llvm/trunk/lib/Target/BPF/<wbr>Disassembler/BPFDisassembler.<wbr>cpp<br>
<br>
Modified: llvm/trunk/lib/Target/BPF/<wbr>Disassembler/BPFDisassembler.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/Disassembler/BPFDisassembler.cpp?rev=301653&r1=301652&r2=301653&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>BPF/Disassembler/<wbr>BPFDisassembler.cpp?rev=<wbr>301653&r1=301652&r2=301653&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/BPF/<wbr>Disassembler/BPFDisassembler.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/Target/BPF/<wbr>Disassembler/BPFDisassembler.<wbr>cpp Fri Apr 28 11:51:01 2017<br>
@@ -17,6 +17,8 @@<br>
 #include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/MC/MCDisassembler/<wbr>MCDisassembler.h"<br>
 #include "llvm/MC/<wbr>MCFixedLenDisassembler.h"<br>
+#include "llvm/MC/MCContext.h"<br>
+#include "llvm/MC/MCAsmInfo.h"<br>
 #include "llvm/MC/MCInst.h"<br>
 #include "llvm/Support/MathExtras.h"<br>
 #include "llvm/Support/TargetRegistry.<wbr>h"<br>
@@ -88,9 +90,9 @@ static DecodeStatus decodeMemoryOpValue(<br>
 }<br>
<br>
 #include "BPFGenDisassemblerTables.inc"<br>
-<br>
 static DecodeStatus readInstruction64(ArrayRef<<wbr>uint8_t> Bytes, uint64_t Address,<br>
-                                      uint64_t &Size, uint64_t &Insn) {<br>
+                                      uint64_t &Size, uint64_t &Insn,<br>
+                                      bool IsLittleEndian) {<br>
   uint64_t Lo, Hi;<br>
<br>
   if (Bytes.size() < 8) {<br>
@@ -99,8 +101,14 @@ static DecodeStatus readInstruction64(Ar<br>
   }<br>
<br>
   Size = 8;<br>
-  Hi = (Bytes[0] << 24) | (Bytes[1] << 16) | (Bytes[2] << 0) | (Bytes[3] << 8);<br>
-  Lo = (Bytes[4] << 0) | (Bytes[5] << 8) | (Bytes[6] << 16) | (Bytes[7] << 24);<br>
+  if (IsLittleEndian) {<br>
+    Hi = (Bytes[0] << 24) | (Bytes[1] << 16) | (Bytes[2] << 0) | (Bytes[3] << 8);<br>
+    Lo = (Bytes[4] << 0) | (Bytes[5] << 8) | (Bytes[6] << 16) | (Bytes[7] << 24);<br>
+  } else {<br>
+    Hi = (Bytes[0] << 24) | ((Bytes[1] & 0x0F) << 20) | ((Bytes[1] & 0xF0) << 12) |<br>
+         (Bytes[2] << 8) | (Bytes[3] << 0);<br>
+    Lo = (Bytes[4] << 24) | (Bytes[5] << 16) | (Bytes[6] << 8) | (Bytes[7] << 0);<br>
+  }<br>
   Insn = Make_64(Hi, Lo);<br>
<br>
   return MCDisassembler::Success;<br>
@@ -111,10 +119,11 @@ DecodeStatus BPFDisassembler::getInstruc<br>
                                              uint64_t Address,<br>
                                              raw_ostream &VStream,<br>
                                              raw_ostream &CStream) const {<br>
-  uint64_t Insn;<br>
+  bool IsLittleEndian = getContext().getAsmInfo()-><wbr>isLittleEndian();<br>
+  uint64_t Insn, Hi;<br>
   DecodeStatus Result;<br>
<br>
-  Result = readInstruction64(Bytes, Address, Size, Insn);<br>
+  Result = readInstruction64(Bytes, Address, Size, Insn, IsLittleEndian);<br>
   if (Result == MCDisassembler::Fail) return MCDisassembler::Fail;<br>
<br>
   Result = decodeInstruction(<wbr>DecoderTableBPF64, Instr, Insn,<br>
@@ -128,7 +137,10 @@ DecodeStatus BPFDisassembler::getInstruc<br>
       return MCDisassembler::Fail;<br>
     }<br>
     Size = 16;<br>
-    uint64_t Hi = (Bytes[12] << 0) | (Bytes[13] << 8) | (Bytes[14] << 16) | (Bytes[15] << 24);<br>
+    if (IsLittleEndian)<br>
+      Hi = (Bytes[12] << 0) | (Bytes[13] << 8) | (Bytes[14] << 16) | (Bytes[15] << 24);<br>
+    else<br>
+      Hi = (Bytes[12] << 24) | (Bytes[13] << 16) | (Bytes[14] << 8) | (Bytes[15] << 0);<br>
     auto& Op = Instr.getOperand(1);<br>
     Op.setImm(Make_64(Hi, Op.getImm()));<br>
     break;<br>
<br>
Added: llvm/trunk/test/CodeGen/BPF/<wbr>mem_offset_be.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/mem_offset_be.ll?rev=301653&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/BPF/mem_offset_be.ll?<wbr>rev=301653&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/BPF/<wbr>mem_offset_be.ll (added)<br>
+++ llvm/trunk/test/CodeGen/BPF/<wbr>mem_offset_be.ll Fri Apr 28 11:51:01 2017<br>
@@ -0,0 +1,18 @@<br>
+; RUN: llc -march=bpfeb -show-mc-encoding < %s | FileCheck %s<br>
+<br>
+; Function Attrs: nounwind<br>
+define i32 @bpf_prog1(i8* nocapture readnone) local_unnamed_addr #0 {<br>
+; CHECK: r1 = 590618314553ll   # encoding: [0x18,0x10,0x00,0x00,0x83,<wbr>0x98,0x47,0x39,0x00,0x00,0x00,<wbr>0x00,0x00,0x00,0x00,0x89]<br>
+; CHECK: r1 += -1879113726     # encoding: [0x07,0x10,0x00,0x00,0x8f,<wbr>0xff,0x00,0x02]<br>
+; CHECK: r0 = *(u64 *)(r1 + 0) # encoding: [0x79,0x01,0x00,0x00,0x00,<wbr>0x00,0x00,0x00]<br>
+  %2 = alloca i64, align 8<br>
+  %3 = bitcast i64* %2 to i8*<br>
+  store volatile i64 590618314553, i64* %2, align 8<br>
+  %4 = load volatile i64, i64* %2, align 8<br>
+  %5 = add i64 %4, -1879113726<br>
+  %6 = inttoptr i64 %5 to i64*<br>
+  %7 = load i64, i64* %6, align 8<br>
+  %8 = trunc i64 %7 to i32<br>
+  ret i32 %8<br>
+}<br>
+<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>