Skip to content

Instantly share code, notes, and snippets.

@kumpera
Created September 30, 2015 16:30
Show Gist options
  • Save kumpera/9f747b9c409dad405ca8 to your computer and use it in GitHub Desktop.
Save kumpera/9f747b9c409dad405ca8 to your computer and use it in GitHub Desktop.
/*
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