Skip to content

Instantly share code, notes, and snippets.

@chmullig
Last active August 29, 2015 14:08
Show Gist options
  • Save chmullig/6c739acb0eb1405cba42 to your computer and use it in GitHub Desktop.
Save chmullig/6c739acb0eb1405cba42 to your computer and use it in GitHub Desktop.
simple python script to recode gcc mips assembly output to use nice register names
int countzeroes(int a) {
int i;
int count = 0;
for (i = 31; i >= 0; i--) {
int x = a << i;
if (x & 1) {
count++;
}
}
return count;
}
int main() {
countzeroes(31);
}
CC=mipsel-unknown-linux-gnu-gcc
CFLAGS=-Wall -static -fno-inline-small-functions -S
default: palindrome_nice.s palindrome_O1_nice.s palindrome_O2_nice.s palindrome_O3_nice.s palindrome_32r2_nice.s countzeroes_nice.s countzeroes_O1_nice.s countzeroes_O2_nice.s countzeroes_O3_nice.s countzeroes_32r2_nice.s
%_nice.s: %.s recode_gcc.py
python recode_gcc.py < $< > $@
%.s: %.c
$(CC) $(CFLAGS) $<
%_O1.s: %.c
$(CC) $(CFLAGS) -O1 $< -o $@
%_O2.s: %.c
$(CC) $(CFLAGS) -O2 $< -o $@
%_O3.s: %.c
$(CC) $(CFLAGS) -O3 $< -o $@
%_32r2.s: %.c
$(CC) $(CFLAGS) -mips32r2 -mtune=mips32r2 $< -o $@
.PHONY: clean all default
clean:
rm -f *.s
all: clean default
#.PRECIOUS: %.s
int ispalindrome(char *s) {
char *p = s;
while (p++)
;
p--;
while (*s++ == *p--)
;
return p == s;
}
int main() {
ispalindrome("Hello");
ispalindrome("HellolleH");
ispalindrome("HelllleH");
ispalindrome("Helllleh");
}
*** palindrome_nice.s 2014-11-05 18:06:37.649122999 -0500
--- palindrome_32r2_nice.s 2014-11-05 18:06:37.781122999 -0500
***************
*** 20,63 ****
addiu $sp,$sp,-24
sw $fp,20($sp)
move $fp,$sp
sw $a0,24($fp)
lw $v0,24($fp)
- nop
sw $v0,8($fp)
nop
$L2:
lw $v0,8($fp)
- nop
addiu $v1,$v0,1
sw $v1,8($fp)
bne $v0,$zero,$L2
nop
lw $v0,8($fp)
- nop
addiu $v0,$v0,-1
sw $v0,8($fp)
nop
$L3:
lw $v0,24($fp)
- nop
addiu $v1,$v0,1
sw $v1,24($fp)
lb $v1,0($v0)
lw $v0,8($fp)
- nop
addiu $a0,$v0,-1
sw $a0,8($fp)
lb $v0,0($v0)
- nop
beq $v1,$v0,$L3
nop
lw $v1,8($fp)
lw $v0,24($fp)
- nop
xor $v0,$v1,$v0
sltu $v0,$v0,1
andi $v0,$v0,0x00ff
move $sp,$fp
lw $fp,20($sp)
--- 20,56 ----
.file 1 "palindrome.c"
.section .mdebug.abi32
.previous
.nan legacy
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl ispalindrome
.set nomips16
.set nomicromips
.ent ispalindrome
.type ispalindrome, @function
ispalindrome:
.frame $fp,24,$ra # vars= 8, regs= 1/0, args= 0, gp= 8
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-24
sw $fp,20($sp)
move $fp,$sp
sw $a0,24($fp)
lw $v0,24($fp)
sw $v0,8($fp)
nop
$L2:
lw $v0,8($fp)
addiu $v1,$v0,1
sw $v1,8($fp)
bne $v0,$zero,$L2
nop
lw $v0,8($fp)
addiu $v0,$v0,-1
sw $v0,8($fp)
nop
$L3:
lw $v0,24($fp)
addiu $v1,$v0,1
sw $v1,24($fp)
lb $v1,0($v0)
lw $v0,8($fp)
addiu $a0,$v0,-1
sw $a0,8($fp)
lb $v0,0($v0)
beq $v1,$v0,$L3
nop
lw $v1,8($fp)
lw $v0,24($fp)
xor $v0,$v1,$v0
sltu $v0,$v0,1
andi $v0,$v0,0x00ff
move $sp,$fp
lw $fp,20($sp)
addiu $sp,$sp,24
j $ra
nop
.set macro
.set reorder
.end ispalindrome
.size ispalindrome, .-ispalindrome
.rdata
.align 2
$LC0:
.ascii "Hello\000"
.align 2
$LC1:
.ascii "HellolleH\000"
.align 2
$LC2:
.ascii "HelllleH\000"
.align 2
$LC3:
.ascii "Helllleh\000"
.text
.align 2
.globl main
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $fp,32,$ra # vars= 0, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-32
sw $ra,28($sp)
sw $fp,24($sp)
move $fp,$sp
lui $v0,%hi($LC0)
addiu $a0,$v0,%lo($LC0)
.option pic0
jal ispalindrome
nop
.option pic2
lui $v0,%hi($LC1)
addiu $a0,$v0,%lo($LC1)
.option pic0
jal ispalindrome
nop
.option pic2
lui $v0,%hi($LC2)
addiu $a0,$v0,%lo($LC2)
.option pic0
jal ispalindrome
nop
.option pic2
lui $v0,%hi($LC3)
addiu $a0,$v0,%lo($LC3)
.option pic0
jal ispalindrome
nop
.option pic2
move $sp,$fp
lw $ra,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $ra
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (GNU) 4.9.1"
.file 1 "palindrome.c"
.section .mdebug.abi32
.previous
.nan legacy
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl ispalindrome
.set nomips16
.set nomicromips
.ent ispalindrome
.type ispalindrome, @function
ispalindrome:
.frame $fp,24,$ra # vars= 8, regs= 1/0, args= 0, gp= 8
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-24
sw $fp,20($sp)
move $fp,$sp
sw $a0,24($fp)
lw $v0,24($fp)
nop
sw $v0,8($fp)
nop
$L2:
lw $v0,8($fp)
nop
addiu $v1,$v0,1
sw $v1,8($fp)
bne $v0,$zero,$L2
nop
lw $v0,8($fp)
nop
addiu $v0,$v0,-1
sw $v0,8($fp)
nop
$L3:
lw $v0,24($fp)
nop
addiu $v1,$v0,1
sw $v1,24($fp)
lb $v1,0($v0)
lw $v0,8($fp)
nop
addiu $a0,$v0,-1
sw $a0,8($fp)
lb $v0,0($v0)
nop
beq $v1,$v0,$L3
nop
lw $v1,8($fp)
lw $v0,24($fp)
nop
xor $v0,$v1,$v0
sltu $v0,$v0,1
andi $v0,$v0,0x00ff
move $sp,$fp
lw $fp,20($sp)
addiu $sp,$sp,24
j $ra
nop
.set macro
.set reorder
.end ispalindrome
.size ispalindrome, .-ispalindrome
.rdata
.align 2
$LC0:
.ascii "Hello\000"
.align 2
$LC1:
.ascii "HellolleH\000"
.align 2
$LC2:
.ascii "HelllleH\000"
.align 2
$LC3:
.ascii "Helllleh\000"
.text
.align 2
.globl main
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $fp,32,$ra # vars= 0, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-32
sw $ra,28($sp)
sw $fp,24($sp)
move $fp,$sp
lui $v0,%hi($LC0)
addiu $a0,$v0,%lo($LC0)
.option pic0
jal ispalindrome
nop
.option pic2
lui $v0,%hi($LC1)
addiu $a0,$v0,%lo($LC1)
.option pic0
jal ispalindrome
nop
.option pic2
lui $v0,%hi($LC2)
addiu $a0,$v0,%lo($LC2)
.option pic0
jal ispalindrome
nop
.option pic2
lui $v0,%hi($LC3)
addiu $a0,$v0,%lo($LC3)
.option pic0
jal ispalindrome
nop
.option pic2
move $sp,$fp
lw $ra,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $ra
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (GNU) 4.9.1"
.file 1 "palindrome.c"
.section .mdebug.abi32
.previous
.nan legacy
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl ispalindrome
.set nomips16
.set nomicromips
.ent ispalindrome
.type ispalindrome, @function
ispalindrome:
.frame $sp,0,$ra # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
move $v0,$zero
addiu $a0,$a0,1
$L4:
addiu $v0,$v0,-1
lb $a1,-1($a0)
lb $v1,1($v0)
nop
beq $a1,$v1,$L4
addiu $a0,$a0,1
addiu $a0,$a0,-1
xor $v0,$v0,$a0
j $ra
sltu $v0,$v0,1
.set macro
.set reorder
.end ispalindrome
.size ispalindrome, .-ispalindrome
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "Hello\000"
.align 2
$LC1:
.ascii "HellolleH\000"
.align 2
$LC2:
.ascii "HelllleH\000"
.align 2
$LC3:
.ascii "Helllleh\000"
.text
.align 2
.globl main
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $sp,32,$ra # vars= 0, regs= 1/0, args= 16, gp= 8
.mask 0x80000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-32
sw $ra,28($sp)
lui $a0,%hi($LC0)
addiu $a0,$a0,%lo($LC0)
.option pic0
jal ispalindrome
nop
.option pic2
lui $a0,%hi($LC1)
addiu $a0,$a0,%lo($LC1)
.option pic0
jal ispalindrome
nop
.option pic2
lui $a0,%hi($LC2)
addiu $a0,$a0,%lo($LC2)
.option pic0
jal ispalindrome
nop
.option pic2
lui $a0,%hi($LC3)
addiu $a0,$a0,%lo($LC3)
.option pic0
jal ispalindrome
nop
.option pic2
lw $ra,28($sp)
nop
j $ra
addiu $sp,$sp,32
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (GNU) 4.9.1"
.file 1 "palindrome.c"
.section .mdebug.abi32
.previous
.nan legacy
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl ispalindrome
.set nomips16
.set nomicromips
.ent ispalindrome
.type ispalindrome, @function
ispalindrome:
.frame $sp,0,$ra # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
move $v0,$a0
addiu $a0,$a0,1
$L5:
addiu $v0,$v0,-1
lb $a1,-1($a0)
lb $v1,1($v0)
nop
beq $a1,$v1,$L5
addiu $a0,$a0,1
addiu $a0,$a0,-1
xor $v0,$v0,$a0
j $ra
sltu $v0,$v0,1
.set macro
.set reorder
.end ispalindrome
.size ispalindrome, .-ispalindrome
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "Hello\000"
.align 2
$LC1:
.ascii "HellolleH\000"
.align 2
$LC2:
.ascii "HelllleH\000"
.align 2
$LC3:
.ascii "Helllleh\000"
.section .text.startup,"ax",@progbits
.align 2
.globl main
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $sp,32,$ra # vars= 0, regs= 1/0, args= 16, gp= 8
.mask 0x80000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
lui $a0,%hi($LC0)
addiu $sp,$sp,-32
sw $ra,28($sp)
.option pic0
jal ispalindrome
.option pic2
addiu $a0,$a0,%lo($LC0)
lui $a0,%hi($LC1)
.option pic0
jal ispalindrome
.option pic2
addiu $a0,$a0,%lo($LC1)
lui $a0,%hi($LC2)
.option pic0
jal ispalindrome
.option pic2
addiu $a0,$a0,%lo($LC2)
lw $ra,28($sp)
lui $a0,%hi($LC3)
addiu $a0,$a0,%lo($LC3)
.option pic0
j ispalindrome
.option pic2
addiu $sp,$sp,32
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (GNU) 4.9.1"
.file 1 "palindrome.c"
.section .mdebug.abi32
.previous
.nan legacy
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl ispalindrome
.set nomips16
.set nomicromips
.ent ispalindrome
.type ispalindrome, @function
ispalindrome:
.frame $sp,0,$ra # vars= 0, regs= 0/0, args= 0, gp= 0
.mask 0x00000000,0
.fmask 0x00000000,0
.set noreorder
.set nomacro
move $v0,$a0
addiu $a0,$a0,1
$L5:
addiu $v0,$v0,-1
lb $a1,-1($a0)
lb $v1,1($v0)
nop
beq $a1,$v1,$L5
addiu $a0,$a0,1
addiu $a0,$a0,-1
xor $v0,$v0,$a0
j $ra
sltu $v0,$v0,1
.set macro
.set reorder
.end ispalindrome
.size ispalindrome, .-ispalindrome
.section .rodata.str1.4,"aMS",@progbits,1
.align 2
$LC0:
.ascii "Hello\000"
.align 2
$LC1:
.ascii "HellolleH\000"
.align 2
$LC2:
.ascii "HelllleH\000"
.align 2
$LC3:
.ascii "Helllleh\000"
.section .text.startup,"ax",@progbits
.align 2
.globl main
.set nomips16
.set nomicromips
.ent main
.type main, @function
main:
.frame $sp,32,$ra # vars= 0, regs= 1/0, args= 16, gp= 8
.mask 0x80000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
lui $a0,%hi($LC0)
addiu $sp,$sp,-32
sw $ra,28($sp)
.option pic0
jal ispalindrome
.option pic2
addiu $a0,$a0,%lo($LC0)
lui $a0,%hi($LC1)
.option pic0
jal ispalindrome
.option pic2
addiu $a0,$a0,%lo($LC1)
lui $a0,%hi($LC2)
.option pic0
jal ispalindrome
.option pic2
addiu $a0,$a0,%lo($LC2)
lw $ra,28($sp)
lui $a0,%hi($LC3)
addiu $a0,$a0,%lo($LC3)
.option pic0
j ispalindrome
.option pic2
addiu $sp,$sp,32
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (GNU) 4.9.1"
import re
import sys
recodes = {
"0" : "zero",
"1" : "at",
"2" : "v0",
"3" : "v1",
"4" : "a0",
"5" : "a1",
"6" : "a2",
"7" : "a3",
"8" : "t0",
"9" : "t1",
"10" : "t2",
"11" : "t3",
"12" : "t4",
"13" : "t5",
"14" : "t6",
"15" : "t7",
"16" : "s0",
"17" : "s1",
"18" : "s2",
"19" : "s3",
"20" : "s4",
"21" : "s5",
"22" : "s6",
"23" : "s7",
"24" : "t8",
"25" : "t9",
"26" : "k0",
"27" : "k1",
"28" : "gp",
"29" : "sp",
"30" : "s8",
"31" : "ra"}
def recode(matchobj):
orig = matchobj.group(0)
try:
repl = "$"+recodes[orig[1:]]
except KeyError:
repl = orig
return repl
registerre = re.compile(r"\$(\d+)(?=\D|$)")
for line in sys.stdin.read().splitlines():
print re.sub(registerre, recode, line)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment