From 151b3a67b345eebb6e3e57ce4069da823f102958 Mon Sep 17 00:00:00 2001
From: Mahesh Bodapati <mbodapat@xilinx.com>
Date: Tue, 11 Sep 2018 14:32:20 +0530
Subject: [PATCH 07/11] [Patch, Microblaze]: newlib port for microblaze m64
 flag...

Conflicts:
	libgloss/microblaze/_hw_exception_handler.S
	libgloss/microblaze/_interrupt_handler.S
---
 libgloss/microblaze/_exception_handler.S    |   6 +-
 libgloss/microblaze/_hw_exception_handler.S |   7 +-
 libgloss/microblaze/_interrupt_handler.S    |   7 +-
 libgloss/microblaze/_program_clean.S        |   6 +-
 libgloss/microblaze/_program_init.S         |   6 +-
 libgloss/microblaze/crt0.S                  |  53 ++++++++-
 libgloss/microblaze/crt1.S                  |  54 +++++++--
 libgloss/microblaze/crt2.S                  |  52 +++++++--
 libgloss/microblaze/crt3.S                  |  32 +++++-
 libgloss/microblaze/crt4.S                  |  37 +++++-
 libgloss/microblaze/crtinit.S               | 120 ++++++++++++++------
 libgloss/microblaze/linux-crt0.S            |  60 ++++++++--
 libgloss/microblaze/linux-syscalls.S        |  15 ++-
 libgloss/microblaze/pgcrtinit.S             |  59 +++++++++-
 libgloss/microblaze/sim-crtinit.S           |  31 +++++
 libgloss/microblaze/sim-pgcrtinit.S         |  31 +++++
 newlib/libc/machine/microblaze/longjmp.S    |  45 ++++++--
 newlib/libc/machine/microblaze/setjmp.S     |  33 +++++-
 18 files changed, 563 insertions(+), 91 deletions(-)

diff --git a/libgloss/microblaze/_exception_handler.S b/libgloss/microblaze/_exception_handler.S
index 7a91a781e..0fdff3fec 100644
--- a/libgloss/microblaze/_exception_handler.S
+++ b/libgloss/microblaze/_exception_handler.S
@@ -30,7 +30,11 @@
 */
 
 	.text
-	.align 2
+#ifdef __arch64__
+	.align 3
+#else
+        .align 2
+#endif
 	.weakext _exception_handler
 	.ent _exception_handler
 	.type _exception_handler, @function
diff --git a/libgloss/microblaze/_hw_exception_handler.S b/libgloss/microblaze/_hw_exception_handler.S
index 47df945c4..b951a6325 100644
--- a/libgloss/microblaze/_hw_exception_handler.S
+++ b/libgloss/microblaze/_hw_exception_handler.S
@@ -32,8 +32,11 @@
 	.text
 	.weakext _hw_exception_handler    # HW Exception Handler Label
 	.type _hw_exception_handler, %function
-	.align 2
-	
+#ifdef  __arch64__
+	.align 3
+#else
+        .align 2
+#endif
 	_hw_exception_handler:
 	rted    r17, 0
 	nop
diff --git a/libgloss/microblaze/_interrupt_handler.S b/libgloss/microblaze/_interrupt_handler.S
index 5bb7329cc..a0ef92df0 100644
--- a/libgloss/microblaze/_interrupt_handler.S
+++ b/libgloss/microblaze/_interrupt_handler.S
@@ -32,8 +32,11 @@
 	.text
 	.weakext _interrupt_handler    # Interrupt Handler Label
 	.type _interrupt_handler, %function
-	.align 2
-
+#ifdef __arch64__
+	.align 3
+#else
+        .align 2
+#endif
 	_interrupt_handler:
 	rtid    r14, 0
 	nop
diff --git a/libgloss/microblaze/_program_clean.S b/libgloss/microblaze/_program_clean.S
index c46059434..0d55d8ab8 100644
--- a/libgloss/microblaze/_program_clean.S
+++ b/libgloss/microblaze/_program_clean.S
@@ -33,7 +33,11 @@
 #
 	
 	.text
-	.align	2
+#ifdef __arch64__
+	.align 3
+#else
+        .align 2
+#endif
 	.globl	_program_clean
 	.ent	_program_clean
 _program_clean:
diff --git a/libgloss/microblaze/_program_init.S b/libgloss/microblaze/_program_init.S
index 0daa42e14..862ef786b 100644
--- a/libgloss/microblaze/_program_init.S
+++ b/libgloss/microblaze/_program_init.S
@@ -32,7 +32,11 @@
 # Dummy file to be replaced by LibGen
 	
 	.text
-	.align	2
+#ifdef	__arch64__
+	.align	3
+#else
+        .align 2
+#endif
 	.globl	_program_init
 	.ent	_program_init
 _program_init:
diff --git a/libgloss/microblaze/crt0.S b/libgloss/microblaze/crt0.S
index 865a8c269..e4df73b66 100644
--- a/libgloss/microblaze/crt0.S
+++ b/libgloss/microblaze/crt0.S
@@ -54,7 +54,11 @@
 
 	.globl _start
         .section .vectors.reset, "ax"
-	.align 2
+#ifdef __arch64__
+	.align 3
+#else
+        .align 2
+#endif
         .ent _start
         .type _start, @function
 _start:
@@ -62,36 +66,64 @@ _start:
         .end _start
     
         .section .vectors.sw_exception, "ax"
+#ifdef  __arch64__
+        .align 3
+#else
         .align 2
+#endif
 _vector_sw_exception:       
         brai    _exception_handler
 
         .section .vectors.interrupt, "ax"
+#ifdef  __arch64__
+        .align 3
+#else
         .align 2
+#endif
+
 _vector_interrupt:      
         brai    _interrupt_handler
 
         .section .vectors.hw_exception, "ax"
+#ifdef  __arch64__
+        .align 3
+#else
         .align 2
+#endif
+
 _vector_hw_exception:       
         brai    _hw_exception_handler
 
         .section .text
         .globl _start1
+#ifdef  __arch64__
+        .align 3
+#else
         .align 2
+#endif
+
         .ent _start1
         .type _start1, @function   
 _start1:
+#ifdef  __arch64__
+        lli     r13, r0, _SDA_BASE_
+        lli     r2, r0, _SDA2_BASE_
+        lli     r1,  r0, _stack-32
+        brealid	r15, _crtinit
+        nop
+        addlik   r5, r3, 0
+        brealid	r15, exit
+        nop
+#else
 	la	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
 	la	r2, r0, _SDA2_BASE_
 	la	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
-
 	brlid	r15, _crtinit               /* Initialize BSS and run program */
 	nop
 
-        brlid   r15, exit                   /* Call exit with the return value of main */
-        addik   r5, r3, 0                   
-
+	brlid   r15, exit                   /* Call exit with the return value of main */
+	addik   r5, r3, 0
+#endif
         /* Control does not reach here */
         .end _start1
     
@@ -101,9 +133,18 @@ _start1:
         Our simple _exit      
 */    
         .globl _exit
+#ifdef	__arch64__
+        .align 3
+#else
         .align 2
+#endif
+
         .ent _exit
         .type _exit, @function    
 _exit:
-        bri     0
+#ifdef	__arch64__
+        breai     0
+#else
+	bri	0
+#endif
 	.end _exit        
diff --git a/libgloss/microblaze/crt1.S b/libgloss/microblaze/crt1.S
index a8bf74937..b24eeb531 100644
--- a/libgloss/microblaze/crt1.S
+++ b/libgloss/microblaze/crt1.S
@@ -53,36 +53,67 @@
     
 
         .section .vectors.sw_exception, "ax"
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
 _vector_sw_exception:       
         brai    _exception_handler
 
         .section .vectors.interrupt, "ax"
-        .align 2
+#ifdef __arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
 _vector_interrupt:      
         brai    _interrupt_handler
 
         .section .vectors.hw_exception, "ax"
-        .align 2
+#ifdef __arch64__
+	.align 3
+#else
+	.align 2
+#endif
+
 _vector_hw_exception:       
         brai    _hw_exception_handler
 
         .section .text
         .globl _start
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
         .ent _start
         .type _start, @function    
 _start:
+#ifdef	__arch64__
+	lli	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
+        lli      r2, r0, _SDA2_BASE_
+        lli      r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
+
+        brealid   r15, _crtinit               /* Initialize BSS and run program */
+	nop
+	addlik	r5, r3, 0
+	brealid	r15, exit
+	nop
+#else
 	la	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
 	la	r2, r0, _SDA2_BASE_
-	la	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
+	la	r1, r0, _stack-32          /* 16 bytes (4 words are needed by crtinit for args and link reg */
 
 	brlid	r15, _crtinit               /* Initialize BSS and run program */
 	nop
 
         brlid   r15, exit                   /* Call exit with the return value of main */
         addik   r5, r3, 0                   
-
+#endif
         /* Control does not reach here */
         .end _start    
 
@@ -92,11 +123,18 @@ _start:
         Our simple _exit      
 */    
         .globl _exit
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
         .ent _exit
         .type _exit, @function
 _exit:
+#ifdef	__arch64__
+	addl	r3, r0, r5
+#else
 	add	r3, r0, r5
+#endif
 	brki    r16, 0x4                    /* Return to hook in XMDSTUB  */    
 	.end _exit        
-
diff --git a/libgloss/microblaze/crt2.S b/libgloss/microblaze/crt2.S
index 34d9f951d..ae4c89ee0 100644
--- a/libgloss/microblaze/crt2.S
+++ b/libgloss/microblaze/crt2.S
@@ -51,26 +51,56 @@
 */      
     
         .section .vectors.sw_exception, "ax"
-        .align 2
+#ifdef	__arch64__
+	.align 3
+#else
+	.align 2
+#endif
+
 _vector_sw_exception:       
         brai    _exception_handler
 
         .section .vectors.interrupt, "ax"
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
 _vector_interrupt:      
         brai    _interrupt_handler
 
         .section .vectors.hw_exception, "ax"
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
 _vector_hw_exception:       
         brai    _hw_exception_handler
 
         .section .text
         .globl _start
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
         .ent _start
         .type _start, @function    
 _start:
+#ifdef	__arch64__
+        lli	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
+        lli	r2, r0, _SDA2_BASE_
+        lli	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
+        brealid	r15, _crtinit               /* Initialize BSS and run program */
+        nop
+	addlik	r5, r3, 0
+        brealid	r15, exit
+	nop
+#else
 	la	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
 	la	r2, r0, _SDA2_BASE_
 	la	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
@@ -80,7 +110,7 @@ _start:
 
         brlid   r15, exit                   /* Call exit with the return value of main */
         addik   r5, r3, 0                   
-       
+#endif
         /* Control does not reach here */
     
         .end _start
@@ -90,9 +120,17 @@ _start:
         Our simple _exit      
 */    
         .globl _exit
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
         .ent _exit
         .type _exit, @function
 _exit:
-        bri     0
+#ifdef	__arch64__
+	breai	0
+#else
+	bri     0
+#endif
 	.end _exit        
diff --git a/libgloss/microblaze/crt3.S b/libgloss/microblaze/crt3.S
index ebcf207f5..a8bc7839b 100644
--- a/libgloss/microblaze/crt3.S
+++ b/libgloss/microblaze/crt3.S
@@ -53,10 +53,26 @@
 
         .section .text
         .globl _start
-        .align 2
+#ifdef	__arch64__
+	.align 3
+#else
+	.align 2
+#endif
         .ent _start
         .type _start, @function    
 _start:
+#ifdef	__arch64__
+        lli	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
+        lli	r2, r0, _SDA2_BASE_
+        lli	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
+
+        brealid	r15, _crtinit               /* Initialize BSS and run program */
+        nop
+
+        addlik	r5, r3, 0
+        brealid	r15, exit                   /* Call exit with the return value of main */
+	nop
+#else
 	la	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
 	la	r2, r0, _SDA2_BASE_
 	la	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
@@ -66,7 +82,7 @@ _start:
 
         brlid   r15, exit                   /* Call exit with the return value of main */
         addik   r5, r3, 0                   
-
+#endif
         /* Control does not reach here */
         .end _start
     
@@ -76,9 +92,17 @@ _start:
         Our simple _exit      
 */    
         .globl _exit
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align 2
+#endif
         .ent _exit
         .type _exit, @function
 _exit:
-        bri     0
+#ifdef	__arch64__
+	breai	0
+#else
+       bri     0
+#endif
 	.end _exit        
diff --git a/libgloss/microblaze/crt4.S b/libgloss/microblaze/crt4.S
index 4cf0b01a4..54ba473ea 100644
--- a/libgloss/microblaze/crt4.S
+++ b/libgloss/microblaze/crt4.S
@@ -53,10 +53,27 @@
 
         .section .text
         .globl _start
-        .align 2
+#ifdef __arch64__
+        .align 3
+#else
+	.align 2
+#endif
+
         .ent _start
         .type _start, @function    
 _start:
+#ifdef	__arch64__
+        lli	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
+        lli	r2, r0, _SDA2_BASE_
+        lli	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
+
+        brealid	r15, _crtinit               /* Initialize BSS and run program */
+	nop
+
+        addlik   r5, r3, 0
+        brealid   r15, exit                   /* Call exit with the return value of main */
+	nop
+#else
 	la	r13, r0, _SDA_BASE_         /* Set the Small Data Anchors and the stack pointer */
 	la	r2, r0, _SDA2_BASE_
 	la	r1, r0, _stack-32           /* 16 bytes (4 words are needed by crtinit for args and link reg */
@@ -68,19 +85,27 @@ _start:
         addik   r5, r3, 0                   
 
         /* Control does not reach here */
-
+#endif
         .end _start
 
-
 /* 
         _exit 
         Our simple _exit      
 */    
         .globl _exit
-        .align 2
+#ifdef	__arch64__
+        .align 3
+#else
+	.align	2
+#endif
         .ent _exit
         .type _exit, @function
 _exit:
-    	brlid	r15,elf_process_exit    
-        nop 
+#ifdef	__arch64__
+	brealid	r15,elf_process_exit
+	nop
+#else
+	brlid r15,elf_process_exit
+	nop
+#endif
 	.end _exit        
diff --git a/libgloss/microblaze/crtinit.S b/libgloss/microblaze/crtinit.S
index 86c6dfcb0..854117536 100644
--- a/libgloss/microblaze/crtinit.S
+++ b/libgloss/microblaze/crtinit.S
@@ -29,59 +29,115 @@
  */ 
 
 	.globl _crtinit
+#ifdef	__arch64__
+	.align 3
+#else
 	.align 2
+#endif
 	.ent _crtinit
         .type _crtinit, @function
 _crtinit:
-	addi	r1, r1, -40               	/* Save Link register	 */
-	swi	r15, r1, 0
+#ifdef	__arch64__
+	addli	r1, r1, -40               	/* Save Link register	 */
+	sli	r15, r1, 0
 
-    	addi	r6, r0, __sbss_start          	/* clear SBSS */
-	addi	r7, r0, __sbss_end	
-	rsub	r18, r6, r7		
-	blei	r18, .Lendsbss
+	addli	r6, r0, __sbss_start          	/* clear SBSS */
+	addli	r7, r0, __sbss_end
+	rsubl	r18, r6, r7
+	bealei	r18, .Lendsbss
 
 .Lloopsbss:	
-	swi	r0, r6, 0
-	addi	r6, r6, 4
-	rsub	r18, r6, r7
-	bgti	r18, .Lloopsbss
+	sli	r0, r6, 0
+	addli	r6, r6, 4
+	rsubl	r18, r6, r7
+	beagti	r18, .Lloopsbss
 .Lendsbss:
-
-	addi	r6, r0, __bss_start             /* clear BSS */
-	addi	r7, r0, __bss_end		
-    	rsub	r18, r6, r7		
-	blei	r18, .Lendbss
+	addli	r6, r0, __bss_start             /* clear BSS */
+	addli	r7, r0, __bss_end
+	rsubl	r18, r6, r7
+	bealei	r18, .Lendbss
 .Lloopbss:	
-	swi	r0, r6, 0
-	addi	r6, r6, 4
-	rsub	r18, r6, r7
-	bgti	r18, .Lloopbss
+	sli	r0, r6, 0
+	addli	r6, r6, 4
+	rsubl	r18, r6, r7
+	beagti	r18, .Lloopbss
 .Lendbss:
 
-	brlid	r15, _program_init              /* Initialize the program  */
+	brealid	r15, _program_init              /* Initialize the program  */
+	nop
+        brealid   r15, __init                     /* Invoke language initialization functions */
+	nop
+
+	addli	r6, r0, 0                       /* Initialize argc = 1 and argv = NULL and envp = NULL  */
+	addli	r7, r0, 0
+	addli	r5, r0, 0
+	brealid	r15, main                       /* Execute the program */
 	nop
+	addlik   r19, r3, 0                      /* Save return value */
+
+        brealid   r15, __fini                     /* Invoke language cleanup functions */
+        nop
+
+	brealid	r15, _program_clean             /* Cleanup the program  */
+	nop
+
+	ll	r15, r1, r0                     /* Return back to CRT   */
+
+        addlik   r3, r19, 0                      /* Restore return value */
+	addli	r1, r1, 40
+	rtsd	r15, 8
+	nop
+#else
+        addi    r1, r1, -40                     /* Save Link register    */
+        swi     r15, r1, 0
+
+        addi    r6, r0, __sbss_start            /* clear SBSS */
+        addi    r7, r0, __sbss_end
+        rsub    r18, r6, r7
+        blei    r18, .Lendsbss
+
+.Lloopsbss:
+        swi     r0, r6, 0
+        addi    r6, r6, 4
+        rsub    r18, r6, r7
+        bgti    r18, .Lloopsbss
+.Lendsbss:
+
+        addi    r6, r0, __bss_start             /* clear BSS */
+        addi    r7, r0, __bss_end
+        rsub    r18, r6, r7
+        blei    r18, .Lendbss
+.Lloopbss:
+        swi     r0, r6, 0
+        addi    r6, r6, 4
+        rsub    r18, r6, r7
+        bgti    r18, .Lloopbss
+.Lendbss:
+
+        brlid   r15, _program_init              /* Initialize the program  */
+        nop
 
         brlid   r15, __init                     /* Invoke language initialization functions */
         nop
-    
-	addi	r6, r0, 0                       /* Initialize argc = 1 and argv = NULL and envp = NULL  */
-	addi	r7, r0, 0			
-      	brlid	r15, main                       /* Execute the program */
-    	addi	r5, r0, 0
+
+        addi    r6, r0, 0                       /* Initialize argc = 1 and argv = NULL and envp = NULL  */
+        addi    r7, r0, 0
+        brlid   r15, main                       /* Execute the program */
+        addi    r5, r0, 0
 
         addik   r19, r3, 0                      /* Save return value */
-    
+
         brlid   r15, __fini                     /* Invoke language cleanup functions */
         nop
-    
-	brlid	r15, _program_clean             /* Cleanup the program  */
-	nop
 
-	lw	r15, r1, r0                     /* Return back to CRT   */
+        brlid   r15, _program_clean             /* Cleanup the program  */
+        nop
+
+        lw      r15, r1, r0                     /* Return back to CRT   */
 
         addik   r3, r19, 0                      /* Restore return value */
-	rtsd	r15, 8
-    	addi	r1, r1, 40
+        rtsd    r15, 8
+        addi    r1, r1, 40
+#endif
 	.end _crtinit
 
diff --git a/libgloss/microblaze/linux-crt0.S b/libgloss/microblaze/linux-crt0.S
index 8650bb5d2..503439b2e 100644
--- a/libgloss/microblaze/linux-crt0.S
+++ b/libgloss/microblaze/linux-crt0.S
@@ -18,26 +18,50 @@
         .ent _start
         .type _start, @function
 _start:
-	la	r13, r0, _SDA_BASE_
-	la	r2, r0, _SDA2_BASE_
+#ifdef	__arch64__
+	lli	r13, r0, _SDA_BASE_
+	lli	r2, r0, _SDA2_BASE_
 
-	brlid	r15, __init
+	brealid	r15, __init
 	nop
 
-	lwi	r5, r1, 0
-	addik	r6, r1, 4
+	lli	r5, r1, 0
+	addlik	r6, r1, 4
 
 	# Add argc * 4.
-	addk	r7, r5, r5
-	addk	r7, r7, r7
+	addlk	r7, r5, r5
+	addlk	r7, r7, r7
 
-	brlid	r15, main
 	# Now add 4 + r1 (i.e r6) in the delayslot.
-	addk	r7, r7, r6
+	addlk	r7, r7, r6
+	brealid	r15, main
+	nop
+	addlik   r5, r3, 0
+	brealid   r15, exit
+	nop
+	.size _start, . - _start
+#else
+        la      r13, r0, _SDA_BASE_
+        la      r2, r0, _SDA2_BASE_
+
+        brlid   r15, __init
+        nop
+
+        lwi     r5, r1, 0
+        addik   r6, r1, 4
 
-	brlid   r15, exit
+        # Add argc * 4.
+	addk    r7, r5, r5
+        addk    r7, r7, r7
+
+        brlid   r15, main
+        # Now add 4 + r1 (i.e r6) in the delayslot.
+        addk    r7, r7, r6
+
+        brlid   r15, exit
         addik   r5, r3, 0
-	.size _start, . - _start
+        .size _start, . - _start
+#endif
         .end _start
 
 	/* Replacement for the GCC provided crti.S. This one avoids the
@@ -45,14 +69,28 @@ _start:
 	   insn exceptions when running in user-space).  */
         .section .init, "ax"
 	.global __init
+#ifdef	__arch64__
+	.align 3
+__init:
+        addlik   r1, r1, -8
+        sl      r15, r0, r1
+#else
 	.align 2
 __init:
 	addik   r1, r1, -8
 	sw      r15, r0, r1
 
+#endif
 	.section .fini, "ax"
 	.global __fini
+#ifdef	__arch64__
+	.align 3
+__fini:
+        addlik   r1, r1, -8
+        sl      r15, r0, r1
+#else
 	.align 2
 __fini:
 	addik   r1, r1, -8
 	sw      r15, r0, r1
+#endif
diff --git a/libgloss/microblaze/linux-syscalls.S b/libgloss/microblaze/linux-syscalls.S
index 506de78fd..8594f136e 100644
--- a/libgloss/microblaze/linux-syscalls.S
+++ b/libgloss/microblaze/linux-syscalls.S
@@ -20,8 +20,9 @@
 #define GLOBAL(name) .global name; FUNC(name)
 #define SIZE(name) .size name, .-name
 
+#ifdef	__arch64__
 # define SYSCALL_BODY(name)		\
-	addik	r12, r0, SYS_ ## name;	\
+	addlik	r12, r0, SYS_ ## name;	\
 	brki    r14, 8;			\
 	rtsd	r15, 8;			\
 	nop;
@@ -31,6 +32,18 @@
 	SYSCALL_BODY(name);		\
         SIZE(_ ## name)
 
+#else
+# define SYSCALL_BODY(name)             \
+        addik   r12, r0, SYS_ ## name;  \
+        brki    r14, 8;                 \
+        rtsd    r15, 8;                 \
+        nop;
+
+# define SYSCALL(name)                  \
+        GLOBAL(_ ## name);              \
+        SYSCALL_BODY(name);             \
+        SIZE(_ ## name)
+#endif
 SYSCALL(brk)
 SYSCALL(exit)
 SYSCALL(read)
diff --git a/libgloss/microblaze/pgcrtinit.S b/libgloss/microblaze/pgcrtinit.S
index 25930821c..638dbd383 100644
--- a/libgloss/microblaze/pgcrtinit.S
+++ b/libgloss/microblaze/pgcrtinit.S
@@ -29,10 +29,66 @@
   
 
 	.globl _crtinit
+#ifdef	__arch64__
+	.align 3
+#else
 	.align 2
+#endif
 	.ent _crtinit
 
 _crtinit:
+#ifdef	__arch64__
+
+        addli    r1, r1, -40                     /* Save Link register    */
+        sli     r15, r1, 0
+
+        addli    r6, r0, __sbss_start            /* clear SBSS */
+        addli    r7, r0, __sbss_end
+        rsubl    r18, r6, r7
+        bealei    r18, .Lendsbss
+.Lloopsbss:
+        sli     r0, r6, 0
+        addli    r6, r6, 4
+        rsubl    r18, r6, r7
+        beagti    r18, .Lloopsbss
+.Lendsbss:
+
+        addli    r6, r0, __bss_start             /* clear BSS */
+        addli    r7, r0, __bss_end
+        rsubl    r18, r6, r7
+        bealei    r18, .Lendbss
+.Lloopbss:
+        sli     r0, r6, 0
+        addli    r6, r6, 4
+        rsubl    r18, r6, r7
+        beagti    r18, .Lloopbss
+.Lendbss:
+
+        brealid   r15, _program_init              /* Initialize the program */
+	nop
+        brealid   r15, _profile_init              /* Initialize profiling library */
+	nop
+        brealid   r15, __init                     /* Invoke language initialization functions */
+	nop
+        addli    r6, r0, 0                       /* Initialize argc = 1 and argv = NULL and envp = NULL  */
+        addli    r7, r0, 0
+        addli    r5, r0, 0
+        brealid   r15, main                       /* Execute the program */
+	nop
+        addlik   r19, r3, 0                      /* Save return value */
+
+        brealid   r15, __fini                     /* Invoke language cleanup functions */
+	nop
+        brealid   r15, _profile_clean             /* Cleanup profiling library */
+	nop
+        brealid   r15, _program_clean             /* Cleanup the program */
+	nop
+        ll      r15, r1, r0                     /* Return back to CRT */
+        addlik	r3, r19, 0                      /* Restore return value */
+        addli    r1, r1, 40
+        rtsd    r15, 8
+	nop
+#else
 	addi	r1, r1, -40               	/* Save Link register	 */
 	swi	r15, r1, 0
 
@@ -86,7 +142,8 @@ _crtinit:
 
 	lw	r15, r1, r0                     /* Return back to CRT */
         addik   r3, r19, 0                      /* Restore return value */  
-	rtsd	r15, 8
+        rtsd	r15, 8
     	addi	r1, r1, 40
+#endif
 	.end _crtinit
 
diff --git a/libgloss/microblaze/sim-crtinit.S b/libgloss/microblaze/sim-crtinit.S
index 74586d9a7..9892cb0bd 100644
--- a/libgloss/microblaze/sim-crtinit.S
+++ b/libgloss/microblaze/sim-crtinit.S
@@ -35,10 +35,39 @@
 #    
 
 	.globl _crtinit
+#ifdef	__arch64__
+	.align 3
+#else
 	.align 2
+#endif
 	.ent _crtinit
 
 _crtinit:
+#ifdef	__arch64__
+        addli    r1, r1, -40                     /* Save Link register    */
+        sli     r15, r1, 0
+
+        brealid   r15, _program_init              /* Initialize the program  */
+	nop
+        brealid   r15, __init                     /* Invoke language initialization functions */
+	nop
+        addli    r6, r0, 0                       /* Initialize argc = 1 and argv = NULL and envp = NULL  */
+        addli    r7, r0, 0
+        addli    r5, r0, 0
+        brealid   r15, main                       /* Execute the program */
+	nop
+        addlik   r19, r3, 0                      /* Save return value */
+
+        brealid   r15, __fini                     /* Invoke language cleanup functions */
+	nop
+        brealid   r15, _program_clean             /* Cleanup the program  */
+	nop
+        ll      r15, r1, r0                     /* Return back to CRT   */
+        addlik   r3, r19, 0                      /* Restore return value */
+        addli    r1, r1, 40
+        rtsd    r15, 8
+	nop
+#else
 	addi	r1, r1, -40               	/* Save Link register	 */
 	swi	r15, r1, 0
 
@@ -63,7 +92,9 @@ _crtinit:
 
 	lw	r15, r1, r0                     /* Return back to CRT   */
         addik   r3, r19, 0                      /* Restore return value */
+
 	rtsd	r15, 8
     	addi	r1, r1, 40
+#endif
 	.end _crtinit
 
diff --git a/libgloss/microblaze/sim-pgcrtinit.S b/libgloss/microblaze/sim-pgcrtinit.S
index 82ebccad4..939f5372f 100644
--- a/libgloss/microblaze/sim-pgcrtinit.S
+++ b/libgloss/microblaze/sim-pgcrtinit.S
@@ -35,10 +35,40 @@
 #    
 
 	.globl _crtinit
+#ifdef	__arch64__
+	.align 3
+#else
 	.align 2
+#endif
 	.ent _crtinit
 
 _crtinit:
+#ifdef	__arch64__
+        addli    r1, r1, -40                     /* Save Link register    */
+        sli     r15, r1, 0
+
+        brealid   r15, _program_init              /* Initialize the program */
+	nop
+        brealid   r15, _profile_init              /* Initialize profiling library */
+	nop
+        brealid   r15, __init                     /* Invoke language initialization functions */
+	nop
+        addli    r6, r0, 0                       /* Initialize argc = 1 and argv = NULL and envp = NULL  */
+        addli    r7, r0, 0
+        addli    r5, r0, 0
+        brealid   r15, main                       /* Execute the program */
+	nop
+        brealid   r15, __fini                     /* Invoke language cleanup functions */
+	nop
+        brealid   r15, _profile_clean             /* Cleanup profiling library */
+	nop
+        brealid   r15, _program_clean             /* Cleanup the program */
+	nop
+        ll      r15, r1, r0                     /* Return back to CRT */
+        addli    r1, r1, 40
+        rtsd    r15, 8
+	nop
+#else
 	addi	r1, r1, -40               	/* Save Link register	 */
 	swi	r15, r1, 0
 
@@ -68,5 +98,6 @@ _crtinit:
 	lw	r15, r1, r0                     /* Return back to CRT */
 	rtsd	r15, 8
     	addi	r1, r1, 40
+#endif
 	.end _crtinit
 
diff --git a/newlib/libc/machine/microblaze/longjmp.S b/newlib/libc/machine/microblaze/longjmp.S
index f972bbd88..5ed1c2626 100644
--- a/newlib/libc/machine/microblaze/longjmp.S
+++ b/newlib/libc/machine/microblaze/longjmp.S
@@ -51,16 +51,46 @@
     
 .globl longjmp
 .section .text
-.align 2  
+#ifdef	__arch64__
+.align 3
+#else
+.align 2
+#endif
 .ent longjmp    
 longjmp:
+#ifdef __arch64__
+    lli     r1, r5, 0
+    lli     r13, r5, 4
+    lli     r14, r5, 8
+    lli     r15, r5, 12
+    lli     r16, r5, 16
+    lli     r17, r5, 20
+    lli     r18, r5, 24
+    lli     r19, r5, 28
+    lli     r20, r5, 32
+    lli     r21, r5, 36
+    lli     r22, r5, 40
+    lli     r23, r5, 44
+    lli     r24, r5, 48
+    lli     r25, r5, 52
+    lli     r26, r5, 56
+    lli     r27, r5, 60
+    lli     r28, r5, 64
+    lli     r29, r5, 68
+    lli     r30, r5, 72
+    lli     r31, r5, 76
+
+    or      r3, r0, r6
+    rtsd    r15, 8
+    nop
+#else
     lwi     r1, r5, 0
     lwi     r13, r5, 4
     lwi     r14, r5, 8
-    lwi     r15, r5, 12       
+    lwi     r15, r5, 12
     lwi     r16, r5, 16
     lwi     r17, r5, 20
-    lwi     r18, r5, 24       
+    lwi     r18, r5, 24
     lwi     r19, r5, 28
     lwi     r20, r5, 32
     lwi     r21, r5, 36
@@ -69,12 +99,13 @@ longjmp:
     lwi     r24, r5, 48
     lwi     r25, r5, 52
     lwi     r26, r5, 56
-    lwi     r27, r5, 60                        
-    lwi     r28, r5, 64                        
-    lwi     r29, r5, 68                        
+    lwi     r27, r5, 60
+    lwi     r28, r5, 64
+    lwi     r29, r5, 68
     lwi     r30, r5, 72
-    lwi     r31, r5, 76                                            
+    lwi     r31, r5, 76
 
     rtsd    r15, 8
     or      r3, r0, r6
+#endif
 .end longjmp    
diff --git a/newlib/libc/machine/microblaze/setjmp.S b/newlib/libc/machine/microblaze/setjmp.S
index cdd87c76f..971862bcb 100644
--- a/newlib/libc/machine/microblaze/setjmp.S
+++ b/newlib/libc/machine/microblaze/setjmp.S
@@ -50,9 +50,39 @@
     
 .globl setjmp
 .section .text
-.align 2  
+#ifdef	__arch64__
+.align 3
+#else
+.align 2
+#endif
 .ent setjmp    
 setjmp:
+#ifdef	__arch64__
+    sli     r1, r5, 0
+    sli     r13, r5, 4
+    sli     r14, r5, 8
+    sli     r15, r5, 12
+    sli     r16, r5, 16
+    sli     r17, r5, 20
+    sli     r18, r5, 24
+    sli     r19, r5, 28
+    sli     r20, r5, 32
+    sli     r21, r5, 36
+    sli     r22, r5, 40
+    sli     r23, r5, 44
+    sli     r24, r5, 48
+    sli     r25, r5, 52
+    sli     r26, r5, 56
+    sli     r27, r5, 60
+    sli     r28, r5, 64
+    sli     r29, r5, 68
+    sli     r30, r5, 72
+    sli     r31, r5, 76
+
+    or      r3, r0, r0
+    rtsd    r15, 8
+    nop
+#else
     swi     r1, r5, 0
     swi     r13, r5, 4
     swi     r14, r5, 8
@@ -76,4 +106,5 @@ setjmp:
 
     rtsd    r15, 8
     or      r3, r0, r0
+#endif
 .end setjmp    
-- 
2.17.1

