- Timestamp:
- Jan 2, 2021 2:14:52 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 142066
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/asm.h
r87147 r87154 169 169 170 170 171 /** @def RT_INLINE_ASM_EXTERNAL_TMP_ARM 172 * Temporary version of RT_INLINE_ASM_EXTERNAL that excludes ARM. */ 173 #if RT_INLINE_ASM_EXTERNAL && !(defined(RT_ARCH_ARM64) || defined(RT_ARCH_ARM32)) 174 # define RT_INLINE_ASM_EXTERNAL_TMP_ARM 1 175 #else 176 # define RT_INLINE_ASM_EXTERNAL_TMP_ARM 0 177 #endif 178 179 171 180 /** @def ASMReturnAddress 172 181 * Gets the return address of the current (or calling if you like) function or method. … … 243 252 } 244 253 # endif 254 255 # elif defined(RT_ARCH_ARM32) || defined(RT_ARCH_ARM64) 256 __asm__ __volatile__("yield\n\t"); /* ARMv6K+ */ 257 245 258 # else 246 259 /* dummy */ … … 257 270 * @param u8 The 8-bit value to assign to *pu8. 258 271 */ 259 #if RT_INLINE_ASM_EXTERNAL 272 #if RT_INLINE_ASM_EXTERNAL_TMP_ARM 260 273 RT_ASM_DECL_PRAGMA_WATCOM(uint8_t) ASMAtomicXchgU8(volatile uint8_t RT_FAR *pu8, uint8_t u8) RT_NOTHROW_PROTO; 261 274 #else 262 275 DECLINLINE(uint8_t) ASMAtomicXchgU8(volatile uint8_t RT_FAR *pu8, uint8_t u8) RT_NOTHROW_DEF 263 276 { 264 # if RT_INLINE_ASM_GNU_STYLE 277 # if defined(RT_ARCH_AMD64) || defined(RT_ARCH_X86) 278 # if RT_INLINE_ASM_GNU_STYLE 265 279 __asm__ __volatile__("xchgb %0, %1\n\t" 266 280 : "=m" (*pu8), … … 268 282 : "1" (u8), 269 283 "m" (*pu8)); 270 # else284 # else 271 285 __asm 272 286 { 273 # ifdef RT_ARCH_AMD64287 # ifdef RT_ARCH_AMD64 274 288 mov rdx, [pu8] 275 289 mov al, [u8] 276 290 xchg [rdx], al 277 291 mov [u8], al 278 # else292 # else 279 293 mov edx, [pu8] 280 294 mov al, [u8] 281 295 xchg [edx], al 282 296 mov [u8], al 283 # endif284 } 285 # endif297 # endif 298 } 299 # endif 286 300 return u8; 301 302 # elif defined(RT_ARCH_ARM32) || defined(RT_ARCH_ARM64) 303 RTCCUINTREG uOld; 304 RTCCUINTREG rcSpill; 305 __asm__ __volatile__("try_again%=:\n\t" 306 # if defined(RT_ARCH_ARM64) 307 "ldaxrb %w0, [%3]\n\t" 308 "stlxrb %w1, %w2, [%3]\n\t" 309 "cbnz %w1, try_again%=\n\t" 310 # else 311 "ldrexb %0, [%3]\n\t" /* ARMv6+ */ 312 "strex %1, %2, [%3]\n\t" 313 "cmp %1, #0\n\t" 314 "bne try_again%=\n\t" 315 # endif 316 : "=&r" (uOld), 317 "=&r" (rcSpill) 318 : "r" ((RTCCUINTREG)u8), 319 "r" (pu8) 320 : "memory"); 321 return (uint8_t)uOld; 322 323 # else 324 # error "Port me" 325 # endif 287 326 } 288 327 #endif
Note:
See TracChangeset
for help on using the changeset viewer.