[RFC/PATCH] x86_64 port (attempt 2)

Jeff Johnston jjohnstn@redhat.com
Wed Aug 22 12:21:00 GMT 2007


Hans,

   A couple of questions/comments.

   Is anyone pursuing the gcc patch you mentioned?  That patch is pretty 
old (dated March 2005).

   I would have assumed in your patch that you would keep/reuse use some 
of the i386 assembler routines that you didn't have specific 
replacements for.  For example, you don't have a libm_machine_dir which 
implements the fast math library routines.  You also don't have some 
other string routines that are implemented in libc/machine/i386.  Is 
there some reason you decided not to do this?

   Any requirement for x86_64 libgloss (cygmon)?

   I noted a typo in setjmp.h for the __x86_64__ flag (missing a 
trailing underscore).

-- Jeff J.

Hans Kester wrote:
> Here is the revised and now complete port for the x86_64. The
> generated and rather big files from aclocal/autoconfig/automake are
> not listed as diffs below but can be downloaded from here along with
> the other changed files:
> http://www.xs4all.nl/~ellips/Newlib/x86_64.tar.bz2
> 
> Note that the current GCC does not allow building a x86_64-elf target,
> but with this patch you can:
> http://gcc.gnu.org/ml/gcc-patches/2005-03/msg01592.html
> 
> Regards,
> 
> Hans Kester
> 
> 
> 
> Index: newlib/ChangeLog
> ===================================================================
> RCS file: /cvs/src/src/newlib/ChangeLog,v
> retrieving revision 1.1071
> diff -u -r1.1071 ChangeLog
> --- newlib/ChangeLog    3 Aug 2007 21:03:40 -0000       1.1071
> +++ newlib/ChangeLog    15 Aug 2007 08:53:35 -0000
> @@ -1,3 +1,19 @@
> +2007-08-10  Hans Kester  <hans.kester@ellips.nl>
> +
> +       * configure.host: Added support for x86_64.
> +       * libc/include/machine/ieeefp.h: Define __IEEE_LITTLE_ENDIAN for x86_64.
> 
> +       * libc/include/machine/setjmp.h: Define _JBTYPE and _JBLEN for x86_64.
> +       * libc/machine/x86_64/aclocal.m4: Generated.
> +       * libc/machine/x86_64/configure.in: New.
> +       * libc/machine/x86_64/configure: Generated.
> +       * libc/machine/x86_64/Makefile.am: New.
> +       * libc/machine/x86_64/Makefile.in: Generated.
> +       * libc/machine/x86_64/setjmp.S: New.
> +       * libc/machine/x86_64/memcpy.S: New.
> +       * libc/machine/x86_64/memset.S: New.
> +       * libc/machine/configure.in: Added support for x86_64.
> +       * libc/machine/configure: Regenerated.
> +
>  2007-08-03  Ralf Corsepius  <ralf.corsepius@rtems.org>
> 
>        * libc/include/tar.h: New.
> 
> 
> Index: newlib/configure.host
> ===================================================================
> RCS file: /cvs/src/src/newlib/configure.host,v
> retrieving revision 1.94
> diff -u -r1.94 configure.host
> --- newlib/configure.host       11 May 2007 20:09:00 -0000      1.94
> +++ newlib/configure.host       15 Aug 2007 08:54:48 -0000
> @@ -156,6 +156,9 @@
>                ;;
>        esac
>        ;;
> +  x86_64)
> +       machine_dir=x86_64
> +       ;;
>   ia64*)
>        ;;
>   iq2000)
> 
> 
> Index: newlib/libc/include/machine/ieeefp.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/include/machine/ieeefp.h,v
> retrieving revision 1.31
> diff -u -r1.31 ieeefp.h
> --- newlib/libc/include/machine/ieeefp.h        26 Apr 2007 19:23:37 -00001.31
> +++ newlib/libc/include/machine/ieeefp.h        15 Aug 2007 08:57:54 -0000
> @@ -306,6 +306,10 @@
>  #define __IEEE_LITTLE_ENDIAN
>  #endif
> 
> +#ifdef __x86_64__
> +#define __IEEE_LITTLE_ENDIAN
> +#endif
> +
>  #ifndef __IEEE_BIG_ENDIAN
>  #ifndef __IEEE_LITTLE_ENDIAN
>  #error Endianess not declared!!
> 
> 
> Index: newlib/libc/include/machine/setjmp.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/include/machine/setjmp.h,v
> retrieving revision 1.32
> diff -u -r1.32 setjmp.h
> --- newlib/libc/include/machine/setjmp.h        18 Dec 2006 16:48:03 -00001.32
> +++ newlib/libc/include/machine/setjmp.h        15 Aug 2007 08:57:54 -0000
> @@ -67,6 +67,11 @@
>  #endif
>  #endif
> 
> +#ifdef __x86_64_
> +#define _JBTYPE long long
> +#define _JBLEN  8
> +#endif
> +
>  #ifdef __i960__
>  #define _JBLEN 35
>  #endif
> 
> 
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/configure.in,v
> retrieving revision 1.7
> diff -u -r1.7 configure.in
> --- newlib/libc/machine/configure.in    24 May 2007 17:33:31 -0000      1.7
> +++ newlib/libc/machine/configure.in    15 Aug 2007 08:59:19 -0000
> @@ -35,6 +35,7 @@
>        h8500) AC_CONFIG_SUBDIRS(h8500) ;;
>        hppa) AC_CONFIG_SUBDIRS(hppa) ;;
>        i386) AC_CONFIG_SUBDIRS(i386) ;;
> +       x86_64) AC_CONFIG_SUBDIRS(x86_64) ;;
>        i960) AC_CONFIG_SUBDIRS(i960) ;;
>        iq2000) AC_CONFIG_SUBDIRS(iq2000) ;;
>        m32c) AC_CONFIG_SUBDIRS(m32c) ;;
> 
> 
> Index: newlib/libc/machine/x86_64/Makefile.am
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/x86_64/Makefile.am
> diff -u -N newlib/libc/machine/x86_64/Makefile.am
> --- /dev/null   2007-08-15 11:13:46.414196600 +0200
> +++ newlib/libc/machine/x86_64/Makefile.am      2007-08-14
> 16:04:30.230005100 +0200
> @@ -0,0 +1,16 @@
> +## Process this file with automake to generate Makefile.in
> +
> +AUTOMAKE_OPTIONS = cygnus
> +
> +INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
> +
> +AM_CCASFLAGS = $(INCLUDES)
> +
> +noinst_LIBRARIES = lib.a
> +
> +lib_a_SOURCES = setjmp.S memcpy.S memset.S
> +lib_a_CCASFLAGS=$(AM_CCASFLAGS)
> +lib_a_CFLAGS = $(AM_CFLAGS)
> +
> +ACLOCAL_AMFLAGS = -I ../../.. -I ../../../..
> +CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
> 
> 
> 
> Index: newlib/libc/machine/x86_64/configure.in
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/x86_64/configure.in
> diff -u -N newlib/libc/machine/x86_64/configure.in
> --- /dev/null   2007-08-15 11:22:21.919025000 +0200
> +++ newlib/libc/machine/x86_64/configure.in     2007-08-15
> 11:21:10.003598600 +0200
> @@ -0,0 +1,14 @@
> +dnl This is the newlib/libc/machine/x86_64 configure.in file.
> +dnl Process this file with autoconf to produce a configure script.
> +
> +AC_PREREQ(2.59)
> +AC_INIT([newlib],[NEWLIB_VERSION])
> +AC_CONFIG_SRCDIR([Makefile.am])
> +
> +dnl Can't be done in NEWLIB_CONFIGURE because that confuses automake.
> +AC_CONFIG_AUX_DIR(../../../..)
> +
> +NEWLIB_CONFIGURE(../../..)
> +
> +AC_CONFIG_FILES([Makefile])
> +AC_OUTPUT
> 
> 
> 
> Index: newlib/libc/machine/x86_64/setjmp.S
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/x86_64/setjmp.S
> diff -u -N newlib/libc/machine/x86_64/setjmp.S
> --- /dev/null   2007-08-15 11:23:28.200946400 +0200
> +++ newlib/libc/machine/x86_64/setjmp.S 2007-08-14 16:50:18.480450200 +0200
> @@ -0,0 +1,53 @@
> +/*
> + * ====================================================
> + * Copyright (C) 2007 by Ellips BV. All rights reserved.
> + *
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> + /*
> + **  jmp_buf:
> + **   rbx rbp r12 r13 r14 r15 rsp rip
> + **   0   8   16  24  32  40  48  56
> + */
> +
> +  #include "x86_64mach.h"
> +
> +  .global SYM (setjmp)
> +  .global SYM (longjmp)
> +  SOTYPE_FUNCTION(setjmp)
> +  SOTYPE_FUNCTION(longjmp)
> +
> +SYM (setjmp):
> +  movq    rbx,  0 (rdi)
> +  movq    rbp,  8 (rdi)
> +  movq    r12, 16 (rdi)
> +  movq    r13, 24 (rdi)
> +  movq    r14, 32 (rdi)
> +  movq    r15, 40 (rdi)
> +  leaq    8 (rsp), rax
> +  movq    rax, 48 (rdi)
> +  movq    (rsp), rax
> +  movq    rax, 56 (rdi)
> +  movq    $0, rax
> +  ret
> +
> +SYM (longjmp):
> +  movq    rsi, rax        /* Return value */
> +
> +  movq     8 (rdi), rbp
> +
> +  __CLI
> +  movq    48 (rdi), rsp
> +  pushq   56 (rdi)
> +  movq     0 (rdi), rbx
> +  movq    16 (rdi), r12
> +  movq    24 (rdi), r13
> +  movq    32 (rdi), r14
> +  movq    40 (rdi), r15
> +  __STI
> +
> +  ret
> 
> 
> Index: newlib/libc/machine/x86_64/memcpy.S
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/x86_64/memcpy.S
> diff -u -N newlib/libc/machine/x86_64/memcpy.S
> --- /dev/null   2007-08-15 11:25:56.230053800 +0200
> +++ newlib/libc/machine/x86_64/memcpy.S 2007-08-14 15:37:53.662509100 +0200
> @@ -0,0 +1,113 @@
> +/*
> + * ====================================================
> + * Copyright (C) 2007 by Ellips BV. All rights reserved.
> + *
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +  #include "x86_64mach.h"
> +
> +  .global SYM (memcpy)
> +  SOTYPE_FUNCTION(memcpy)
> +
> +SYM (memcpy):
> +  movq    rdi, rax                /* Store destination in return value */
> +  cmpq    $16, rdx
> +  jb      byte_copy
> +
> +  movq    rdi, r8                 /* Align destination on quad word boundary */
> 
> +  andq    $7, r8
> +  jz      quadword_aligned
> +  movq    $8, rcx
> +  subq    r8, rcx
> +  subq    rcx, rdx
> +  rep     movsb
> +
> +quadword_aligned:
> +  cmpq    $256, rdx
> +  jb      quadword_copy
> +
> +  movq    rax, -8  (rsp)
> +  movq    r12, -16 (rsp)
> +  movq    r13, -24 (rsp)
> +  movq    r14, -32 (rsp)
> +
> +  movq    rdx, rcx                /* Copy 128 bytes at a time with minimum cach
> e polution */
> +  shrq    $7, rcx
> +
> +  .p2align 4
> +loop:
> +  prefetchnta   768 (rsi)
> +  prefetchnta   832 (rsi)
> +
> +  movq       (rsi), rax
> +  movq     8 (rsi), r8
> +  movq    16 (rsi), r9
> +  movq    24 (rsi), r10
> +  movq    32 (rsi), r11
> +  movq    40 (rsi), r12
> +  movq    48 (rsi), r13
> +  movq    56 (rsi), r14
> +
> +  movntiq rax,    (rdi)
> +  movntiq r8 ,  8 (rdi)
> +  movntiq r9 , 16 (rdi)
> +  movntiq r10, 24 (rdi)
> +  movntiq r11, 32 (rdi)
> +  movntiq r12, 40 (rdi)
> +  movntiq r13, 48 (rdi)
> +  movntiq r14, 56 (rdi)
> +
> +  movq     64 (rsi), rax
> +  movq     72 (rsi), r8
> +  movq     80 (rsi), r9
> +  movq     88 (rsi), r10
> +  movq     96 (rsi), r11
> +  movq    104 (rsi), r12
> +  movq    112 (rsi), r13
> +  movq    120 (rsi), r14
> +
> +  movntiq rax,  64 (rdi)
> +  movntiq r8 ,  72 (rdi)
> +  movntiq r9 ,  80 (rdi)
> +  movntiq r10,  88 (rdi)
> +  movntiq r11,  96 (rdi)
> +  movntiq r12, 104 (rdi)
> +  movntiq r13, 112 (rdi)
> +  movntiq r14, 120 (rdi)
> +
> +  leaq    128 (rsi), rsi
> +  leaq    128 (rdi), rdi
> +
> +  dec     rcx
> +  jnz     loop
> +
> +  sfence
> +  movq    rdx, rcx
> +  andq    $127, rcx
> +  rep     movsb
> +  movq    -8  (rsp), rax
> +  movq    -16 (rsp), r12
> +  movq    -24 (rsp), r13
> +  movq    -32 (rsp), r14
> +  ret
> +
> +
> +byte_copy:
> +  movq    rdx, rcx
> +  rep     movsb
> +  ret
> +
> +
> +quadword_copy:
> +  movq    rdx, rcx
> +  shrq    $3, rcx
> +  .p2align 4
> +  rep     movsq
> +  movq    rdx, rcx
> +  andq    $7, rcx
> +  rep     movsb                   /* Copy the remaining bytes */
> +  ret
> 
> 
> Index: newlib/libc/machine/x86_64/memset.S
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/x86_64/memset.S
> diff -u -N newlib/libc/machine/x86_64/memset.S
> --- /dev/null   2007-08-15 11:27:28.060279800 +0200
> +++ newlib/libc/machine/x86_64/memset.S 2007-08-14 16:11:09.325121100 +0200
> @@ -0,0 +1,88 @@
> +/*
> + * ====================================================
> + * Copyright (C) 2007 by Ellips BV. All rights reserved.
> + *
> + * Permission to use, copy, modify, and distribute this
> + * software is freely granted, provided that this notice
> + * is preserved.
> + * ====================================================
> + */
> +
> +  #include "x86_64mach.h"
> +
> +  .global SYM (memset)
> +  SOTYPE_FUNCTION(memset)
> +
> +SYM (memset):
> +  movq    rdi, r9                 /* Save return value */
> +  movq    rsi, rax
> +  movq    rdx, rcx
> +  cmpq    $16, rdx
> +  jb      byte_set
> +
> +  movq    rdi, r8                 /* Align on quad word boundary */
> +  andq    $7, r8
> +  jz      quadword_aligned
> +  movq    $8, rcx
> +  subq    r8, rcx
> +  subq    rcx, rdx
> +  rep     stosb
> +  movq    rdx, rcx
> +
> +quadword_aligned:
> +  movabs  $0x0101010101010101, r8
> +  movzbl  sil, eax
> +  imul    r8, rax
> +  cmpq    $256, rdx
> +  jb      quadword_set
> +
> +  shrq    $7, rcx                 /* Store 128 bytes at a time with minimum cac
> he polution */
> +
> +  .p2align 4
> +loop:
> +  movntiq rax,     (rdi)
> +  movntiq rax,   8 (rdi)
> +  movntiq rax,  16 (rdi)
> +  movntiq rax,  24 (rdi)
> +  movntiq rax,  32 (rdi)
> +  movntiq rax,  40 (rdi)
> +  movntiq rax,  48 (rdi)
> +  movntiq rax,  56 (rdi)
> +  movntiq rax,  64 (rdi)
> +  movntiq rax,  72 (rdi)
> +  movntiq rax,  80 (rdi)
> +  movntiq rax,  88 (rdi)
> +  movntiq rax,  96 (rdi)
> +  movntiq rax, 104 (rdi)
> +  movntiq rax, 112 (rdi)
> +  movntiq rax, 120 (rdi)
> +
> +  leaq    128 (rdi), rdi
> +
> +  dec     rcx
> +  jnz     loop
> +
> +  sfence
> +  movq    rdx, rcx
> +  andq    $127, rcx
> +  rep     stosb
> +  movq    r9, rax
> +  ret
> +
> +
> +byte_set:
> +  rep     stosb
> +  movq    r9, rax
> +  ret
> +
> +
> +quadword_set:
> +  shrq    $3, rcx
> +  .p2align 4
> +  rep     stosq
> +  movq    rdx, rcx
> +  andq    $7, rcx
> +  rep     stosb                   /* Store the remaining bytes */
> +  movq    r9, rax
> +  ret
> +
> 
> 
> Index: newlib/libc/machine/x86_64/x86_64mach.h
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/x86_64/x86_64mach.h
> diff -u -N newlib/libc/machine/x86_64/x86_64mach.h
> --- /dev/null   2007-08-15 11:40:31.116537800 +0200
> +++ newlib/libc/machine/x86_64/x86_64mach.h     2007-08-14
> 16:10:54.362561100 +0200
> @@ -0,0 +1,113 @@
> +/*
> + ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
> + ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> + */
> +
> +#ifndef __USER_LABEL_PREFIX__
> +#define __USER_LABEL_PREFIX__ _
> +#endif
> +
> +#define __REG_PREFIX__ %
> +
> +/* ANSI concatenation macros.  */
> +
> +#define CONCAT1(a, b) CONCAT2(a, b)
> +#define CONCAT2(a, b) a##b
> +
> +/* Use the right prefix for global labels.  */
> +
> +#define SYM(x) CONCAT1(__USER_LABEL_PREFIX__, x)
> +
> +/* Use the right prefix for registers.  */
> +
> +#define REG(x) CONCAT1(__REG_PREFIX__, x)
> +
> +#define rax REG(rax)
> +#define rbx REG(rbx)
> +#define rcx REG(rcx)
> +#define rdx REG(rdx)
> +#define rsi REG(rsi)
> +#define rdi REG(rdi)
> +#define rbp REG(rbp)
> +#define rsp REG(rsp)
> +
> +#define r8  REG(r8)
> +#define r9  REG(r9)
> +#define r10 REG(r10)
> +#define r11 REG(r11)
> +#define r12 REG(r12)
> +#define r13 REG(r13)
> +#define r14 REG(r14)
> +#define r15 REG(r15)
> +
> +#define eax REG(eax)
> +#define ebx REG(ebx)
> +#define ecx REG(ecx)
> +#define edx REG(edx)
> +#define esi REG(esi)
> +#define edi REG(edi)
> +#define ebp REG(ebp)
> +#define esp REG(esp)
> +
> +#define st0 REG(st)
> +#define st1 REG(st(1))
> +#define st2 REG(st(2))
> +#define st3 REG(st(3))
> +#define st4 REG(st(4))
> +#define st5 REG(st(5))
> +#define st6 REG(st(6))
> +#define st7 REG(st(7))
> +
> +#define ax REG(ax)
> +#define bx REG(bx)
> +#define cx REG(cx)
> +#define dx REG(dx)
> +
> +#define ah REG(ah)
> +#define bh REG(bh)
> +#define ch REG(ch)
> +#define dh REG(dh)
> +
> +#define al REG(al)
> +#define bl REG(bl)
> +#define cl REG(cl)
> +#define dl REG(dl)
> +
> +#define sil REG(sil)
> +
> +#define mm1 REG(mm1)
> +#define mm2 REG(mm2)
> +#define mm3 REG(mm3)
> +#define mm4 REG(mm4)
> +#define mm5 REG(mm5)
> +#define mm6 REG(mm6)
> +#define mm7 REG(mm7)
> +
> +#define xmm0 REG(xmm0)
> +#define xmm1 REG(xmm1)
> +#define xmm2 REG(xmm2)
> +#define xmm3 REG(xmm3)
> +#define xmm4 REG(xmm4)
> +#define xmm5 REG(xmm5)
> +#define xmm6 REG(xmm6)
> +#define xmm7 REG(xmm7)
> +
> +#define cr0 REG(cr0)
> +#define cr1 REG(cr1)
> +#define cr2 REG(cr2)
> +#define cr3 REG(cr3)
> +#define cr4 REG(cr4)
> +
> +#ifdef _I386MACH_NEED_SOTYPE_FUNCTION
> +#define SOTYPE_FUNCTION(sym) .type SYM(sym),@function
> +#else
> +#define SOTYPE_FUNCTION(sym)
> +#endif
> +
> +#ifdef _I386MACH_ALLOW_HW_INTERRUPTS
> +#define        __CLI
> +#define        __STI
> +#else
> +#define __CLI  cli
> +#define __STI  sti
> +#endif



More information about the Newlib mailing list