aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-04-25 11:36:28 +0200
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2019-04-25 11:36:28 +0200
commit2f549eaf7f6bc7e97d8f8a830d18808c2ae66186 (patch)
tree1c8103567dbc8ce356f039323cb2607a96aac1b9
parent5809fa295f23952a2d8b043f6da69d61da3568de (diff)
downloadcompcert-kvx-2f549eaf7f6bc7e97d8f8a830d18808c2ae66186.tar.gz
compcert-kvx-2f549eaf7f6bc7e97d8f8a830d18808c2ae66186.zip
read from bit fields
-rw-r--r--mppa_k1c/Asmblockgen.v14
-rw-r--r--mppa_k1c/PostpassSchedulingOracle.ml12
-rw-r--r--test/monniaux/bitfields/bitfields.c20
3 files changed, 41 insertions, 5 deletions
diff --git a/mppa_k1c/Asmblockgen.v b/mppa_k1c/Asmblockgen.v
index b00e4e89..6af18178 100644
--- a/mppa_k1c/Asmblockgen.v
+++ b/mppa_k1c/Asmblockgen.v
@@ -772,6 +772,20 @@ Definition transl_op
OK (Pcmoveu bt r0 rS r1 ::i k)
end)
+ | Oextfz stop start, a1 :: nil =>
+ assertion ((Z.leb start stop)
+ && (Z.geb start Z.zero)
+ && (Z.ltb stop Int.zwordsize));
+ do rd <- ireg_of res; do rs <- ireg_of a1;
+ OK (Pextfz stop start rd rs ::i k)
+
+ | Oextfs stop start, a1 :: nil =>
+ assertion ((Z.leb start stop)
+ && (Z.geb start Z.zero)
+ && (Z.ltb stop Int.zwordsize));
+ do rd <- ireg_of res; do rs <- ireg_of a1;
+ OK (Pextfs stop start rd rs ::i k)
+
| _, _ =>
Error(msg "Asmgenblock.transl_op")
end.
diff --git a/mppa_k1c/PostpassSchedulingOracle.ml b/mppa_k1c/PostpassSchedulingOracle.ml
index 78a29fbb..87f34ee6 100644
--- a/mppa_k1c/PostpassSchedulingOracle.ml
+++ b/mppa_k1c/PostpassSchedulingOracle.ml
@@ -426,7 +426,7 @@ type real_instruction =
| Addd | Andd | Compd | Muld | Ord | Sbfd | Srad | Srld | Slld | Xord
| Nandw | Norw | Nxorw | Nandd | Nord | Nxord | Andnw | Ornw | Andnd | Ornd
| Maddw | Maddd | Cmoved
- | Make | Nop | Sxwd | Zxwd
+ | Make | Nop | Extfz | Extfs
(* LSU *)
| Lbs | Lbz | Lhs | Lhz | Lws | Ld
| Sb | Sh | Sw | Sd
@@ -476,8 +476,10 @@ let ab_inst_to_real = function
| "Pmaddl" -> Maddd
| "Pmake" | "Pmakel" | "Pmakefs" | "Pmakef" | "Ploadsymbol" -> Make
| "Pnop" | "Pcvtw2l" -> Nop
- | "Psxwd" -> Sxwd
- | "Pzxwd" -> Zxwd
+ | "Psxwd" -> Extfs
+ | "Pzxwd" -> Extfz
+ | "Pextfz" -> Extfz
+ | "Pextfs" -> Extfs
| "Pfnarrowdw" -> Fnarrowdw
| "Pfwidenlwd" -> Fwidenlwd
| "Pfloatwrnsz" -> Floatwz
@@ -572,7 +574,7 @@ let rec_to_usage r =
| Sraw | Srlw | Sllw | Srad | Srld | Slld -> (match encoding with None | Some U6 -> alu_tiny | _ -> raise InvalidEncoding)
(* TODO: check *)
| Rorw -> (match encoding with None | Some U6 -> alu_lite | _ -> raise InvalidEncoding)
- | Sxwd | Zxwd -> (match encoding with None -> alu_lite | _ -> raise InvalidEncoding)
+ | Extfz | Extfs -> (match encoding with None -> alu_lite | _ -> raise InvalidEncoding)
| Fixeduwz | Fixedwz | Floatwz | Floatuwz | Fixeddz | Fixedudz | Floatdz | Floatudz -> mau
| Lbs | Lbz | Lhs | Lhz | Lws | Ld ->
(match encoding with None | Some U6 | Some S10 -> lsu_data
@@ -595,7 +597,7 @@ let real_inst_to_latency = function
| Rorw | Nandw | Norw | Nxorw | Ornw | Andnw
| Nandd | Nord | Nxord | Ornd | Andnd
| Addd | Andd | Compd | Ord | Sbfd | Srad | Srld | Slld | Xord | Make
- | Sxwd | Zxwd | Fcompw | Fcompd | Cmoved
+ | Extfs | Extfz | Fcompw | Fcompd | Cmoved
-> 1
| Floatwz | Floatuwz | Fixeduwz | Fixedwz | Floatdz | Floatudz | Fixeddz | Fixedudz -> 4
| Mulw | Muld | Maddw | Maddd -> 2 (* FIXME - WORST CASE. If it's S10 then it's only 1 *)
diff --git a/test/monniaux/bitfields/bitfields.c b/test/monniaux/bitfields/bitfields.c
new file mode 100644
index 00000000..868d7483
--- /dev/null
+++ b/test/monniaux/bitfields/bitfields.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+
+struct fields {
+ unsigned f0 : 3;
+ unsigned f1 : 5;
+ signed f2 : 3;
+};
+
+int get_f1(struct fields x) {
+ return x.f1;
+}
+
+int get_f2(struct fields x) {
+ return x.f2;
+}
+
+int main() {
+ struct fields x = {1, 2, -1};
+ printf("%d %d\n", get_f1(x), get_f2(x));
+}