Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [patch] sim/sh: fix movua for little endian
@ 2004-08-13 19:34 DJ Delorie
  2004-08-23 19:48 ` Andrew Cagney
  0 siblings, 1 reply; 9+ messages in thread
From: DJ Delorie @ 2004-08-13 19:34 UTC (permalink / raw)
  To: gdb-patches; +Cc: dj


The movua opcode was hardcoded for big endian; on little endian
targets it would retrieve the word backwards.  Note that the global
endian compensators are keyed to the HOST endian as well and are not
usable for this purpose.

The problem and solution are obvious, but my implementation may not
be, so I await approval (global maintainers - no sim/sh maintainer).

Tested with an ABI testsuite I'm working on which is known to use
movua.

2004-08-13  DJ Delorie  <dj@redhat.com>

	* gencode.c (movua.l): Compensate for endianness.

Index: gencode.c
===================================================================
RCS file: /cvs/src/src/sim/sh/gencode.c,v
retrieving revision 1.28
diff -p -U1 -r1.28 gencode.c
--- gencode.c	13 Feb 2004 00:01:19 -0000	1.28
+++ gencode.c	13 Aug 2004 19:17:00 -0000
@@ -868,5 +868,6 @@ op tab[] =
     "int regn = R[n];",
+    "int e = target_little_endian ? 3 : 0;",
     "MA (1);",
-    "R[0] = (RBAT (regn) << 24) + (RBAT (regn + 1) << 16) + ",
-    "  (RBAT (regn + 2) << 8) + RBAT (regn + 3);",
+    "R[0] = (RBAT (regn + (0^e)) << 24) + (RBAT (regn + (1^e)) << 16) + ",
+    "  (RBAT (regn + (2^e)) << 8) + RBAT (regn + (3^e));",
     "L (0);",
@@ -875,5 +876,6 @@ op tab[] =
     "int regn = R[n];",
+    "int e = target_little_endian ? 3 : 0;",
     "MA (1);",
-    "R[0] = (RBAT (regn) << 24) + (RBAT (regn + 1) << 16) + ",
-    "  (RBAT (regn + 2) << 8) + RBAT (regn + 3);",
+    "R[0] = (RBAT (regn + (0^e)) << 24) + (RBAT (regn + (1^e)) << 16) + ",
+    "  (RBAT (regn + (2^e)) << 8) + RBAT (regn + (3^e));",
     "R[n] += 4;",


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-13 19:34 [patch] sim/sh: fix movua for little endian DJ Delorie
@ 2004-08-23 19:48 ` Andrew Cagney
  2004-08-23 20:22   ` DJ Delorie
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Cagney @ 2004-08-23 19:48 UTC (permalink / raw)
  To: DJ Delorie; +Cc: gdb-patches

> The movua opcode was hardcoded for big endian; on little endian
> targets it would retrieve the word backwards.  Note that the global
> endian compensators are keyed to the HOST endian as well and are not
> usable for this purpose.
> 
> The problem and solution are obvious, but my implementation may not
> be, so I await approval (global maintainers - no sim/sh maintainer).
> 
> Tested with an ABI testsuite I'm working on which is known to use
> movua.

Can you add a sim/testsuite/sh-elf/movua.s test?  You'll need to clone 
the infrastructure from one of the other test directories.

Andrew

> 2004-08-13  DJ Delorie  <dj@redhat.com>
> 
> 	* gencode.c (movua.l): Compensate for endianness.
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-23 19:48 ` Andrew Cagney
@ 2004-08-23 20:22   ` DJ Delorie
  2004-08-23 20:43     ` Andrew Cagney
  0 siblings, 1 reply; 9+ messages in thread
From: DJ Delorie @ 2004-08-23 20:22 UTC (permalink / raw)
  To: cagney; +Cc: gdb-patches


> Can you add a sim/testsuite/sh-elf/movua.s test?  You'll need to clone 
> the infrastructure from one of the other test directories.

Should I just copy it from sim/testsuite/sim/sh ?

;-)


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-23 20:22   ` DJ Delorie
@ 2004-08-23 20:43     ` Andrew Cagney
  2004-08-23 21:06       ` DJ Delorie
  0 siblings, 1 reply; 9+ messages in thread
From: Andrew Cagney @ 2004-08-23 20:43 UTC (permalink / raw)
  To: DJ Delorie; +Cc: gdb-patches

>>Can you add a sim/testsuite/sh-elf/movua.s test?  You'll need to clone 
>>> the infrastructure from one of the other test directories.
> 
> 
> Should I just copy it from sim/testsuite/sim/sh ?

Doh (I thought there was a test directory but missed it)!  Can you 
extend that test then?

Andrew



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-23 20:43     ` Andrew Cagney
@ 2004-08-23 21:06       ` DJ Delorie
  2004-08-24 13:13         ` Andrew Cagney
  0 siblings, 1 reply; 9+ messages in thread
From: DJ Delorie @ 2004-08-23 21:06 UTC (permalink / raw)
  To: cagney; +Cc: gdb-patches


> Doh (I thought there was a test directory but missed it)!  Can you 
> extend that test then?

Oddly, the test passes.  Apparently, the simulator harness doesn't
pass the endianness flags to as/ld, so it's always assembled in big
endian mode.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-23 21:06       ` DJ Delorie
@ 2004-08-24 13:13         ` Andrew Cagney
  2004-08-24 14:55           ` DJ Delorie
  2004-09-08 22:35           ` DJ Delorie
  0 siblings, 2 replies; 9+ messages in thread
From: Andrew Cagney @ 2004-08-24 13:13 UTC (permalink / raw)
  To: DJ Delorie; +Cc: gdb-patches

>>> Doh (I thought there was a test directory but missed it)!  Can you 
>>> extend that test then?
> 
> 
> Oddly, the test passes.  Apparently, the simulator harness doesn't
> pass the endianness flags to as/ld, so it's always assembled in big
> endian mode.

Can we fix that then?  SIM fixes should always go hand-in-hand with a 
testcase.

If fixing the be/le problems flushes out other failures, just note them, 
I'm sure someone will fix them soon enough.

Andrew



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-24 13:13         ` Andrew Cagney
@ 2004-08-24 14:55           ` DJ Delorie
  2004-09-08 22:35           ` DJ Delorie
  1 sibling, 0 replies; 9+ messages in thread
From: DJ Delorie @ 2004-08-24 14:55 UTC (permalink / raw)
  To: cagney; +Cc: gdb-patches


> Can we fix that then?  SIM fixes should always go hand-in-hand with
> a testcase.

I'll see what I can do.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-08-24 13:13         ` Andrew Cagney
  2004-08-24 14:55           ` DJ Delorie
@ 2004-09-08 22:35           ` DJ Delorie
  2004-09-12 15:02             ` Andrew Cagney
  1 sibling, 1 reply; 9+ messages in thread
From: DJ Delorie @ 2004-09-08 22:35 UTC (permalink / raw)
  To: cagney; +Cc: gdb-patches


> Can we fix that then?  SIM fixes should always go hand-in-hand with a 
> testcase.
> 
> If fixing the be/le problems flushes out other failures, just note them, 
> I'm sure someone will fix them soon enough.

I added a generic mechanism to allow the cpus to feed global options
into the test harness.

fcnvds.s fails, but I don't think it's the test suite that's broken.
I suspect there's a disagreement between gas and sim on how to lay out
doubles in memory.

I went with gcc-compatible options, for no reason other than that's
what my site.exp already used for the gcc/sh testsuite, and I didn't
want to have to have two site.exp's.


2004-09-08  DJ Delorie  <dj@redhat.com>

	* lib/sim-defs.exp (run_sim_test): Add global_as_options,
	global_ld_options, and global_sim_options to all test cases,
	if defined.
	* sim/sh/allinsn.exp: Set global_as_options and
	global_ld_options appropriately for little endian builds.
	* sim/sh/movua.s: Support little endian.

Index: lib/sim-defs.exp
===================================================================
RCS file: /cvs/src/src/sim/testsuite/lib/sim-defs.exp,v
retrieving revision 1.6
diff -p -U3 -r1.6 sim-defs.exp
--- lib/sim-defs.exp	12 May 2004 03:34:26 -0000	1.6
+++ lib/sim-defs.exp	8 Sep 2004 22:34:00 -0000
@@ -165,6 +165,9 @@ proc run_sim_test { name requested_machs
     global SIMFLAGS
     global opts
     global cpu_option
+    global global_as_options
+    global global_ld_options
+    global global_sim_options
 
     if [string match "*/*" $name] {
 	set file $name
@@ -187,6 +190,16 @@ proc run_sim_test { name requested_machs
     set opts(timeout) ""
     set opts(xerror) "no"
 
+    if ![info exists global_as_options] {
+        set global_as_options ""
+    }
+    if ![info exists global_ld_options] {
+        set global_ld_options ""
+    }
+    if ![info exists global_sim_options] {
+        set global_sim_options ""
+    }
+
     # Clear any machine specific options specified in a previous test case
     foreach m $requested_machs {
 	if [info exists opts(as,$m)] {
@@ -250,7 +263,7 @@ proc run_sim_test { name requested_machs
 	if [info exists cpu_option] {
 	    set as_options "$as_options $cpu_option=$mach"
 	}
-	set comp_output [target_assemble $sourcefile ${name}.o "$as_options"]
+	set comp_output [target_assemble $sourcefile ${name}.o "$as_options $global_as_options"]
 
 	if ![string match "" $comp_output] {
 	    verbose -log "$comp_output" 3
@@ -262,7 +275,7 @@ proc run_sim_test { name requested_machs
 	    set opts(ld,$mach) $opts(ld)
 	}
 
-	set comp_output [target_link ${name}.o ${name}.x "$opts(ld,$mach)"]
+	set comp_output [target_link ${name}.o ${name}.x "$opts(ld,$mach) $global_ld_options"]
 
 	if ![string match "" $comp_output] {
 	    verbose -log "$comp_output" 3
@@ -281,7 +294,7 @@ proc run_sim_test { name requested_machs
 	    set options "$options timeout=$opts(timeout)"
 	}
 
-	set result [sim_run ${name}.x "$opts(sim,$mach)" "" "" "$options"]
+	set result [sim_run ${name}.x "$opts(sim,$mach) $global_sim_options" "" "" "$options"]
 	set status [lindex $result 0]
 	set output [lindex $result 1]
 
Index: sim/sh/allinsn.exp
===================================================================
RCS file: /cvs/src/src/sim/testsuite/sim/sh/allinsn.exp,v
retrieving revision 1.5
diff -p -U3 -r1.5 allinsn.exp
--- sim/sh/allinsn.exp	12 Feb 2004 22:29:48 -0000	1.5
+++ sim/sh/allinsn.exp	8 Sep 2004 22:34:01 -0000
@@ -2,6 +2,13 @@
 
 set all "sh shdsp"
 
+foreach opt $board_variant_list {
+    switch "x$opt" {
+	x-ml { set global_as_options "-little --defsym LITTLE=1"
+	       set global_ld_options "-EL" }
+    }
+}
+
 if [istarget sh-*elf] {
     run_sim_test add.s    $all
     run_sim_test and.s    $all
Index: sim/sh/movua.s
===================================================================
RCS file: /cvs/src/src/sim/testsuite/sim/sh/movua.s,v
retrieving revision 1.1
diff -p -U3 -r1.1 movua.s
--- sim/sh/movua.s	9 Jan 2004 19:47:36 -0000	1.1
+++ sim/sh/movua.s	8 Sep 2004 22:34:01 -0000
@@ -10,55 +10,107 @@ movua_1:
 	set_grs_a5a5
 	mov.l	srcp, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x03020100
+.else
 	assertreg0	0x00010203
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x04030201
+.else
 	assertreg0	0x01020304
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x05040302
+.else
 	assertreg0	0x02030405
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x06050403
+.else
 	assertreg0	0x03040506
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x07060504
+.else
 	assertreg0	0x04050607
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x08070605
+.else
 	assertreg0	0x05060708
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x09080706
+.else
 	assertreg0	0x06070809
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x0a090807
+.else
 	assertreg0	0x0708090a
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x0b0a0908
+.else
 	assertreg0	0x08090a0b
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x0c0b0a09
+.else
 	assertreg0	0x090a0b0c
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x0d0c0b0a
+.else
 	assertreg0	0x0a0b0c0d
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x0e0d0c0b
+.else
 	assertreg0	0x0b0c0d0e
+.endif
 
 	add	#1, r1
 	movua.l	@r1, r0
+.ifdef LITTLE
+	assertreg0	0x0f0e0d0c
+.else
 	assertreg0	0x0c0d0e0f
+.endif
 
 	assertreg	src+12, r1
 	test_gr_a5a5	r2
@@ -87,25 +139,41 @@ movua_4:
 	set_grs_a5a5
 	mov.l	srcp2, r1
 	movua.l	@r1+, r0
+.ifdef LITTLE
+	assertreg0	0x03020100
+.else
 	assertreg0	0x00010203
+.endif
 	assertreg	src+4, r1
 
 	mov.l	srcp2, r1
 	add	#1, r1
 	movua.l	@r1+, r0
+.ifdef LITTLE
+	assertreg0	0x04030201
+.else
 	assertreg0	0x01020304
+.endif
 	assertreg	src+5, r1
 
 	mov.l	srcp2, r1
 	add	#2, r1
 	movua.l	@r1+, r0
+.ifdef LITTLE
+	assertreg0	0x05040302
+.else
 	assertreg0	0x02030405
+.endif
 	assertreg	src+6, r1
 
 	mov.l	srcp2, r1
 	add	#3, r1
 	movua.l	@r1+, r0
+.ifdef LITTLE
+	assertreg0	0x06050403
+.else
 	assertreg0	0x03040506
+.endif
 	assertreg	src+7, r1
 
 	test_gr_a5a5	r2


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [patch] sim/sh: fix movua for little endian
  2004-09-08 22:35           ` DJ Delorie
@ 2004-09-12 15:02             ` Andrew Cagney
  0 siblings, 0 replies; 9+ messages in thread
From: Andrew Cagney @ 2004-09-12 15:02 UTC (permalink / raw)
  To: DJ Delorie; +Cc: gdb-patches

> fcnvds.s fails, but I don't think it's the test suite that's broken.
> I suspect there's a disagreement between gas and sim on how to lay out
> doubles in memory.

Ok, create a bug and KFAIL it if you want.

> 2004-09-08  DJ Delorie  <dj@redhat.com>
> 
> 	* lib/sim-defs.exp (run_sim_test): Add global_as_options,
> 	global_ld_options, and global_sim_options to all test cases,
> 	if defined.
> 	* sim/sh/allinsn.exp: Set global_as_options and
> 	global_ld_options appropriately for little endian builds.
> 	* sim/sh/movua.s: Support little endian.

Thanks!  Feel free to commit.

Andrew



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2004-09-12 15:02 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-08-13 19:34 [patch] sim/sh: fix movua for little endian DJ Delorie
2004-08-23 19:48 ` Andrew Cagney
2004-08-23 20:22   ` DJ Delorie
2004-08-23 20:43     ` Andrew Cagney
2004-08-23 21:06       ` DJ Delorie
2004-08-24 13:13         ` Andrew Cagney
2004-08-24 14:55           ` DJ Delorie
2004-09-08 22:35           ` DJ Delorie
2004-09-12 15:02             ` Andrew Cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox