Index: cpukit/score/cpu/arm/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/arm/rtems/score/cpu.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/cpu/arm/rtems/score/cpu.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -470,11 +470,10 @@
   uint32_t _CPU_SMP_Initialize( uint32_t configured_cpu_count );
 
-  RTEMS_COMPILER_PURE_ATTRIBUTE static inline uint32_t
-    _CPU_SMP_Get_current_processor( void )
+  static inline uint32_t _CPU_SMP_Get_current_processor( void )
   {
     uint32_t mpidr;
 
     /* Use ARMv7 Multiprocessor Affinity Register (MPIDR) */
-    __asm__ (
+    __asm__ volatile (
       "mrc p15, 0, %[mpidr], c0, c0, 5\n"
       : [mpidr] "=&r" (mpidr)
Index: cpukit/score/cpu/i386/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/i386/rtems/score/cpu.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/cpu/i386/rtems/score/cpu.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -465,5 +465,5 @@
   uint32_t _CPU_SMP_Initialize( uint32_t configured_cpu_count );
 
-  RTEMS_COMPILER_PURE_ATTRIBUTE uint32_t _CPU_SMP_Get_current_processor( void );
+  uint32_t _CPU_SMP_Get_current_processor( void );
 
   void _CPU_SMP_Send_interrupt( uint32_t target_processor_index );
Index: cpukit/score/cpu/no_cpu/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/no_cpu/rtems/score/cpu.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/cpu/no_cpu/rtems/score/cpu.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -1487,6 +1487,5 @@
    * range of integers starting with zero up to the processor count minus one.
    */
-  RTEMS_COMPILER_PURE_ATTRIBUTE static inline uint32_t
-    _CPU_SMP_Get_current_processor( void )
+  static inline uint32_t _CPU_SMP_Get_current_processor( void )
   {
     return 123;
Index: cpukit/score/cpu/powerpc/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/powerpc/rtems/score/cpu.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/cpu/powerpc/rtems/score/cpu.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -1037,11 +1037,10 @@
   uint32_t _CPU_SMP_Initialize( uint32_t configured_cpu_count );
 
-  RTEMS_COMPILER_PURE_ATTRIBUTE static inline uint32_t
-    _CPU_SMP_Get_current_processor( void )
+  static inline uint32_t _CPU_SMP_Get_current_processor( void )
   {
     uint32_t pir;
 
     /* Use Book E Processor ID Register (PIR) */
-    __asm__ (
+    __asm__ volatile (
       "mfspr %[pir], 286"
       : [pir] "=&r" (pir)
Index: cpukit/score/cpu/sparc/rtems/score/cpu.h
===================================================================
--- cpukit/score/cpu/sparc/rtems/score/cpu.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/cpu/sparc/rtems/score/cpu.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -1164,5 +1164,5 @@
   uint32_t _CPU_SMP_Initialize( uint32_t configured_cpu_count );
 
-  RTEMS_COMPILER_PURE_ATTRIBUTE uint32_t _CPU_SMP_Get_current_processor( void );
+  uint32_t _CPU_SMP_Get_current_processor( void );
 
   void _CPU_SMP_Send_interrupt( uint32_t target_processor_index );
Index: cpukit/score/cpu/sparc/rtems/score/sparc.h
===================================================================
--- cpukit/score/cpu/sparc/rtems/score/sparc.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/cpu/sparc/rtems/score/sparc.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -299,5 +299,5 @@
   uint32_t asr17;
 
-  __asm__ (
+  __asm__ volatile (
     "rd %%asr17, %0"
     : "=&r" (asr17)
Index: cpukit/score/include/rtems/score/smp.h
===================================================================
--- cpukit/score/include/rtems/score/smp.h	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ cpukit/score/include/rtems/score/smp.h	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -47,6 +47,5 @@
 
 #if defined( RTEMS_SMP )
-  RTEMS_COMPILER_PURE_ATTRIBUTE static inline uint32_t
-    _SMP_Get_current_processor( void )
+  static inline uint32_t _SMP_Get_current_processor( void )
   {
     return _CPU_SMP_Get_current_processor();
Index: testsuites/smptests/smpmigration01/init.c
===================================================================
--- testsuites/smptests/smpmigration01/init.c	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ testsuites/smptests/smpmigration01/init.c	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -17,7 +17,9 @@
 #endif
 
+#define TESTS_USE_PRINTF
 #include "tmacros.h"
 
 #include <stdio.h>
+#include <math.h>
 #include <inttypes.h>
 
@@ -101,4 +103,9 @@
     /* Do nothing */
   }
+}
+
+static uint32_t abs_delta(uint32_t a, uint32_t b)
+{
+  return a > b ?  a - b : b - a;
 }
 
@@ -111,4 +118,6 @@
   uint32_t expected_tokens;
   uint32_t total_delta;
+  uint64_t total_cycles;
+  uint32_t average_cycles;
 
   sc = rtems_task_create(
@@ -145,32 +154,59 @@
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
+  total_cycles = 0;
+  for (runner_index = 0; runner_index < RUNNER_COUNT; ++runner_index) {
+    const test_counters *counters = &ctx->counters[runner_index];
+    size_t cpu;
+
+    for (cpu = 0; cpu < CPU_COUNT; ++cpu) {
+      total_cycles += counters->cycles_per_cpu[cpu].counter;
+    }
+  }
+  average_cycles = (uint32_t) (total_cycles / (RUNNER_COUNT * CPU_COUNT));
+
+  printf(
+    "total cycles %" PRIu64 "\n"
+    "average cycles %" PRIu32 "\n",
+    total_cycles,
+    average_cycles
+  );
+
+  for (runner_index = 0; runner_index < RUNNER_COUNT; ++runner_index) {
+    const test_counters *counters = &ctx->counters[runner_index];
+    size_t cpu;
+
+    printf("runner %" PRIuPTR "\n", runner_index);
+
+    for (cpu = 0; cpu < CPU_COUNT; ++cpu) {
+      uint32_t tokens = counters->tokens_per_cpu[cpu].counter;
+      uint32_t cycles = counters->cycles_per_cpu[cpu].counter;
+      double cycle_deviation = ((double) cycles - average_cycles)
+        / average_cycles;
+
+      printf(
+        "\tcpu %zu tokens %" PRIu32 "\n"
+        "\tcpu %zu cycles %" PRIu32 "\n"
+        "\tcpu %zu cycle deviation %f\n",
+        cpu,
+        tokens,
+        cpu,
+        cycles,
+        cpu,
+        cycle_deviation
+      );
+
+      rtems_test_assert(fabs(cycle_deviation) < 0.5);
+    }
+  }
+
+  expected_tokens = ctx->counters[0].tokens_per_cpu[0].counter;
+  total_delta = 0;
   for (runner_index = 0; runner_index < RUNNER_COUNT; ++runner_index) {
     test_counters *counters = &ctx->counters[runner_index];
     size_t cpu;
 
-    printf("runner %" PRIuPTR "\n", runner_index);
-
-    for (cpu = 0; cpu < CPU_COUNT; ++cpu) {
-      printf(
-        "\tcpu %zu tokens %" PRIu32 "\n"
-        "\tcpu %zu cycles %" PRIu32 "\n",
-        cpu,
-        counters->tokens_per_cpu[cpu].counter,
-        cpu,
-        counters->cycles_per_cpu[cpu].counter
-      );
-    }
-  }
-
-  expected_tokens = ctx->counters[0].tokens_per_cpu[0].counter;
-  total_delta = 0;
-  for (runner_index = 0; runner_index < RUNNER_COUNT; ++runner_index) {
-    test_counters *counters = &ctx->counters[runner_index];
-    size_t cpu;
-
     for (cpu = 0; cpu < CPU_COUNT; ++cpu) {
       uint32_t tokens = counters->tokens_per_cpu[cpu].counter;
-      uint32_t delta = tokens > expected_tokens ?
-        tokens - expected_tokens : expected_tokens - tokens;
+      uint32_t delta = abs_delta(tokens, expected_tokens);
 
       rtems_test_assert(delta <= 1);
@@ -205,4 +241,6 @@
 #define CONFIGURE_MAXIMUM_TASKS (2 + RUNNER_COUNT)
 
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
 
Index: testsuites/smptests/smpmigration01/smpmigration01.scn
===================================================================
--- testsuites/smptests/smpmigration01/smpmigration01.scn	(revision 7ee4e72e4b2052139d296100f0836403906bd317)
+++ testsuites/smptests/smpmigration01/smpmigration01.scn	(revision 47d6013417c63115356042695e7125ecfcfe4696)
@@ -1,17 +1,25 @@
 *** TEST SMPMIGRATION 1 ***
+total cycles 94476101
+average cycles 15746016
 runner 0
-        cpu 0 tokens 453284
-        cpu 0 cycles 14955317
-        cpu 1 tokens 453283
-        cpu 1 cycles 14978390
+        cpu 0 tokens 456994
+        cpu 0 cycles 16451659
+        cpu 0 cycle deviation 0.044814
+        cpu 1 tokens 456994
+        cpu 1 cycles 16895680
+        cpu 1 cycle deviation 0.073013
 runner 1
-        cpu 0 tokens 453283
-        cpu 0 cycles 21302793
-        cpu 1 tokens 453283
-        cpu 1 cycles 21318817
+        cpu 0 tokens 456993
+        cpu 0 cycles 20561545
+        cpu 0 cycle deviation 0.305825
+        cpu 1 tokens 456994
+        cpu 1 cycles 20548432
+        cpu 1 cycle deviation 0.304992
 runner 2
-        cpu 0 tokens 453283
-        cpu 0 cycles 19973312
-        cpu 1 tokens 453283
-        cpu 1 cycles 21315227
+        cpu 0 tokens 456994
+        cpu 0 cycles 10007206
+        cpu 0 cycle deviation -0.364461
+        cpu 1 tokens 456993
+        cpu 1 cycles 10011579
+        cpu 1 cycle deviation -0.364183
 *** END OF TEST SMPMIGRATION 1 ***
