aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mppa_k1c/Asmexpand.ml65
-rw-r--r--mppa_k1c/TargetPrinter.ml2
-rw-r--r--test/mppa/general/clzll.c4
-rw-r--r--test/mppa/general/stsud.c5
4 files changed, 15 insertions, 61 deletions
diff --git a/mppa_k1c/Asmexpand.ml b/mppa_k1c/Asmexpand.ml
index 282fa476..b3a1e836 100644
--- a/mppa_k1c/Asmexpand.ml
+++ b/mppa_k1c/Asmexpand.ml
@@ -417,73 +417,18 @@ let expand_builtin_inline name args res =
(* Synchronization *)
| "__builtin_membar", [], _ ->
()
-(*| "__builtin_fence", [], _ ->
- emit Pfence
-*)(* Vararg stuff *)
+ (* Vararg stuff *)
| "__builtin_va_start", [BA(IR a)], _ ->
expand_builtin_va_start a
+ | "__builtin_clzll", [BA(IR a)], BR(IR res) ->
+ emit (PExpand (Pclzll(res, a)))
+ | "__builtin_k1_stsud", [BA(IR a1); BA(IR a2)], BR(IR res) ->
+ emit (PExpand (Pstsud(res, a1, a2)))
(* Byte swaps *)
(*| "__builtin_bswap16", [BA(IR a1)], BR(IR res) ->
expand_bswap16 res a1
- | ("__builtin_bswap"| "__builtin_bswap32"), [BA(IR a1)], BR(IR res) ->
- expand_bswap32 res a1
- | "__builtin_bswap64", [BA(IR a1)], BR(IR res) ->
- expand_bswap64 res a1
- | "__builtin_bswap64", [BA_splitlong(BA(IR ah), BA(IR al))],
- BR_splitlong(BR(IR rh), BR(IR rl)) ->
- assert (ah = X6 && al = X5 && rh = X5 && rl = X6);
- expand_bswap32 X5 X5;
- expand_bswap32 X6 X6
- (* Float arithmetic *)
| "__builtin_fabs", [BA(FR a1)], BR(FR res) ->
emit (Pfabsd(res, a1))
- | "__builtin_fsqrt", [BA(FR a1)], BR(FR res) ->
- emit (Pfsqrtd(res, a1))
- | "__builtin_fmadd", [BA(FR a1); BA(FR a2); BA(FR a3)], BR(FR res) ->
- emit (Pfmaddd(res, a1, a2, a3))
- | "__builtin_fmsub", [BA(FR a1); BA(FR a2); BA(FR a3)], BR(FR res) ->
- emit (Pfmsubd(res, a1, a2, a3))
- | "__builtin_fnmadd", [BA(FR a1); BA(FR a2); BA(FR a3)], BR(FR res) ->
- emit (Pfnmaddd(res, a1, a2, a3))
- | "__builtin_fnmsub", [BA(FR a1); BA(FR a2); BA(FR a3)], BR(FR res) ->
- emit (Pfnmsubd(res, a1, a2, a3))
- | "__builtin_fmin", [BA(FR a1); BA(FR a2)], BR(FR res) ->
- emit (Pfmind(res, a1, a2))
- | "__builtin_fmax", [BA(FR a1); BA(FR a2)], BR(FR res) ->
- emit (Pfmaxd(res, a1, a2))
- (* 64-bit integer arithmetic for a 32-bit platform *)
- | "__builtin_negl", [BA_splitlong(BA(IR ah), BA(IR al))],
- BR_splitlong(BR(IR rh), BR(IR rl)) ->
- expand_int64_arith (rl = ah) rl
- (fun rl ->
- emit (Psltuw (X1, X0, X al));
- emit (Psubw (rl, X0, X al));
- emit (Psubw (rh, X0, X ah));
- emit (Psubw (rh, X rh, X X1)))
- | "__builtin_addl", [BA_splitlong(BA(IR ah), BA(IR al));
- BA_splitlong(BA(IR bh), BA(IR bl))],
- BR_splitlong(BR(IR rh), BR(IR rl)) ->
- expand_int64_arith (rl = bl || rl = ah || rl = bh) rl
- (fun rl ->
- emit (Paddw (rl, X al, X bl));
- emit (Psltuw (X1, X rl, X bl));
- emit (Paddw (rh, X ah, X bh));
- emit (Paddw (rh, X rh, X X1)))
- | "__builtin_subl", [BA_splitlong(BA(IR ah), BA(IR al));
- BA_splitlong(BA(IR bh), BA(IR bl))],
- BR_splitlong(BR(IR rh), BR(IR rl)) ->
- expand_int64_arith (rl = ah || rl = bh) rl
- (fun rl ->
- emit (Psltuw (X1, X al, X bl));
- emit (Psubw (rl, X al, X bl));
- emit (Psubw (rh, X ah, X bh));
- emit (Psubw (rh, X rh, X X1)))
- | "__builtin_mull", [BA(IR a); BA(IR b)],
- BR_splitlong(BR(IR rh), BR(IR rl)) ->
- expand_int64_arith (rl = a || rl = b) rl
- (fun rl ->
- emit (Pmulw (rl, X a, X b));
- emit (Pmulhuw (rh, X a, X b)))
*)
(* Catch-all *)
| _ ->
diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml
index ad06500e..41ea06e4 100644
--- a/mppa_k1c/TargetPrinter.ml
+++ b/mppa_k1c/TargetPrinter.ml
@@ -224,7 +224,7 @@ module Target : TARGET =
(* Pseudo-instructions not generated by Asmgen *)
| Pclzll(rd, rs) ->
- fprintf oc " clzll %a = %a\n;;\n" ireg rd ireg rs
+ fprintf oc " clzd %a = %a\n;;\n" ireg rd ireg rs
| Pstsud(rd, rs1, rs2) ->
fprintf oc " stsud %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2
diff --git a/test/mppa/general/clzll.c b/test/mppa/general/clzll.c
new file mode 100644
index 00000000..e3853ea8
--- /dev/null
+++ b/test/mppa/general/clzll.c
@@ -0,0 +1,4 @@
+int main(void){
+ long long a = -5;
+ return __builtin_clzll(a);
+}
diff --git a/test/mppa/general/stsud.c b/test/mppa/general/stsud.c
new file mode 100644
index 00000000..dc8769fe
--- /dev/null
+++ b/test/mppa/general/stsud.c
@@ -0,0 +1,5 @@
+int main(void){
+ unsigned long long a = 5;
+ long long b = -3;
+ return __builtin_k1_stsud(a, b);
+}