diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/aarch64/start.S | 6 | ||||
-rw-r--r-- | sysdeps/aarch64/sysdep.h | 14 |
2 files changed, 17 insertions, 3 deletions
diff --git a/sysdeps/aarch64/start.S b/sysdeps/aarch64/start.S index df1c642c12..c20433ad73 100644 --- a/sysdeps/aarch64/start.S +++ b/sysdeps/aarch64/start.S @@ -71,9 +71,9 @@ _start: ldr PTR_REG (4), [x4, #:got_lo12:__libc_csu_fini] #else /* Set up the other arguments in registers */ - ldr PTR_REG (0), =main - ldr PTR_REG (3), =__libc_csu_init - ldr PTR_REG (4), =__libc_csu_fini + MOVL (0, main) + MOVL (3, __libc_csu_init) + MOVL (4, __libc_csu_fini) #endif /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, diff --git a/sysdeps/aarch64/sysdep.h b/sysdeps/aarch64/sysdep.h index a749a707ec..aba18de4d7 100644 --- a/sysdeps/aarch64/sysdep.h +++ b/sysdeps/aarch64/sysdep.h @@ -137,6 +137,20 @@ ldr PTR_REG (T), [x##T, #:got_lo12:EXPR]; \ OP PTR_REG (R), [x##T]; +/* Load an immediate into R. + Note R is a register number and not a register name. */ +#ifdef __LP64__ +# define MOVL(R, NAME) \ + movz PTR_REG (R), #:abs_g3:NAME; \ + movk PTR_REG (R), #:abs_g2_nc:NAME; \ + movk PTR_REG (R), #:abs_g1_nc:NAME; \ + movk PTR_REG (R), #:abs_g0_nc:NAME; +#else +# define MOVL(R, NAME) \ + movz PTR_REG (R), #:abs_g1:NAME; \ + movk PTR_REG (R), #:abs_g0_nc:NAME; +#endif + /* Since C identifiers are not normally prefixed with an underscore on this system, the asm identifier `syscall_error' intrudes on the C name space. Make sure we use an innocuous name. */ |