aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-04-03 20:44:16 +0200
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-04-03 20:44:16 +0200
commit015a05d8661504388ea1109f740eb16220311f93 (patch)
tree52a76f3a13983848756f4095f655307169a4d11a
parentc8cd3d017890a250f32463b6dca6571d181a3c22 (diff)
downloadcompcert-kvx-015a05d8661504388ea1109f740eb16220311f93.tar.gz
compcert-kvx-015a05d8661504388ea1109f740eb16220311f93.zip
begin implementing ternary builtin
-rw-r--r--backend/Selection.v17
-rw-r--r--test/monniaux/ternary_builtin/ternary_builtin.c7
2 files changed, 20 insertions, 4 deletions
diff --git a/backend/Selection.v b/backend/Selection.v
index a87578ba..5e45dde3 100644
--- a/backend/Selection.v
+++ b/backend/Selection.v
@@ -276,10 +276,19 @@ Definition sel_builtin optid ef args :=
match ef with
| EF_builtin name sign =>
(if String.string_dec name "__builtin_ternary_uint"
- then (match optid with
- | None => OK Sskip
- | Some id => Error (msg "Selection: ternary uint")
- end)
+ then
+ match optid with
+ | None => OK Sskip
+ | Some id =>
+ match args with
+ | a1::a2::a3::nil =>
+ OK (Sassign id (Eop Oselect
+ ((sel_expr a3):::
+ (sel_expr a2):::
+ (sel_expr a1):::Enil)))
+ | _ => Error (msg "__builtin_ternary_uint: arguments")
+ end
+ end
else sel_builtin_default optid ef args)
| _ => sel_builtin_default optid ef args
end.
diff --git a/test/monniaux/ternary_builtin/ternary_builtin.c b/test/monniaux/ternary_builtin/ternary_builtin.c
index 8052da0f..98497387 100644
--- a/test/monniaux/ternary_builtin/ternary_builtin.c
+++ b/test/monniaux/ternary_builtin/ternary_builtin.c
@@ -1,3 +1,10 @@
+#include <stdio.h>
+
int essai(int x, unsigned y, unsigned z) {
return __builtin_ternary_uint(x, y, z);
}
+
+int main() {
+ printf("%d\n", essai(0, 42, 69));
+ return 0;
+}