diff mbox

[4.7,SH] Binary compatibility with atomic_test_and_test_trueval != 1

Message ID 1330888174.2929.243.camel@yam-132-YW-E178-FTW
State New
Headers show

Commit Message

Oleg Endo March 4, 2012, 7:09 p.m. UTC
On Sat, 2012-03-03 at 10:31 -0800, Richard Henderson wrote:
> On 03/02/2012 10:11 AM, Richard Henderson wrote:
> > I'm in the process of sanity testing this on x86_64 with trueval set to 0x80.
> > Jakub, ok for 4.7 branch if it passes?
> > 
> > 	* optabs.c (expand_atomic_test_and_set): Honor
> > 	atomic_test_and_set_trueval even when atomic_test_and_set
> > 	optab is not in use.
> 
> I've committed this patch to mainline.  I still think it ought to 
> go onto the 4.7 branch...
> 

Attached is a slightly modified version of the patch from
http://gcc.gnu.org/ml/gcc-patches/2012-03/msg00085.html

I have removed the signed char weirdo and adjusted the comment above
TARGET_ATOMIC_TEST_AND_SET_TRUEVAL accordingly.

Tested by compiling some test functions that use __atomic_test_and_set /
__GCC_ATOMIC_TEST_AND_SET_TRUEVAL with various SH atomic option
combinations and looking at the output asm.

OK to apply to trunk?

Richard, could you also please take the
TARGET_ATOMIC_TEST_AND_SET_TRUEVAL hunk from this patch for the 4.7
branch?

Cheers,
Oleg


2012-03-04  Oleg Endo  <olegendo@gcc.gnu.org>

	* config/sh/sh.h (TARGET_ATOMIC_TEST_AND_SET_TRUEVAL): New hook.
	* config/sh/sync.md (atomic_test_and_set): New expander.
	(tasb, atomic_test_and_set_soft): New insns.
	* config/sh/sh.opt (menable-tas): New option.
	* doc/invoke.texi (SH Options): Document it.

Comments

Kaz Kojima March 4, 2012, 11:12 p.m. UTC | #1
Oleg Endo <oleg.endo@t-online.de> wrote:
> Attached is a slightly modified version of the patch from
> http://gcc.gnu.org/ml/gcc-patches/2012-03/msg00085.html
> 
> I have removed the signed char weirdo and adjusted the comment above
> TARGET_ATOMIC_TEST_AND_SET_TRUEVAL accordingly.
> 
> Tested by compiling some test functions that use __atomic_test_and_set /
> __GCC_ATOMIC_TEST_AND_SET_TRUEVAL with various SH atomic option
> combinations and looking at the output asm.
> 
> OK to apply to trunk?

OK.

Regards,
	kaz
Richard Henderson March 5, 2012, 7 p.m. UTC | #2
On 03/04/2012 11:09 AM, Oleg Endo wrote:
> Richard, could you also please take the
> TARGET_ATOMIC_TEST_AND_SET_TRUEVAL hunk from this patch for the 4.7
> branch?

Done.  I've also moved the TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 
definition from sh.h to sh.c where it belongs.


r~
Oleg Endo March 5, 2012, 9:44 p.m. UTC | #3
On Mon, 2012-03-05 at 11:00 -0800, Richard Henderson wrote:
> On 03/04/2012 11:09 AM, Oleg Endo wrote:
> > Richard, could you also please take the
> > TARGET_ATOMIC_TEST_AND_SET_TRUEVAL hunk from this patch for the 4.7
> > branch?
> 
> Done.  

Thanks!

> I've also moved the TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 
> definition from sh.h to sh.c where it belongs.

Yeah, however, I'm also using the value behind
TARGET_ATOMIC_TEST_AND_SET_TRUEVAL in sync.md.  If it's in sh.c it
doesn't work.  That's why I left it in sh.h.

Cheers,
Oleg
Richard Henderson March 5, 2012, 9:49 p.m. UTC | #4
On 03/05/2012 01:44 PM, Oleg Endo wrote:
> Yeah, however, I'm also using the value behind
> TARGET_ATOMIC_TEST_AND_SET_TRUEVAL in sync.md.  If it's in sh.c it
> doesn't work.  That's why I left it in sh.h.

That value should be available via targetm.atomic_test_and_set_trueval.


r~
Oleg Endo March 5, 2012, 10:15 p.m. UTC | #5
On Mon, 2012-03-05 at 13:49 -0800, Richard Henderson wrote:
> On 03/05/2012 01:44 PM, Oleg Endo wrote:
> > Yeah, however, I'm also using the value behind
> > TARGET_ATOMIC_TEST_AND_SET_TRUEVAL in sync.md.  If it's in sh.c it
> > doesn't work.  That's why I left it in sh.h.
> 
> That value should be available via targetm.atomic_test_and_set_trueval.
> 

Just tried out in sync.md ...

-   gen_int_mode (TARGET_ATOMIC_TEST_AND_SET_TRUEVAL,
+   gen_int_mode (targetm.atomic_test_and_set_trueval,

gives .. 
/gcc/config/sh/sync.md:421:21: error: ‘targetm’ undeclared

Is there something missing?
diff mbox

Patch

Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi	(revision 184877)
+++ gcc/doc/invoke.texi	(working copy)
@@ -887,7 +887,8 @@ 
 -mdivsi3_libfunc=@var{name} -mfixed-range=@var{register-range} @gol
 -madjust-unroll -mindexed-addressing -mgettrcost=@var{number} -mpt-fixed @gol
 -maccumulate-outgoing-args -minvalid-symbols -msoft-atomic @gol
--mbranch-cost=@var{num} -mcbranchdi -mcmpeqdi -mfused-madd -mpretend-cmove}
+-mbranch-cost=@var{num} -mcbranchdi -mcmpeqdi -mfused-madd -mpretend-cmove @gol
+-menable-tas}
 
 @emph{Solaris 2 Options}
 @gccoptlist{-mimpure-text  -mno-impure-text @gol
@@ -17823,6 +17824,15 @@ 
 This option is enabled by default when the target is @code{sh-*-linux*}.
 For details on the atomic built-in functions see @ref{__atomic Builtins}.
 
+@item -menable-tas
+@opindex menable-tas
+Generate the @code{tas.b} opcode for @code{__atomic_test_and_set}.
+Notice that depending on the particular hardware and software configuration
+this can degrade overall performance due to the operand cache line flushes
+that are implied by the @code{tas.b} instruction.  On multi-core SH4A
+processors the @code{tas.b} instruction must be used with caution since it
+can result in data corruption for certain cache configurations.
+
 @item -mspace
 @opindex mspace
 Optimize for space instead of speed.  Implied by @option{-Os}.
Index: gcc/config/sh/sh.h
===================================================================
--- gcc/config/sh/sh.h	(revision 184877)
+++ gcc/config/sh/sh.h	(working copy)
@@ -2473,4 +2473,10 @@ 
 /* FIXME: middle-end support for highpart optimizations is missing.  */
 #define high_life_started reload_in_progress
 
+/* The tas.b instruction sets the 7th bit in the byte, i.e. 0x80.
+   This value is used by optabs.c atomic op expansion code as well as in 
+   sync.md.  */
+#undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
+#define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 0x80
+
 #endif /* ! GCC_SH_H */
Index: gcc/config/sh/sync.md
===================================================================
--- gcc/config/sh/sync.md	(revision 184877)
+++ gcc/config/sh/sync.md	(working copy)
@@ -404,3 +404,61 @@ 
 	 "1:	mov	r1,r15";
 }
   [(set_attr "length" "18")])
+
+(define_expand "atomic_test_and_set"
+  [(match_operand:SI 0 "register_operand" "")		;; bool result output
+   (match_operand:QI 1 "memory_operand" "")		;; memory
+   (match_operand:SI 2 "const_int_operand" "")]		;; model
+  "(TARGET_SOFT_ATOMIC || TARGET_ENABLE_TAS) && !TARGET_SHMEDIA"
+{
+  rtx addr = force_reg (Pmode, XEXP (operands[1], 0));
+
+  if (TARGET_ENABLE_TAS)
+    emit_insn (gen_tasb (addr));
+  else
+    {
+      rtx val = force_reg (QImode, 
+			   gen_int_mode (TARGET_ATOMIC_TEST_AND_SET_TRUEVAL,
+					 QImode));
+      emit_insn (gen_atomic_test_and_set_soft (addr, val));
+    }
+
+  /* The result of the test op is the inverse of what we are
+     supposed to return.  Thus invert the T bit.  The inversion will be
+     potentially optimized away and integrated into surrounding code.  */
+  emit_insn (gen_movnegt (operands[0]));
+  DONE;
+})
+
+(define_insn "tasb"
+  [(set (reg:SI T_REG)
+	(eq:SI (mem:QI (match_operand:SI 0 "register_operand" "r"))
+	       (const_int 0)))
+   (set (mem:QI (match_dup 0))
+	(unspec:QI [(const_int 128)] UNSPEC_ATOMIC))]
+  "TARGET_ENABLE_TAS && !TARGET_SHMEDIA"
+  "tas.b	@%0"
+  [(set_attr "insn_class" "co_group")])
+
+(define_insn "atomic_test_and_set_soft"
+  [(set (reg:SI T_REG)
+	(eq:SI (mem:QI (match_operand:SI 0 "register_operand" "u"))
+	       (const_int 0)))
+   (set (mem:QI (match_dup 0))
+	(unspec:QI [(match_operand:QI 1 "register_operand" "u")] UNSPEC_ATOMIC))
+   (clobber (match_scratch:QI 2 "=&u"))
+   (clobber (reg:SI R0_REG))
+   (clobber (reg:SI R1_REG))]
+  "TARGET_SOFT_ATOMIC && !TARGET_ENABLE_TAS && !TARGET_SHMEDIA"
+{
+  return "mova	1f,r0"			"\n"
+	 "	.align 2"		"\n"
+	 "	mov	r15,r1"		"\n"
+	 "	mov	#(0f-1f),r15"	"\n"
+	 "0:	mov.b	@%0,%2"		"\n"
+	 "	mov.b	%1,@%0"		"\n"
+	 "1:	mov	r1,r15"		"\n"
+	 "	tst	%2,%2";
+}
+  [(set_attr "length" "16")])
+
Index: gcc/config/sh/sh.opt
===================================================================
--- gcc/config/sh/sh.opt	(revision 184877)
+++ gcc/config/sh/sh.opt	(working copy)
@@ -323,6 +323,10 @@ 
 Target Report Mask(SOFT_ATOMIC)
 Use software atomic sequences supported by kernel
 
+menable-tas
+Target Report RejectNegative Var(TARGET_ENABLE_TAS)
+Use tas.b instruction for __atomic_test_and_set
+
 mspace
 Target RejectNegative Alias(Os)
 Deprecated.  Use -Os instead