Created
September 30, 2015 16:30
-
-
Save kumpera/9f747b9c409dad405ca8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
export PATH=/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH | |
for v7: clang --target=armv7-apple-ios9 -c -O2 -mno-thumb abi.c | |
for v7k: clang --target=armv7k-apple-ios9 -c -O2 -mno-thumb abi.c | |
*/ | |
extern void func_d1 (double a); | |
extern void func_d2(double a, double b); | |
extern void func_d6(double, double, double, double, double, double); | |
extern void func_d8(double, double, double, double, double, double, double, double); | |
extern void func_d10(double, double, double, double, double, double, double, double, double, double); | |
double d_arg; | |
/* | |
v7: | |
00000000 e92d40b0 push {r4, r5, r7, lr} | |
00000004 e28d7008 add r7, sp, #8 | |
00000008 e24dd040 sub sp, sp, #64 | |
0000000c f2c00010 vmov.i32 d16, #0x0 | |
00000010 ec545b30 vmov r5, r4, d16 | |
00000014 e1a00005 mov r0, r5 | |
00000018 e1a01004 mov r1, r4 | |
0000001c ebfffff7 bl _func_d1 | |
00000020 e1a00005 mov r0, r5 | |
00000024 e1a01004 mov r1, r4 | |
00000028 e1a02005 mov r2, r5 | |
0000002c e1a03004 mov r3, r4 | |
00000030 ebfffff2 bl _func_d2 | |
00000034 e3a00000 mov r0, #0 | |
00000038 e1a01004 mov r1, r4 | |
0000003c e58d0004 str r0, [sp, #0x4] | |
00000040 e1a02005 mov r2, r5 | |
00000044 e58d0000 str r0, [sp] | |
00000048 e1a03004 mov r3, r4 | |
0000004c e58d000c str r0, [sp, #0xc] | |
00000050 e58d0008 str r0, [sp, #0x8] | |
00000054 e58d0014 str r0, [sp, #0x14] | |
00000058 e58d0010 str r0, [sp, #0x10] | |
0000005c e58d001c str r0, [sp, #0x1c] | |
00000060 e58d0018 str r0, [sp, #0x18] | |
00000064 e58d0020 str r0, [sp, #0x20] | |
00000068 e58d0024 str r0, [sp, #0x24] | |
0000006c e58d0028 str r0, [sp, #0x28] | |
00000070 e58d002c str r0, [sp, #0x2c] | |
00000074 e58d0030 str r0, [sp, #0x30] | |
00000078 e58d0034 str r0, [sp, #0x34] | |
0000007c e58d0038 str r0, [sp, #0x38] | |
00000080 e58d003c str r0, [sp, #0x3c] | |
00000084 e1a00005 mov r0, r5 | |
00000088 ebffffdc bl _func_d10 | |
0000008c e247d008 sub sp, r7, #8 | |
00000090 e8bd80b0 pop {r4, r5, r7, pc} | |
v7k: | |
00000000 e92d4080 push {r7, lr} | |
00000004 e1a0700d mov r7, sp | |
00000008 ed2d8b02 vpush {d8} | |
0000000c e24dd010 sub sp, sp, #16 | |
00000010 f2808010 vmov.i32 d8, #0x0 | |
00000014 f2280118 vorr d0, d8, d8 | |
00000018 ebfffff8 bl _func_d1 | |
0000001c f2280118 vorr d0, d8, d8 | |
00000020 f2281118 vorr d1, d8, d8 | |
00000024 ebfffff5 bl _func_d2 | |
00000028 f2280118 vorr d0, d8, d8 | |
0000002c e3a00000 mov r0, #0 | |
00000030 f2281118 vorr d1, d8, d8 | |
00000034 e58d0000 str r0, [sp] | |
00000038 f2282118 vorr d2, d8, d8 | |
0000003c e58d0004 str r0, [sp, #0x4] | |
00000040 f2283118 vorr d3, d8, d8 | |
00000044 e58d0008 str r0, [sp, #0x8] | |
00000048 f2284118 vorr d4, d8, d8 | |
0000004c e58d000c str r0, [sp, #0xc] | |
00000050 f2285118 vorr d5, d8, d8 | |
00000054 f2286118 vorr d6, d8, d8 | |
00000058 f2287118 vorr d7, d8, d8 | |
0000005c ebffffe7 bl _func_d10 | |
00000060 e247d008 sub sp, r7, #8 | |
00000064 ecbd8b02 vpop {d8} | |
00000068 e8bd8080 pop {r7, pc} | |
v7: | |
pass 2 doubles on r0/r1 and r2/r3 | |
FP regs are all scratch | |
v7k: | |
pass 8 doubles on d0-d7 | |
FP regs d0-d7 are scratch | |
d8 is callee saved (not sure about others) | |
*/ | |
void test_double (void) | |
{ | |
double t = d_arg; | |
func_d1 (0); | |
func_d2 (0, 0); | |
func_d10 (0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | |
} | |
/* | |
v7: | |
00000094 e92d4090 push {r4, r7, lr} | |
00000098 e28d7004 add r7, sp, #4 | |
0000009c e24d4040 sub r4, sp, #64 | |
000000a0 e7c3401f bfc r4, #0, #4 | |
000000a4 e1a0d004 mov sp, r4 | |
000000a8 f40482ed vst1.64 {d8, d9, d10, d11}, [r4:128]! | |
000000ac f404c2ef vst1.64 {d12, d13, d14, d15}, [r4:128] | |
000000b0 e24dd050 sub sp, sp, #80 | |
000000b4 ec432b18 vmov d8, r2, r3 | |
000000b8 ec410b1a vmov d10, r0, r1 | |
000000bc ee8acb08 vdiv.f64 d12, d10, d8 | |
000000c0 ee3aeb08 vadd.f64 d14, d10, d8 | |
000000c4 ee2a9b08 vmul.f64 d9, d10, d8 | |
000000c8 ee2ebb0c vmul.f64 d11, d14, d12 | |
000000cc ee7e0b0c vadd.f64 d16, d14, d12 | |
000000d0 ee792b4b vsub.f64 d18, d9, d11 | |
000000d4 ee80dba2 vdiv.f64 d13, d16, d18 | |
000000d8 eece0b0c vdiv.f64 d16, d14, d12 | |
000000dc eec92b0b vdiv.f64 d18, d9, d11 | |
000000e0 ee80fba2 vdiv.f64 d15, d16, d18 | |
000000e4 ee7d4b0d vadd.f64 d20, d13, d13 | |
000000e8 ee6b2b0a vmul.f64 d18, d11, d10 | |
000000ec ee740bcc vsub.f64 d16, d20, d12 | |
000000f0 ed8deb00 vstr d14, [sp] | |
000000f4 ed8dcb02 vstr d12, [sp, #8] | |
000000f8 ed8d9b04 vstr d9, [sp, #16] | |
000000fc ed8dbb06 vstr d11, [sp, #24] | |
00000100 ed8ddb08 vstr d13, [sp, #32] | |
00000104 ed8dfb0a vstr d15, [sp, #40] | |
00000108 edcd2b0c vstr d18, [sp, #48] | |
0000010c edcd0b12 vstr d16, [sp, #72] | |
00000110 edcd2b10 vstr d18, [sp, #64] | |
00000114 edcd0b0e vstr d16, [sp, #56] | |
00000118 ebffffb8 bl _func_d10 | |
0000011c ee7e0b0e vadd.f64 d16, d14, d14 | |
00000120 e28d4050 add r4, sp, #80 | |
00000124 ee700b8c vadd.f64 d16, d16, d12 | |
00000128 ee790b20 vadd.f64 d16, d9, d16 | |
0000012c ee7b0b20 vadd.f64 d16, d11, d16 | |
00000130 ee6c2b0a vmul.f64 d18, d12, d10 | |
00000134 ee794b08 vadd.f64 d20, d9, d8 | |
00000138 ee706bcd vsub.f64 d22, d16, d13 | |
0000013c ee742be2 vsub.f64 d18, d20, d18 | |
00000140 ee764b8f vadd.f64 d20, d22, d15 | |
00000144 ee7d6b0f vadd.f64 d22, d13, d15 | |
00000148 ee742be2 vsub.f64 d18, d20, d18 | |
0000014c eddd4b10 vldr d20, [sp, #64] | |
00000150 ee600ba2 vmul.f64 d16, d16, d18 | |
00000154 ee744ba6 vadd.f64 d20, d20, d22 | |
00000158 eddd2b12 vldr d18, [sp, #72] | |
0000015c f42482ed vld1.64 {d8, d9, d10, d11}, [r4:128]! | |
00000160 ee722ba4 vadd.f64 d18, d18, d20 | |
00000164 ee700ba2 vadd.f64 d16, d16, d18 | |
00000168 f424c2ef vld1.64 {d12, d13, d14, d15}, [r4:128] | |
0000016c ec510b30 vmov r0, r1, d16 | |
00000170 e247d004 sub sp, r7, #4 | |
00000174 e8bd8090 pop {r4, r7, pc} | |
v7k: | |
0000006c e92d4080 push {r7, lr} | |
00000070 e1a0700d mov r7, sp | |
00000074 ed2d8b10 vpush {d8, d9, d10, d11, d12, d13, d14, d15} | |
00000078 e24dd028 sub sp, sp, #40 | |
0000007c eeb08b41 vmov.f64 d8, d1 | |
00000080 eeb0ab40 vmov.f64 d10, d0 | |
00000084 ee8acb08 vdiv.f64 d12, d10, d8 | |
00000088 ee3aeb08 vadd.f64 d14, d10, d8 | |
0000008c ee2a9b08 vmul.f64 d9, d10, d8 | |
00000090 ee2ebb0c vmul.f64 d11, d14, d12 | |
00000094 eece4b0c vdiv.f64 d20, d14, d12 | |
00000098 eec96b0b vdiv.f64 d22, d9, d11 | |
0000009c ee7e0b0c vadd.f64 d16, d14, d12 | |
000000a0 ee792b4b vsub.f64 d18, d9, d11 | |
000000a4 ee80dba2 vdiv.f64 d13, d16, d18 | |
000000a8 ee84fba6 vdiv.f64 d15, d20, d22 | |
000000ac ee7d0b0d vadd.f64 d16, d13, d13 | |
000000b0 ee6b2b0a vmul.f64 d18, d11, d10 | |
000000b4 ee700bcc vsub.f64 d16, d16, d12 | |
000000b8 eeb02b4e vmov.f64 d2, d14 | |
000000bc eeb03b4c vmov.f64 d3, d12 | |
000000c0 eeb04b49 vmov.f64 d4, d9 | |
000000c4 eeb05b4b vmov.f64 d5, d11 | |
000000c8 eeb06b4d vmov.f64 d6, d13 | |
000000cc eeb07b4f vmov.f64 d7, d15 | |
000000d0 edcd2b00 vstr d18, [sp] | |
000000d4 edcd2b06 vstr d18, [sp, #24] | |
000000d8 edcd0b08 vstr d16, [sp, #32] | |
000000dc edcd0b02 vstr d16, [sp, #8] | |
000000e0 ebffffc6 bl _func_d10 | |
000000e4 ee7e0b0e vadd.f64 d16, d14, d14 | |
000000e8 ee700b8c vadd.f64 d16, d16, d12 | |
000000ec ee790b20 vadd.f64 d16, d9, d16 | |
000000f0 ee7b0b20 vadd.f64 d16, d11, d16 | |
000000f4 ee6c2b0a vmul.f64 d18, d12, d10 | |
000000f8 ee794b08 vadd.f64 d20, d9, d8 | |
000000fc ee706bcd vsub.f64 d22, d16, d13 | |
00000100 ee742be2 vsub.f64 d18, d20, d18 | |
00000104 ee764b8f vadd.f64 d20, d22, d15 | |
00000108 ee7d6b0f vadd.f64 d22, d13, d15 | |
0000010c ee742be2 vsub.f64 d18, d20, d18 | |
00000110 eddd4b06 vldr d20, [sp, #24] | |
00000114 ee600ba2 vmul.f64 d16, d16, d18 | |
00000118 ee744ba6 vadd.f64 d20, d20, d22 | |
0000011c eddd2b08 vldr d18, [sp, #32] | |
00000120 ee722ba4 vadd.f64 d18, d18, d20 | |
00000124 ee300ba2 vadd.f64 d0, d16, d18 | |
00000128 e247d040 sub sp, r7, #64 | |
0000012c ecbd8b08 vpop {d8, d9, d10, d11} | |
00000130 ecbdcb08 vpop {d12, d13, d14, d15} | |
00000134 e8bd8080 pop {r7, pc} | |
v7 and v7k: | |
FP regs d8-d15 are callee saved | |
*/ | |
double test_double_caller_safe (double a, double b) | |
{ | |
double c = a + b; | |
double d = a / b; | |
double e = a * b; | |
double f = c * d; | |
double f2 = (c + d) / (e - f); | |
double f3 = (c / d) / ( e / f); | |
double f4 = a * f; | |
double f5 = f2 + f2 - d; | |
func_d10 (a, b, c, d, e, f, f2, f3, f4, f5); | |
double g = a + b + c + d + e + f; | |
double h = (g - f2 + f3) - (e + b - a * d); | |
double i = f2 + f3 + f4 + f5; | |
return g * h + i; | |
} | |
typedef struct { | |
double a; | |
double b; | |
double c; | |
double d; | |
double e; | |
} mixed; | |
extern int func_mixed1 (mixed m); | |
int pass_struct () | |
{ | |
mixed m = { 1, 2, 3, 4, 0 }; | |
return func_mixed1 (m) * 5; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment