diff options
Diffstat (limited to 'powerpc/Asmexpand.ml')
-rw-r--r-- | powerpc/Asmexpand.ml | 58 |
1 files changed, 19 insertions, 39 deletions
diff --git a/powerpc/Asmexpand.ml b/powerpc/Asmexpand.ml index 23c66382..098eb49d 100644 --- a/powerpc/Asmexpand.ml +++ b/powerpc/Asmexpand.ml @@ -495,57 +495,32 @@ let expand_builtin_inline name args res = emit (Plabel lbl); emit (Plwarx (GPR11,GPR0,a1)); emit (Pstwcx_ (GPR10,GPR0,a1)); - emit (Pbne lbl); + emit (Pbf (CRbit_2,lbl)); emit (Pisync); emit (Pstw (GPR11,Cint _0,a3)) | "__builtin_atomic_load", [BA (IR a1); BA (IR a2)],_ -> + let lbl = new_label () in emit (Psync); emit (Plwz (a1,Cint _0,a1)); emit (Pcmpw (a1,a1)); - emit (Pbne_rel _4); + emit (Pbf (CRbit_2,lbl)); + emit (Plabel lbl); emit (Pisync); emit (Pstw (a1,Cint _0, a2)); - | "__builtin_sync_fetch_and_add", [BA (IR a1); BA(IR a2)], BR (IR res) -> + | "__builtin_sync_fetch_and_add", [BA (IR a1); BA(IR a2)], res -> let lbl = new_label() in + let res = (match res with + | BR (IR res) -> res + | BR_none -> GPR3 + | _ -> raise (Error ("unrecognized builtin " ^ name))) in emit (Psync); emit (Plabel lbl); emit (Plwarx (res,GPR0,a1)); emit (Padd (GPR10,res,a2)); emit (Pstwcx_ (GPR10,GPR0,a1)); - emit (Pbne lbl); - emit (Pisync); - | "__builtin_sync_fetch_and_add", [BA (IR a1); BA(IR a2)], BR_none -> - let lbl = new_label() in - emit (Psync); - emit (Plabel lbl); - emit (Plwarx (GPR3,GPR0,a1)); - emit (Padd (GPR10,GPR3,a2)); - emit (Pstwcx_ (GPR10,GPR0,a1)); - emit (Pbne lbl); + emit (Pbf (CRbit_2, lbl)); emit (Pisync); - | "__builtin_atomic_compare_exchange", [BA (IR dst); BA(IR exp); BA (IR des)], BR (IR res) -> - let lbls = new_label () - and lblneq = new_label () - and lblsucc = new_label () in - emit (Plwz (GPR10,Cint _0,exp)); - emit (Plwz (GPR11,Cint _0,des)); - emit (Psync); - emit (Plabel lbls); - emit (Plwarx (GPR12,GPR0,dst)); - emit (Pcmpw (GPR12,GPR10)); - emit (Pbne lblneq); - emit (Pstwcx_ (GPR11,GPR0,dst)); - emit (Pbne lbls); - emit (Plabel lblneq); - emit (Pisync); - emit (Pmfcr dst); - emit (Prlwinm (dst,dst,(Z.of_uint 3),_1)); - emit (Pcmpwi (dst,(Cint _0))); - emit (Pbne lblsucc); - emit (Pstw (GPR12,(Cint _0),exp)); - emit (Plabel lblsucc); - emit (Pmr (res,dst)); - | "__builtin_atomic_compare_exchange", [BA (IR dst); BA(IR exp); BA (IR des)], BR_none -> + | "__builtin_atomic_compare_exchange", [BA (IR dst); BA(IR exp); BA (IR des)], res -> let lbls = new_label () and lblneq = new_label () and lblsucc = new_label () in @@ -555,17 +530,22 @@ let expand_builtin_inline name args res = emit (Plabel lbls); emit (Plwarx (GPR12,GPR0,dst)); emit (Pcmpw (GPR12,GPR10)); - emit (Pbne lblneq); + emit (Pbf (CRbit_2,lblneq)); emit (Pstwcx_ (GPR11,GPR0,dst)); - emit (Pbne lbls); + emit (Pbf (CRbit_2,lbls)); emit (Plabel lblneq); emit (Pisync); emit (Pmfcr dst); emit (Prlwinm (dst,dst,(Z.of_uint 3),_1)); emit (Pcmpwi (dst,(Cint _0))); - emit (Pbne lblsucc); + emit (Pbf (CRbit_2,lblsucc)); emit (Pstw (GPR12,(Cint _0),exp)); emit (Plabel lblsucc); + (match res with + | BR_none -> () + | BR (IR res) -> + emit (Pmr (res,dst)) + | _ ->raise (Error ("unrecognized builtin " ^ name))) (* Catch-all *) | _ -> raise (Error ("unrecognized builtin " ^ name)) |