Blog 2020/1/27
<- previous | index | next ->
I've been cobbling together a little collection of architectures as part of my journey to learn how to write a compiler.
- x86_64:
Linux buster 4.19.0-6-amd64 #1 SMP Debian 4.19.67-2 (2019-08-28) x86_64 GNU/Linux
- i586:
Linux pic 3.16.0-10-586 #1 Debian 3.16.72-1 (2019-08-13) i586 GNU/Linux
- ARM 5:
Linux pogo 3.18.5-kirkwood-tld-1 #1 PREEMPT Thu Feb 5 17:58:07 PST 2015 armv5tel GNU/Linux
- (actually, Debian's
armel
producesarmv4t
)
- PowerPC:
Linux emac 5.3.0-3-powerpc #1 Debian 5.3.15-1 (2019-12-07) ppc GNU/Linux
- MIPS:
Linux ci20 3.18.3-ci20-1 #1 SMP PREEMPT Wed May 25 10:24:41 UTC 2016 mips GNU/Linux
This blog post contains gcc's assembly output for a series of simple C programs.
- Program 1: return a constant
- Program 2: add two integers
- Program 3: looping
- Program 4: branching
- Program 5: function call
I've also included LLVM IR output from clang.
int main() {
return 42;
}
gcc-4.8 -std=c99 -O0 -S main42.c
.file "main42.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $42, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file "main42.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl $42, %eax
popl %ebp
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "main42.c"
.text
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
mov r3, #42
mov r0, r3
sub sp, fp, #0
@ sp needed
ldr fp, [sp], #4
bx lr
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",%progbits
.file "main42.c"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-16(1)
stw 31,12(1)
mr 31,1
li 9,42
mr 3,9
addi 11,31,16
lwz 31,-4(11)
mr 1,11
blr
.size main,.-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file 1 "main42.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl main
.set nomips16
.ent main
.type main, @function
main:
.frame $fp,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-8
sw $fp,4($sp)
move $fp,$sp
li $2,42 # 0x2a
move $sp,$fp
lw $fp,4($sp)
addiu $sp,$sp,8
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
clang-3.5 -std=c99 -O0 -S -emit-llvm main42.c
; ModuleID = 'main42.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1
ret i32 42
}
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)"}
#include <stdlib.h>
int main(int argc, char** argv) {
return atoi(argv[1]) + atoi(argv[2]);
}
gcc-4.8 -std=c99 -O0 -S plus.c
.file "plus.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $24, %rsp
.cfi_offset 3, -24
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movq -32(%rbp), %rax
addq $8, %rax
movq (%rax), %rax
movq %rax, %rdi
call atoi
movl %eax, %ebx
movq -32(%rbp), %rax
addq $16, %rax
movq (%rax), %rax
movq %rax, %rdi
call atoi
addl %ebx, %eax
addq $24, %rsp
popq %rbx
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file "plus.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
pushl %ebx
andl $-16, %esp
subl $16, %esp
.cfi_offset 3, -12
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
movl %eax, %ebx
movl 12(%ebp), %eax
addl $8, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
addl %ebx, %eax
movl -4(%ebp), %ebx
leave
.cfi_restore 5
.cfi_restore 3
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "plus.c"
.text
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {r4, fp, lr}
add fp, sp, #8
sub sp, sp, #12
str r0, [fp, #-16]
str r1, [fp, #-20]
ldr r3, [fp, #-20]
add r3, r3, #4
ldr r3, [r3]
mov r0, r3
bl atoi
mov r4, r0
ldr r3, [fp, #-20]
add r3, r3, #8
ldr r3, [r3]
mov r0, r3
bl atoi
mov r3, r0
add r3, r4, r3
mov r0, r3
sub sp, fp, #8
@ sp needed
ldmfd sp!, {r4, fp, lr}
bx lr
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",%progbits
.file "plus.c"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-32(1)
mflr 0
stw 0,36(1)
stw 30,24(1)
stw 31,28(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
lwz 9,12(31)
addi 9,9,4
lwz 9,0(9)
mr 3,9
bl atoi
mr 30,3
lwz 9,12(31)
addi 9,9,8
lwz 9,0(9)
mr 3,9
bl atoi
mr 9,3
add 9,30,9
mr 3,9
addi 11,31,32
lwz 0,4(11)
mtlr 0
lwz 30,-8(11)
lwz 31,-4(11)
mr 1,11
blr
.size main,.-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file 1 "plus.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl main
.set nomips16
.ent main
.type main, @function
main:
.frame $fp,40,$31 # vars= 0, regs= 3/0, args= 16, gp= 8
.mask 0xc0010000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-40
sw $31,36($sp)
sw $fp,32($sp)
sw $16,28($sp)
move $fp,$sp
lui $28,%hi(__gnu_local_gp)
addiu $28,$28,%lo(__gnu_local_gp)
.cprestore 16
sw $4,40($fp)
sw $5,44($fp)
lw $2,44($fp)
addiu $2,$2,4
lw $2,0($2)
move $4,$2
lw $2,%call16(atoi)($28)
move $25,$2
jalr $25
nop
lw $28,16($fp)
move $16,$2
lw $2,44($fp)
addiu $2,$2,8
lw $2,0($2)
move $4,$2
lw $2,%call16(atoi)($28)
move $25,$2
jalr $25
nop
lw $28,16($fp)
addu $2,$16,$2
move $sp,$fp
lw $31,36($sp)
lw $fp,32($sp)
lw $16,28($sp)
addiu $sp,$sp,40
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
clang-3.5 -std=c99 -O0 -S -emit-llvm plus.c
; ModuleID = 'plus.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: nounwind uwtable
define i32 @main(i32 %argc, i8** %argv) #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i8**, align 8
store i32 0, i32* %1
store i32 %argc, i32* %2, align 4
store i8** %argv, i8*** %3, align 8
%4 = load i8*** %3, align 8
%5 = getelementptr inbounds i8** %4, i64 1
%6 = load i8** %5, align 8
%7 = call i32 @atoi(i8* %6) #2
%8 = load i8*** %3, align 8
%9 = getelementptr inbounds i8** %8, i64 2
%10 = load i8** %9, align 8
%11 = call i32 @atoi(i8* %10) #2
%12 = add nsw i32 %7, %11
ret i32 %12
}
; Function Attrs: nounwind readonly
declare i32 @atoi(i8*) #1
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readonly "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind readonly }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)"}
#include <stdlib.h>
int main(int argc, char** argv) {
int accum = 0;
int i = atoi(argv[1]);
while (i > 0) {
accum += 1;
i -= 1;
}
return accum;
}
gcc-4.8 -std=c99 -O0 -S loop.c
.file "loop.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movl $0, -4(%rbp)
movq -32(%rbp), %rax
addq $8, %rax
movq (%rax), %rax
movq %rax, %rdi
call atoi
movl %eax, -8(%rbp)
jmp .L2
.L3:
addl $1, -4(%rbp)
subl $1, -8(%rbp)
.L2:
cmpl $0, -8(%rbp)
jg .L3
movl -4(%rbp), %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file "loop.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $32, %esp
movl $0, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
movl %eax, 24(%esp)
jmp .L2
.L3:
addl $1, 28(%esp)
subl $1, 24(%esp)
.L2:
cmpl $0, 24(%esp)
jg .L3
movl 28(%esp), %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "loop.c"
.text
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #16
str r0, [fp, #-16]
str r1, [fp, #-20]
mov r3, #0
str r3, [fp, #-8]
ldr r3, [fp, #-20]
add r3, r3, #4
ldr r3, [r3]
mov r0, r3
bl atoi
str r0, [fp, #-12]
b .L2
.L3:
ldr r3, [fp, #-8]
add r3, r3, #1
str r3, [fp, #-8]
ldr r3, [fp, #-12]
sub r3, r3, #1
str r3, [fp, #-12]
.L2:
ldr r3, [fp, #-12]
cmp r3, #0
bgt .L3
ldr r3, [fp, #-8]
mov r0, r3
sub sp, fp, #4
@ sp needed
ldmfd sp!, {fp, lr}
bx lr
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",%progbits
.file "loop.c"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-48(1)
mflr 0
stw 0,52(1)
stw 31,44(1)
mr 31,1
stw 3,24(31)
stw 4,28(31)
li 9,0
stw 9,8(31)
lwz 9,28(31)
addi 9,9,4
lwz 9,0(9)
mr 3,9
bl atoi
stw 3,12(31)
b .L2
.L3:
lwz 9,8(31)
addi 9,9,1
stw 9,8(31)
lwz 9,12(31)
addi 9,9,-1
stw 9,12(31)
.L2:
lwz 9,12(31)
cmpwi 7,9,0
bgt 7,.L3
lwz 9,8(31)
mr 3,9
addi 11,31,48
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11
blr
.size main,.-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file 1 "loop.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl main
.set nomips16
.ent main
.type main, @function
main:
.frame $fp,40,$31 # vars= 8, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-40
sw $31,36($sp)
sw $fp,32($sp)
move $fp,$sp
lui $28,%hi(__gnu_local_gp)
addiu $28,$28,%lo(__gnu_local_gp)
.cprestore 16
sw $4,40($fp)
sw $5,44($fp)
sw $0,24($fp)
lw $2,44($fp)
addiu $2,$2,4
lw $2,0($2)
move $4,$2
lw $2,%call16(atoi)($28)
move $25,$2
jalr $25
nop
lw $28,16($fp)
sw $2,28($fp)
.option pic0
j $L2
nop
.option pic2
$L3:
lw $2,24($fp)
addiu $2,$2,1
sw $2,24($fp)
lw $2,28($fp)
addiu $2,$2,-1
sw $2,28($fp)
$L2:
lw $2,28($fp)
bgtz $2,$L3
nop
lw $2,24($fp)
move $sp,$fp
lw $31,36($sp)
lw $fp,32($sp)
addiu $sp,$sp,40
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
clang-3.5 -std=c99 -O0 -S -emit-llvm loop.c
; ModuleID = 'loop.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: nounwind uwtable
define i32 @main(i32 %argc, i8** %argv) #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i8**, align 8
%accum = alloca i32, align 4
%i = alloca i32, align 4
store i32 0, i32* %1
store i32 %argc, i32* %2, align 4
store i8** %argv, i8*** %3, align 8
store i32 0, i32* %accum, align 4
%4 = load i8*** %3, align 8
%5 = getelementptr inbounds i8** %4, i64 1
%6 = load i8** %5, align 8
%7 = call i32 @atoi(i8* %6) #2
store i32 %7, i32* %i, align 4
br label %8
; <label>:8 ; preds = %11, %0
%9 = load i32* %i, align 4
%10 = icmp sgt i32 %9, 0
br i1 %10, label %11, label %16
; <label>:11 ; preds = %8
%12 = load i32* %accum, align 4
%13 = add nsw i32 %12, 1
store i32 %13, i32* %accum, align 4
%14 = load i32* %i, align 4
%15 = sub nsw i32 %14, 1
store i32 %15, i32* %i, align 4
br label %8
; <label>:16 ; preds = %8
%17 = load i32* %accum, align 4
ret i32 %17
}
; Function Attrs: nounwind readonly
declare i32 @atoi(i8*) #1
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readonly "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind readonly }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)"}
#include <stdlib.h>
int main(int argc, char** argv) {
if (atoi(argv[1])) {
return 42;
} else {
return 24;
}
}
gcc-4.8 -std=c99 -O0 -S if.c
.file "if.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movq -16(%rbp), %rax
addq $8, %rax
movq (%rax), %rax
movq %rax, %rdi
call atoi
testl %eax, %eax
je .L2
movl $42, %eax
jmp .L3
.L2:
movl $24, %eax
.L3:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file "if.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
testl %eax, %eax
je .L2
movl $42, %eax
jmp .L3
.L2:
movl $24, %eax
.L3:
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "if.c"
.text
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #8
str r0, [fp, #-8]
str r1, [fp, #-12]
ldr r3, [fp, #-12]
add r3, r3, #4
ldr r3, [r3]
mov r0, r3
bl atoi
mov r3, r0
cmp r3, #0
beq .L2
mov r3, #42
b .L3
.L2:
mov r3, #24
.L3:
mov r0, r3
sub sp, fp, #4
@ sp needed
ldmfd sp!, {fp, lr}
bx lr
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",%progbits
.file "if.c"
.section ".text"
.align 2
.globl main
.type main, @function
main:
stwu 1,-32(1)
mflr 0
stw 0,36(1)
stw 31,28(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
lwz 9,12(31)
addi 9,9,4
lwz 9,0(9)
mr 3,9
bl atoi
mr 9,3
cmpwi 7,9,0
beq 7,.L2
li 9,42
b .L3
.L2:
li 9,24
.L3:
mr 3,9
addi 11,31,32
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11
blr
.size main,.-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file 1 "if.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl main
.set nomips16
.ent main
.type main, @function
main:
.frame $fp,32,$31 # vars= 0, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-32
sw $31,28($sp)
sw $fp,24($sp)
move $fp,$sp
lui $28,%hi(__gnu_local_gp)
addiu $28,$28,%lo(__gnu_local_gp)
.cprestore 16
sw $4,32($fp)
sw $5,36($fp)
lw $2,36($fp)
addiu $2,$2,4
lw $2,0($2)
move $4,$2
lw $2,%call16(atoi)($28)
move $25,$2
jalr $25
nop
lw $28,16($fp)
beq $2,$0,$L2
nop
li $2,42 # 0x2a
.option pic0
j $L3
nop
.option pic2
$L2:
li $2,24 # 0x18
$L3:
move $sp,$fp
lw $31,28($sp)
lw $fp,24($sp)
addiu $sp,$sp,32
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
clang-3.5 -std=c99 -O0 -S -emit-llvm if.c
; ModuleID = 'if.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: nounwind uwtable
define i32 @main(i32 %argc, i8** %argv) #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i8**, align 8
store i32 0, i32* %1
store i32 %argc, i32* %2, align 4
store i8** %argv, i8*** %3, align 8
%4 = load i8*** %3, align 8
%5 = getelementptr inbounds i8** %4, i64 1
%6 = load i8** %5, align 8
%7 = call i32 @atoi(i8* %6) #2
%8 = icmp ne i32 %7, 0
br i1 %8, label %9, label %10
; <label>:9 ; preds = %0
store i32 42, i32* %1
br label %11
; <label>:10 ; preds = %0
store i32 24, i32* %1
br label %11
; <label>:11 ; preds = %10, %9
%12 = load i32* %1
ret i32 %12
}
; Function Attrs: nounwind readonly
declare i32 @atoi(i8*) #1
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readonly "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind readonly }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)"}
#include <stdlib.h>
int addfunc(int a, int b) {
return a + b;
}
int main(int argc, char** argv) {
return addfunc(atoi(argv[1]), atoi(argv[2]));
}
gcc-4.8 -std=c99 -O0 -S func.c
.file "func.c"
.text
.globl addfunc
.type addfunc, @function
addfunc:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -8(%rbp), %eax
movl -4(%rbp), %edx
addl %edx, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size addfunc, .-addfunc
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $24, %rsp
.cfi_offset 3, -24
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movq -32(%rbp), %rax
addq $16, %rax
movq (%rax), %rax
movq %rax, %rdi
call atoi
movl %eax, %ebx
movq -32(%rbp), %rax
addq $8, %rax
movq (%rax), %rax
movq %rax, %rdi
call atoi
movl %ebx, %esi
movl %eax, %edi
call addfunc
addq $24, %rsp
popq %rbx
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file "func.c"
.text
.globl addfunc
.type addfunc, @function
addfunc:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl 12(%ebp), %eax
movl 8(%ebp), %edx
addl %edx, %eax
popl %ebp
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size addfunc, .-addfunc
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
pushl %ebx
andl $-16, %esp
subl $16, %esp
.cfi_offset 3, -12
movl 12(%ebp), %eax
addl $8, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
movl %eax, %ebx
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call atoi
movl %ebx, 4(%esp)
movl %eax, (%esp)
call addfunc
movl -4(%ebp), %ebx
leave
.cfi_restore 5
.cfi_restore 3
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.arch armv4t
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 6
.eabi_attribute 34, 0
.eabi_attribute 18, 4
.file "func.c"
.text
.align 2
.global addfunc
.type addfunc, %function
addfunc:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #12
str r0, [fp, #-8]
str r1, [fp, #-12]
ldr r2, [fp, #-8]
ldr r3, [fp, #-12]
add r3, r2, r3
mov r0, r3
sub sp, fp, #0
@ sp needed
ldr fp, [sp], #4
bx lr
.size addfunc, .-addfunc
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {r4, fp, lr}
add fp, sp, #8
sub sp, sp, #12
str r0, [fp, #-16]
str r1, [fp, #-20]
ldr r3, [fp, #-20]
add r3, r3, #4
ldr r3, [r3]
mov r0, r3
bl atoi
mov r4, r0
ldr r3, [fp, #-20]
add r3, r3, #8
ldr r3, [r3]
mov r0, r3
bl atoi
mov r3, r0
mov r0, r4
mov r1, r3
bl addfunc
mov r3, r0
mov r0, r3
sub sp, fp, #8
@ sp needed
ldmfd sp!, {r4, fp, lr}
bx lr
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",%progbits
.file "func.c"
.section ".text"
.align 2
.globl addfunc
.type addfunc, @function
addfunc:
stwu 1,-32(1)
stw 31,28(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
lwz 10,8(31)
lwz 9,12(31)
add 9,10,9
mr 3,9
addi 11,31,32
lwz 31,-4(11)
mr 1,11
blr
.size addfunc,.-addfunc
.align 2
.globl main
.type main, @function
main:
stwu 1,-32(1)
mflr 0
stw 0,36(1)
stw 30,24(1)
stw 31,28(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
lwz 9,12(31)
addi 9,9,4
lwz 9,0(9)
mr 3,9
bl atoi
mr 30,3
lwz 9,12(31)
addi 9,9,8
lwz 9,0(9)
mr 3,9
bl atoi
mr 9,3
mr 3,30
mr 4,9
bl addfunc
mr 9,3
mr 3,9
addi 11,31,32
lwz 0,4(11)
mtlr 0
lwz 30,-8(11)
lwz 31,-4(11)
mr 1,11
blr
.size main,.-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
.section .note.GNU-stack,"",@progbits
.file 1 "func.c"
.section .mdebug.abi32
.previous
.gnu_attribute 4, 1
.abicalls
.text
.align 2
.globl addfunc
.set nomips16
.ent addfunc
.type addfunc, @function
addfunc:
.frame $fp,8,$31 # vars= 0, regs= 1/0, args= 0, gp= 0
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-8
sw $fp,4($sp)
move $fp,$sp
sw $4,8($fp)
sw $5,12($fp)
lw $3,8($fp)
lw $2,12($fp)
addu $2,$3,$2
move $sp,$fp
lw $fp,4($sp)
addiu $sp,$sp,8
j $31
nop
.set macro
.set reorder
.end addfunc
.size addfunc, .-addfunc
.align 2
.globl main
.set nomips16
.ent main
.type main, @function
main:
.frame $fp,40,$31 # vars= 0, regs= 3/0, args= 16, gp= 8
.mask 0xc0010000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
addiu $sp,$sp,-40
sw $31,36($sp)
sw $fp,32($sp)
sw $16,28($sp)
move $fp,$sp
lui $28,%hi(__gnu_local_gp)
addiu $28,$28,%lo(__gnu_local_gp)
.cprestore 16
sw $4,40($fp)
sw $5,44($fp)
lw $2,44($fp)
addiu $2,$2,4
lw $2,0($2)
move $4,$2
lw $2,%call16(atoi)($28)
move $25,$2
jalr $25
nop
lw $28,16($fp)
move $16,$2
lw $2,44($fp)
addiu $2,$2,8
lw $2,0($2)
move $4,$2
lw $2,%call16(atoi)($28)
move $25,$2
jalr $25
nop
lw $28,16($fp)
move $4,$16
move $5,$2
.option pic0
jal addfunc
nop
.option pic2
lw $28,16($fp)
move $sp,$fp
lw $31,36($sp)
lw $fp,32($sp)
lw $16,28($sp)
addiu $sp,$sp,40
j $31
nop
.set macro
.set reorder
.end main
.size main, .-main
.ident "GCC: (Debian 4.8.4-1) 4.8.4"
clang-3.5 -std=c99 -O0 -S -emit-llvm func.c
; ModuleID = 'func.c'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: nounwind uwtable
define i32 @addfunc(i32 %a, i32 %b) #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 %a, i32* %1, align 4
store i32 %b, i32* %2, align 4
%3 = load i32* %1, align 4
%4 = load i32* %2, align 4
%5 = add nsw i32 %3, %4
ret i32 %5
}
; Function Attrs: nounwind uwtable
define i32 @main(i32 %argc, i8** %argv) #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
%3 = alloca i8**, align 8
store i32 0, i32* %1
store i32 %argc, i32* %2, align 4
store i8** %argv, i8*** %3, align 8
%4 = load i8*** %3, align 8
%5 = getelementptr inbounds i8** %4, i64 1
%6 = load i8** %5, align 8
%7 = call i32 @atoi(i8* %6) #2
%8 = load i8*** %3, align 8
%9 = getelementptr inbounds i8** %8, i64 2
%10 = load i8** %9, align 8
%11 = call i32 @atoi(i8* %10) #2
%12 = call i32 @addfunc(i32 %7, i32 %11)
ret i32 %12
}
; Function Attrs: nounwind readonly
declare i32 @atoi(i8*) #1
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readonly "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind readonly }
!llvm.ident = !{!0}
!0 = metadata !{metadata !"Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)"}