Hi, I noticed that sync_lock_release uses lwsync if available but every other sync_* builtin uses a heavyweight sync. eg:
00000060 <sync_fetch_and_add>: 60: 7c 00 04 ac sync 64: 7c 69 1b 78 mr r9,r3 68: 7c 60 48 28 lwarx r3,0,r9 6c: 39 63 00 01 addi r11,r3,1 70: 7d 60 49 2d stwcx. r11,0,r9 74: 40 a2 ff f4 bne- 68 <sync_fetch_and_add+0x8> 78: 4c 00 01 2c isync 7c: 4e 80 00 20 blr Update rs6000_emit_sync, rs6000_split_atomic_op and rs6000_split_compare_and_swap to use gen_lwsync(). Anton -- Index: gcc/gcc/config/rs6000/rs6000.c =================================================================== --- gcc.orig/gcc/config/rs6000/rs6000.c 2008-09-03 02:33:35.000000000 -0400 +++ gcc/gcc/config/rs6000/rs6000.c 2008-09-03 02:44:11.000000000 -0400 @@ -13687,7 +13687,7 @@ rtx shift = NULL_RTX; if (sync_p) - emit_insn (gen_memory_barrier ()); + emit_insn (gen_lwsync ()); if (GET_CODE (m) == NOT) used_m = XEXP (m, 0); @@ -13927,7 +13927,7 @@ enum machine_mode mode = GET_MODE (mem); rtx label, x, cond = gen_rtx_REG (CCmode, CR0_REGNO); - emit_insn (gen_memory_barrier ()); + emit_insn (gen_lwsync ()); label = gen_label_rtx (); emit_label (label); @@ -13967,7 +13967,7 @@ enum machine_mode mode = GET_MODE (mem); rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO); - emit_insn (gen_memory_barrier ()); + emit_insn (gen_lwsync ()); label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); @@ -14071,7 +14071,7 @@ { rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CR0_REGNO); - emit_insn (gen_memory_barrier ()); + emit_insn (gen_lwsync ()); label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ()); emit_label (XEXP (label1, 0));