-rwxr-xr-x 2508 lib25519-20221222/crypto_hashblocks/sha512/m3/align raw
#!/bin/sh cat > align-tmp.s arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Os -ffunction-sections -fdata-sections -c align-tmp.s arm-none-eabi-objdump -D align-tmp.o \ | python -c ' import sys program = [] addr = 0 with open("align-tmp.s") as f: for dumpline in sys.stdin: if dumpline[0] == " ": while True: fline = f.readline() if not fline: break fline = fline.strip() if len(fline.split()) == 0 or fline[0] == "#" or fline[0] == "." or fline.find(":") >= 0: program += [[-1,fline]] else: x = dumpline.strip().split("\t") addr = int(x[0].split(":")[0],16) dumpop = x[2] if dumpop.endswith(".w"): dumpop = dumpop[:-2] fop = fline.split()[0] if fop.endswith(".w"): fop = fop[:-2] if fop == "push": fop = "stmdb" if fop == "pop": fop = "ldmia" assert dumpop == fop or (dumpop == "movs" and fop == "ldr") or (dumpop == "lsrs" and fop == "movs") or (dumpop == "bcs" and fop == "bhs") or (dumpop == "mov" and fop == "ldr") program += [[addr,fline]] break for i in range(1,len(program)): if program[i][0] < 0: continue for j in reversed(range(i)): if program[j][0] != -1: program[j][0] = program[i][0]-program[j][0] break while True: addr = 0 happy = True addresses = [] for i in range(len(program)): addresses += [addr] size = program[i][0] if size < 0: continue wantalign = False if program[i][1].startswith("ldr "): wantalign = True if program[i][1].startswith("str "): wantalign = True if program[i][1].startswith("ldrd "): wantalign = True if program[i][1].startswith("strd "): wantalign = True if program[i][1].startswith("ldm "): wantalign = True if program[i][1].startswith("stm "): wantalign = True if program[i][1].startswith("push "): wantalign = True if program[i][1].startswith("pop "): wantalign = True if program[i][1].startswith("vpush "): wantalign = True if program[i][1].startswith("vpop "): wantalign = True if wantalign and size == 4 and addr%4: happy = False for j in reversed(range(i)): if program[j][0] == 2 and addresses[j]%4 == 0: x = program[j][1].split() x[0] += ".w" program[j] = [4," ".join(x)] break break addr += size if happy: break for size,line in program: print(line) ' rm align-tmp.s rm align-tmp.o