This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH: RL78] libgcc fixes for divmodsi, divmodhi and divmodqi


Hi,
The following patch fixes issues in the div/mod emulation routines
for the RL78 target.

Hunk in divmodsi.S: This hunk adds a branch to 'main_loop_done_himode'
instead of a direct 'ret'. The 'ret' from here was causing the
hardware to crash as the registers were not being restored from stack
before return. This happened for long data division by 0.
Note: A 'br	$!' is used as a only using 'br	$' gives error,
relocation truncated to fit: R_RL78_DIR8S_PCREL at link time in testcase.

This hunk also fixes an issue related to return register.
r10,r11 was returned for div instruction instead of r8,r9 register.

Hunk in divmodhi.S: Fixes issue related to return register.
r10 was returned for div instruction instead of r8 register.

Hunk in divmodqi.S: Returns a 0x00 instead of 0xff to keep results
consistent with other data types.

The hunks in divmodhi and divmodqi are not critical, however the
one in divmodsi is critical as the processor runs away to undefined
space and crashes.

This is regression tested for RL78 -msim. Please let me know if it is
OK to commit.

Best Regards,
Kaushik

Changelog:
2015-08-21  Kaushik Phatak  <kaushik.phatak@kpit.com>
    
	* config/rl78/divmodqi.S: Return 0x00 by default for div by 0.
	* config/rl78/divmodsi.S: Update return register to r8.
	* config/rl78/divmodhi.S: Update return register to r8,r9.
	  Branch to main_loop_done_himode to pop registers before return.

Index: libgcc/config/rl78/divmodhi.S
===================================================================
--- libgcc/config/rl78/divmodhi.S	(revision 227024)
+++ libgcc/config/rl78/divmodhi.S	(working copy)
@@ -454,7 +454,11 @@
 	movw	ax, den
 	cmpw	ax, #0
 	bnz	$den_not_zero\which
+	.if \need_result
+	movw    quot, #0
+	.else
 	movw	num, #0
+	.endif
 	ret
 
 den_not_zero\which:
Index: libgcc/config/rl78/divmodqi.S
===================================================================
--- libgcc/config/rl78/divmodqi.S	(revision 227024)
+++ libgcc/config/rl78/divmodqi.S	(working copy)
@@ -63,7 +63,7 @@
 	ret
 	
 den_is_zero\which:
-	mov	r8, #0xff
+	mov	r8, #0x00
 	ret
 
 	;; These routines leave DE alone - the signed functions use DE
Index: libgcc/config/rl78/divmodsi.S
===================================================================
--- libgcc/config/rl78/divmodsi.S	(revision 227024)
+++ libgcc/config/rl78/divmodsi.S	(working copy)
@@ -688,9 +688,14 @@
 	or	a, denB3	; not x
 	cmpw	ax, #0
 	bnz	$den_not_zero\which
+	.if \need_result
+	movw	quotL, #0
+	movw	quotH, #0
+	.else
 	movw	numL, #0
 	movw	numH, #0
-	ret
+	.endif
+	br	$!main_loop_done_himode\which
 
 den_not_zero\which:
 	.if \need_result

Attachment: rl78_divmod.patch
Description: rl78_divmod.patch


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]