diff --git a/python/apple-linux-convergence.S b/python/apple-linux-convergence.S new file mode 100644 index 0000000..aae5135 --- /dev/null +++ b/python/apple-linux-convergence.S @@ -0,0 +1,116 @@ +/* Macros to permit the "same" assembly language to build on ARM64 + Linux systems as well as Apple Silicon systems. + + See the fuller documentation at: + https://github.com/pkivolowitz/asm_book/blob/main/macros/README.md + + Perry Kivolowitz + A Gentle Introduction to Assembly Language +*/ + +.macro GLD_PTR xreg, label +#if defined(__APPLE__) + adrp \xreg, _\label@GOTPAGE + ldr \xreg, [\xreg, _\label@GOTPAGEOFF] +#else + ldr \xreg, =\label + ldr \xreg, [\xreg] +#endif +.endm + +.macro GLD_ADDR xreg, label // Get a global address +#if defined(__APPLE__) + adrp \xreg, _\label@GOTPAGE + add \xreg, \xreg, _\label@GOTPAGEOFF +#else + ldr \xreg, =\label +#endif +.endm + +.macro LLD_ADDR xreg, label +#if defined(__APPLE__) + adrp \xreg, \label@PAGE + add \xreg, \xreg, \label@PAGEOFF +#else + ldr \xreg, =\label +#endif +.endm + +.macro LLD_DBL xreg, dreg, label +#if defined(__APPLE__) + adrp \xreg, \label@PAGE + add \xreg, \xreg, \label@PAGEOFF + ldur \dreg, [\xreg] +// fmov \dreg, \xreg +#else + ldr \xreg, =\label + ldur \dreg, [\xreg] +#endif +.endm + +.macro LLD_FLT xreg, sreg, label +#if defined(__APPLE__) + adrp \xreg, \label@PAGE + add \xreg, \xreg, \label@PAGEOFF + ldur \sreg, [\xreg] +#else + ldr \xreg, =\label + ldur \sreg, [\xreg] +#endif +.endm + +.macro GLABEL label +#if defined(__APPLE__) + .global _\label +#else + .global \label +#endif +.endm + +.macro MAIN +#if defined(__APPLE__) +_main: +#else +main: +#endif +.endm + +.macro CRT label +#if defined(__APPLE__) + bl _\label +#else + bl \label +#endif +.endm + +.macro START_PROC // after starting label + .cfi_startproc +.endm + +.macro END_PROC // after the return + .cfi_endproc +.endm + +.macro PUSH_P a, b + stp \a, \b, [sp, -16]! +.endm + +.macro PUSH_R a + str \a, [sp, -16]! +.endm + +.macro POP_P a, b + ldp \a, \b, [sp], 16 +.endm + +.macro POP_R a + ldr \a, [sp], 16 +.endm + +.macro MIN src_a, src_b, dest + csel \dest, \src_a, \src_b, GT +.endm + +.macro MAX src_a, src_b, dest + csel \dest, \src_a, \src_b, LT +.endm diff --git a/python/function.S b/python/function.S new file mode 100644 index 0000000..491375b --- /dev/null +++ b/python/function.S @@ -0,0 +1,19 @@ +#include "apple-linux-convergence.S" + +/* + gcc -fPIC -shared -o my_square.so function.S +*/ + .p2align 2 + .text + GLABEL square + +#if defined(__APPLE__) +_square: +#else +square: +#endif + + mul x0, x0, x0 + ret + + .end diff --git a/python/test.py b/python/test.py new file mode 100644 index 0000000..9209714 --- /dev/null +++ b/python/test.py @@ -0,0 +1,4 @@ +from ctypes import * +so_file = "./my_square.so" +my_funcs = CDLL(so_file) +print(my_funcs.square(10))