[HACKERS] [PATCH] Enabling atomics on ARM64 - Mailing list pgsql-hackers
From | Roman Shaposhnik |
---|---|
Subject | [HACKERS] [PATCH] Enabling atomics on ARM64 |
Date | |
Msg-id | CA+ULb+uErkFuXUCCXWHYvnV5KnAyjGUzzRcPA-M0cgO+Hm4RSA@mail.gmail.com Whole thread Raw |
Responses |
Re: [HACKERS] [PATCH] Enabling atomics on ARM64
Re: [HACKERS] [PATCH] Enabling atomics on ARM64 |
List | pgsql-hackers |
Hi! I'd like to offer a forward port from a change I'm contributing the Greenplum code base over here: https://github.com/greenplum-db/gpdb/pull/1983 While it is true that 64 bit atomics are mostly a no-op for Postgres right now, perhaps this patch could still be useful. To make it easier to review, let me repeat the analysis I did on the pull request in this email: I built the following tiny example with -fno-inline-small-functions to make sure you get to see all the guts (without the -fno-inline-small-functions all of this gets inlined and somewhat further optimized): extern pg_atomic_uint64 test1; extern uint64 test2; extern uint64 test3; int main() { pg_atomic_compare_exchange_u64(&test1, &test2, test3); pg_atomic_add_fetch_u64(&test1, 1); pg_atomic_add_fetch_u64(&test1, 2); } Here's the assembly I got from it: Disassembly of section .text: 0000000000000000 <pg_atomic_compare_exchange_u64_impl>: 0: d10083ff sub sp, sp, #0x20 4: f9000fe0 str x0, [sp,#24] 8: f9000be1 str x1, [sp,#16] c: f90007e2 str x2, [sp,#8] 10: f9400fe1 ldr x1, [sp,#24] 14: f9400be0 ldr x0, [sp,#16] 18: f9400003 ldr x3, [x0] 1c: f94007e4 ldr x4, [sp,#8] 20: c85ffc22 ldaxr x2, [x1] 24: eb03005f cmp x2, x3 28: 54000061 b.ne 34 <pg_atomic_compare_exchange_u64_impl+0x34> 2c: c805fc24 stlxr w5, x4, [x1] 30: 35ffff85 cbnz w5, 20 <pg_atomic_compare_exchange_u64_impl+0x20> 34: 1a9f17e1 cset w1, eq 38: 7100003f cmp w1, #0x0 3c: 54000041 b.ne 44 <pg_atomic_compare_exchange_u64_impl+0x44> 40: f9000002 str x2, [x0] 44: 2a0103e0 mov w0, w1 48: 910083ff add sp, sp, #0x20 4c: d65f03c0 ret 0000000000000050 <pg_atomic_fetch_add_u64_impl>: 50: d10043ff sub sp, sp, #0x10 54: f90007e0 str x0, [sp,#8] 58: f90003e1 str x1, [sp] 5c: f94007e0 ldr x0, [sp,#8] 60: f94003e1 ldr x1, [sp] 64: c85f7c02 ldxr x2, [x0] 68: 8b010043 add x3, x2, x1 6c: c804fc03 stlxr w4, x3, [x0] 70: 35ffffa4 cbnz w4, 64 <pg_atomic_fetch_add_u64_impl+0x14> 74: d5033bbf dmb ish 78: aa0203e0 mov x0, x2 7c: 910043ff add sp, sp, #0x10 80: d65f03c0 ret 0000000000000084 <pg_atomic_add_fetch_u64_impl>: 84: a9be7bfd stp x29, x30, [sp,#-32]! 88: 910003fd mov x29, sp 8c: f9000fa0 str x0, [x29,#24] 90: f9000ba1 str x1, [x29,#16] 94: f9400ba1 ldr x1, [x29,#16] 98: f9400fa0 ldr x0, [x29,#24] 9c: 97ffffed bl 50 <pg_atomic_fetch_add_u64_impl> a0: aa0003e1 mov x1, x0 a4: f9400ba0 ldr x0, [x29,#16] a8: 8b000020 add x0, x1, x0 ac: a8c27bfd ldp x29, x30, [sp],#32 b0: d65f03c0 ret 00000000000000b4 <pg_atomic_compare_exchange_u64>: b4: a9bd7bfd stp x29, x30, [sp,#-48]! b8: 910003fd mov x29, sp bc: f90017a0 str x0, [x29,#40] c0: f90013a1 str x1, [x29,#32] c4: f9000fa2 str x2, [x29,#24] c8: f9400fa2 ldr x2, [x29,#24] cc: f94013a1 ldr x1, [x29,#32] d0: f94017a0 ldr x0, [x29,#40] d4: 97ffffcb bl 0 <pg_atomic_compare_exchange_u64_impl> d8: 53001c00 uxtb w0, w0 dc: a8c37bfd ldp x29, x30, [sp],#48 e0: d65f03c0 ret 00000000000000e4 <pg_atomic_add_fetch_u64>: e4: a9be7bfd stp x29, x30, [sp,#-32]! e8: 910003fd mov x29, sp ec: f9000fa0 str x0, [x29,#24] f0: f9000ba1 str x1, [x29,#16] f4: f9400ba1 ldr x1, [x29,#16] f8: f9400fa0 ldr x0, [x29,#24] fc: 97ffffe2 bl 84 <pg_atomic_add_fetch_u64_impl> 100: a8c27bfd ldp x29, x30, [sp],#32 104: d65f03c0 ret 0000000000000108 <main>: 108: a9bf7bfd stp x29, x30, [sp,#-16]! 10c: 910003fd mov x29, sp 110: 90000000 adrp x0, 0 <_GLOBAL_OFFSET_TABLE_> 114: f9400000 ldr x0, [x0] 118: f9400002 ldr x2, [x0] 11c: 90000000 adrp x0, 0 <_GLOBAL_OFFSET_TABLE_> 120: f9400001 ldr x1, [x0] 124: 90000000 adrp x0, 0 <_GLOBAL_OFFSET_TABLE_> 128: f9400000 ldr x0, [x0] 12c: 97ffffe2 bl b4 <pg_atomic_compare_exchange_u64> 130: 90000000 adrp x0, 0 <_GLOBAL_OFFSET_TABLE_> 134: f9400000 ldr x0, [x0] 138: d2800021 mov x1, #0x1 // #1 13c: 97ffffea bl e4 <pg_atomic_add_fetch_u64> 140: 90000000 adrp x0, 0 <_GLOBAL_OFFSET_TABLE_> 144: f9400000 ldr x0, [x0] 148: d2800041 mov x1, #0x2 // #2 14c: 97ffffe6 bl e4 <pg_atomic_add_fetch_u64> 150: 52800000 mov w0, #0x0 // #0 154: a8c17bfd ldp x29, x30, [sp],#16 158: d65f03c0 ret Thanks, Roman. -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
Attachment
pgsql-hackers by date: