Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 May 2015 18:52:07 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282776 - head/sys/arm/include
Message-ID:  <201505111852.t4BIq7dI020224@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Mon May 11 18:52:06 2015
New Revision: 282776
URL: https://svnweb.freebsd.org/changeset/base/282776

Log:
  List both registers to use in the 64-bit atomic instructions. We will need
  these to build for Thumb-2.

Modified:
  head/sys/arm/include/atomic.h

Modified: head/sys/arm/include/atomic.h
==============================================================================
--- head/sys/arm/include/atomic.h	Mon May 11 17:49:07 2015	(r282775)
+++ head/sys/arm/include/atomic.h	Mon May 11 18:52:06 2015	(r282776)
@@ -151,10 +151,10 @@ atomic_set_64(volatile uint64_t *p, uint
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[tmp], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   orr      %Q[tmp], %Q[val]\n"
 		"   orr      %R[tmp], %R[val]\n"
-		"   strexd   %[exf], %[tmp], [%[ptr]]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -204,10 +204,10 @@ atomic_clear_64(volatile uint64_t *p, ui
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[tmp], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   bic      %Q[tmp], %Q[val]\n"
 		"   bic      %R[tmp], %R[val]\n"
-		"   strexd   %[exf], %[tmp], [%[ptr]]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -263,13 +263,13 @@ atomic_cmpset_64(volatile uint64_t *p, u
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[tmp], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %Q[tmp], %Q[cmpval]\n"
 		"   itee eq  \n"
 		"   teqeq    %R[tmp], %R[cmpval]\n"
 		"   movne    %[ret], #0\n"
 		"   bne      2f\n"
-		"   strexd   %[ret], %[newval], [%[ptr]]\n"
+		"   strexd   %[ret], %Q[newval], %R[newval], [%[ptr]]\n"
 		"   teq      %[ret], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -381,10 +381,10 @@ atomic_add_64(volatile uint64_t *p, uint
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[tmp], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   adds     %Q[tmp], %Q[val]\n"
-		"   adc      %R[tmp], %R[val]\n"
-		"   strexd   %[exf], %[tmp], [%[ptr]]\n"
+		"   adc      %R[tmp], %R[tmp], %R[val]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -433,10 +433,10 @@ atomic_subtract_64(volatile uint64_t *p,
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[tmp], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   subs     %Q[tmp], %Q[val]\n"
-		"   sbc      %R[tmp], %R[val]\n"
-		"   strexd   %[exf], %[tmp], [%[ptr]]\n"
+		"   sbc      %R[tmp], %R[tmp], %R[val]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -536,10 +536,10 @@ atomic_fetchadd_64(volatile uint64_t *p,
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[ret], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   adds     %Q[tmp], %Q[ret], %Q[val]\n"
 		"   adc      %R[tmp], %R[ret], %R[val]\n"
-		"   strexd   %[exf], %[tmp], [%[ptr]]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -560,10 +560,10 @@ atomic_readandclear_64(volatile uint64_t
 
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[ret], [%[ptr]]\n"
+		"   ldrexd   %Q[ret], %R[ret], [%[ptr]]\n"
 		"   mov      %Q[tmp], #0\n"
 		"   mov      %R[tmp], #0\n"
-		"   strexd   %[exf], %[tmp], [%[ptr]]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"
@@ -587,7 +587,7 @@ atomic_load_64(volatile uint64_t *p)
 	 */
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[ret], [%[ptr]]\n"
+		"   ldrexd   %Q[ret], %R[ret], [%[ptr]]\n"
 		"   clrex    \n"
 		:   [ret]    "=&r"  (ret)
 		:   [ptr]    "r"    (p)
@@ -618,8 +618,8 @@ atomic_store_64(volatile uint64_t *p, ui
 	 */
 	__asm __volatile(
 		"1:          \n"
-		"   ldrexd   %[tmp], [%[ptr]]\n"
-		"   strexd   %[exf], %[val], [%[ptr]]\n"
+		"   ldrexd   %Q[tmp], %R[tmp], [%[ptr]]\n"
+		"   strexd   %[exf], %Q[tmp], %R[tmp], [%[ptr]]\n"
 		"   teq      %[exf], #0\n"
 		"   it ne    \n"
 		"   bne      1b\n"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505111852.t4BIq7dI020224>