Skip to content

Instantly share code, notes, and snippets.

@ciniml
Created May 4, 2020 02:49
Show Gist options
  • Save ciniml/96c15cf4f2f5b0269d2e06eee61100ae to your computer and use it in GitHub Desktop.
Save ciniml/96c15cf4f2f5b0269d2e06eee61100ae to your computer and use it in GitHub Desktop.
ESP32 Unaligned access compare disassembly
.PHONY: all
XTENSA_PREFIX ?= xtensa-esp32-elf-
XTENSA_BIN ?= $(HOME)/xtensa-esp32-elf/1.22.0-80/bin
CC := $(XTENSA_BIN)/$(XTENSA_PREFIX)gcc
CXX := $(XTENSA_BIN)/$(XTENSA_PREFIX)g++
CC := $(XTENSA_BIN)/$(XTENSA_PREFIX)ld
OBJDUMP := $(XTENSA_BIN)/$(XTENSA_PREFIX)objdump
CXXFLAGS := -g -Os -std=c++11
all: test.lst
clean:
-$(RM) test.lst test.elf test.o
%.lst: %.elf
$(OBJDUMP) -dSC $< > $@
test.elf: test.o
$(CXX) -g -nostdlib -nostartfiles -o $@ $^
%.o: %.cpp
$(CXX) -c $(CXXFLAGS) -o $@ $<
#include <cstdint>
static volatile std::uint8_t b[10] = {0x11, 0x22, 0xff, 0xd9, 0xaa, 0xde, 0xad, 0xbe, 0xef, 0xca};
bool __attribute__((noinline)) unaligned_compare_ub()
{
std::uint32_t sch = *((uint32_t*)&b[2]) & 0xffffff;
return sch == 0xaad9ff;
}
bool __attribute__((noinline)) unaligned_compare_ok()
{
return b[2] == 0xff && b[3] == 0xd9 && b[4] == 0xaa;
}
static volatile bool result_ub;
static volatile bool result_ok;
int main()
{
result_ub = unaligned_compare_ub();
result_ok = unaligned_compare_ok();
}
test.elf: file format elf32-xtensa-le
Disassembly of section .text:
00400074 <unaligned_compare_ub()-0x10>:
400074: 400107 bnone a1, a0, 4000b8 <unaligned_compare_ok()+0x8>
400077: 260100 lsi f0, a1, 152
40007a: 12ff55 call4 413070 <_end+0x12f5c>
40007d: 004001 l32r a0, 3c0180 <unaligned_compare_ub()-0x3ff04>
400080: 400111 l32r a1, 3d0084 <unaligned_compare_ub()-0x30000>
...
00400084 <unaligned_compare_ub()>:
#include <cstdint>
static volatile std::uint8_t b[10] = {0x11, 0x22, 0xff, 0xd9, 0xaa, 0xde, 0xad, 0xbe, 0xef, 0xca};
bool __attribute__((noinline)) unaligned_compare_ub()
{
400084: 004136 entry a1, 32
std::uint32_t sch = *((uint32_t*)&b[2]) & 0xffffff;
400087: fffb21 l32r a2, 400074 <unaligned_compare_ub()-0x10>
40008a: 822b addi.n a8, a2, 2
40008c: 0202a2 l8ui a10, a2, 2
40008f: 030222 l8ui a2, a2, 3
400092: 112280 slli a2, a2, 8
400095: 2092a0 or a9, a2, a10
400098: 020822 l8ui a2, a8, 2
return sch == 0xaad9ff;
40009b: fff781 l32r a8, 400078 <unaligned_compare_ub()-0xc>
static volatile std::uint8_t b[10] = {0x11, 0x22, 0xff, 0xd9, 0xaa, 0xde, 0xad, 0xbe, 0xef, 0xca};
bool __attribute__((noinline)) unaligned_compare_ub()
{
std::uint32_t sch = *((uint32_t*)&b[2]) & 0xffffff;
40009e: 112200 slli a2, a2, 16
return sch == 0xaad9ff;
4000a1: 202290 or a2, a2, a9
4000a4: 828a add.n a8, a2, a8
4000a6: 190c movi.n a9, 1
4000a8: 020c movi.n a2, 0
4000aa: 832980 moveqz a2, a9, a8
}
4000ad: f01d retw.n
...
004000b0 <unaligned_compare_ok()>:
bool __attribute__((noinline)) unaligned_compare_ok()
{
4000b0: 004136 entry a1, 32
return b[2] == 0xff && b[3] == 0xd9 && b[4] == 0xaa;
4000b3: fff081 l32r a8, 400074 <unaligned_compare_ub()-0x10>
4000b6: ffa0a2 movi a10, 255
4000b9: 020892 l8ui a9, a8, 2
4000bc: 020c movi.n a2, 0
4000be: 749090 extui a9, a9, 0, 8
4000c1: 1f99a7 bne a9, a10, 4000e4 <unaligned_compare_ok()+0x34>
4000c4: 030892 l8ui a9, a8, 3
4000c7: d9a0a2 movi a10, 217
4000ca: 749090 extui a9, a9, 0, 8
4000cd: 1399a7 bne a9, a10, 4000e4 <unaligned_compare_ok()+0x34>
4000d0: 040882 l8ui a8, a8, 4
4000d3: 749080 extui a9, a8, 0, 8
4000d6: 56af82 movi a8, -170
4000d9: 898a add.n a8, a9, a8
4000db: 01a092 movi a9, 1
4000de: 832980 moveqz a2, a9, a8
4000e1: 742020 extui a2, a2, 0, 8
}
4000e4: f01d retw.n
...
004000e8 <main>:
static volatile bool result_ub;
static volatile bool result_ok;
int main()
{
4000e8: 004136 entry a1, 32
result_ub = unaligned_compare_ub();
4000eb: fff9a5 call8 400084 <unaligned_compare_ub()>
4000ee: ffe381 l32r a8, 40007c <unaligned_compare_ub()-0x8>
result_ok = unaligned_compare_ok();
}
4000f1: 020c movi.n a2, 0
static volatile bool result_ub;
static volatile bool result_ok;
int main()
{
result_ub = unaligned_compare_ub();
4000f3: 0020c0 memw
4000f6: 0048a2 s8i a10, a8, 0
result_ok = unaligned_compare_ok();
4000f9: fffb65 call8 4000b0 <unaligned_compare_ok()>
4000fc: ffe181 l32r a8, 400080 <unaligned_compare_ub()-0x4>
4000ff: 0020c0 memw
400102: 0048a2 s8i a10, a8, 0
}
400105: f01d retw.n
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment