aboutsummaryrefslogtreecommitdiffstats
path: root/powerpc/Asmexpand.ml
diff options
context:
space:
mode:
authorBernhard Schommer <bernhardschommer@gmail.com>2015-09-15 12:32:09 +0200
committerBernhard Schommer <bernhardschommer@gmail.com>2015-09-15 12:32:09 +0200
commitfb9578680d1cd88650e7e6aa9bf1e1ffd8b32f49 (patch)
treead4b3da06dc7621ed64353b52abb92edc8291ff6 /powerpc/Asmexpand.ml
parent9dc0dd73f75875b301c886df40087192d0fad386 (diff)
downloadcompcert-fb9578680d1cd88650e7e6aa9bf1e1ffd8b32f49.tar.gz
compcert-fb9578680d1cd88650e7e6aa9bf1e1ffd8b32f49.zip
Removed usage of bne and removed duplicated code for return values of atomics.
Instead of introducing a new bne instruction in Asm.v and the TargetPrinter.ml I use the equivalent bf instruction. The duplicated code is due to unused return values of builtins. Now we only emit the additional code for the return value if the return value is used instead of duplicating the whole emiting sequence.
Diffstat (limited to 'powerpc/Asmexpand.ml')
-rw-r--r--powerpc/Asmexpand.ml58
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))