diff options
author | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-04-25 11:36:28 +0200 |
---|---|---|
committer | David Monniaux <david.monniaux@univ-grenoble-alpes.fr> | 2019-04-25 11:36:28 +0200 |
commit | 2f549eaf7f6bc7e97d8f8a830d18808c2ae66186 (patch) | |
tree | 1c8103567dbc8ce356f039323cb2607a96aac1b9 | |
parent | 5809fa295f23952a2d8b043f6da69d61da3568de (diff) | |
download | compcert-kvx-2f549eaf7f6bc7e97d8f8a830d18808c2ae66186.tar.gz compcert-kvx-2f549eaf7f6bc7e97d8f8a830d18808c2ae66186.zip |
read from bit fields
-rw-r--r-- | mppa_k1c/Asmblockgen.v | 14 | ||||
-rw-r--r-- | mppa_k1c/PostpassSchedulingOracle.ml | 12 | ||||
-rw-r--r-- | test/monniaux/bitfields/bitfields.c | 20 |
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)); +} |