aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mppa_k1c/Asm.v28
-rw-r--r--mppa_k1c/Asmblock.v39
-rw-r--r--mppa_k1c/Asmblockgen.v142
-rw-r--r--mppa_k1c/PostpassSchedulingOracle.ml45
-rw-r--r--mppa_k1c/TargetPrinter.ml29
-rw-r--r--test/mppa/instr/Makefile2
-rw-r--r--test/mppa/instr/addw.c2
-rw-r--r--test/mppa/instr/andd.c2
-rw-r--r--test/mppa/instr/andw.c2
-rw-r--r--test/mppa/instr/branch.c2
-rw-r--r--test/mppa/instr/branchz.c2
-rw-r--r--test/mppa/instr/branchzu.c2
-rw-r--r--test/mppa/instr/call.c2
-rw-r--r--test/mppa/instr/cast_S64_U32.c2
-rw-r--r--test/mppa/instr/cast_U32_S64.c2
-rw-r--r--test/mppa/instr/cb.deqz.c2
-rw-r--r--test/mppa/instr/cb.dgez.c2
-rw-r--r--test/mppa/instr/cb.dgtz.c2
-rw-r--r--test/mppa/instr/cb.dlez.c2
-rw-r--r--test/mppa/instr/cb.dltz.c2
-rw-r--r--test/mppa/instr/cb.dnez.c2
-rw-r--r--test/mppa/instr/cb.wgez.c2
-rw-r--r--test/mppa/instr/cb.wgtz.c2
-rw-r--r--test/mppa/instr/cb.wlez.c2
-rw-r--r--test/mppa/instr/cb.wltz.c2
-rw-r--r--test/mppa/instr/compd.eq.c2
-rw-r--r--test/mppa/instr/compd.geu.c2
-rw-r--r--test/mppa/instr/compd.gt.c2
-rw-r--r--test/mppa/instr/compd.gtu.c2
-rw-r--r--test/mppa/instr/compd.le.c2
-rw-r--r--test/mppa/instr/compd.leu.c2
-rw-r--r--test/mppa/instr/compd.lt.c2
-rw-r--r--test/mppa/instr/compd.ltu.c2
-rw-r--r--test/mppa/instr/compd.ne.c2
-rw-r--r--test/mppa/instr/compw.eq.c2
-rw-r--r--test/mppa/instr/compw.geu.c2
-rw-r--r--test/mppa/instr/compw.gt.c2
-rw-r--r--test/mppa/instr/compw.gtu.c2
-rw-r--r--test/mppa/instr/compw.le.c2
-rw-r--r--test/mppa/instr/compw.leu.c2
-rw-r--r--test/mppa/instr/compw.lt.c2
-rw-r--r--test/mppa/instr/compw.ltu.c2
-rw-r--r--test/mppa/instr/compw.ne.c2
-rw-r--r--test/mppa/instr/div2.c2
-rw-r--r--test/mppa/instr/doubleconv.c2
-rw-r--r--test/mppa/instr/faddd.c5
-rw-r--r--test/mppa/instr/faddw.c5
-rw-r--r--test/mppa/instr/floatconv.c2
-rw-r--r--test/mppa/instr/fmuld.c7
-rw-r--r--test/mppa/instr/fmulw.c7
-rw-r--r--test/mppa/instr/fnegd.c7
-rw-r--r--test/mppa/instr/fnegw.c7
-rw-r--r--test/mppa/instr/for.c2
-rw-r--r--test/mppa/instr/forvarl.c2
-rw-r--r--test/mppa/instr/framework.h30
-rw-r--r--test/mppa/instr/fsbfd.c7
-rw-r--r--test/mppa/instr/fsbfw.c7
-rw-r--r--test/mppa/instr/indirect_call.c2
-rw-r--r--test/mppa/instr/indirect_tailcall.c2
-rw-r--r--test/mppa/instr/lbs.c2
-rw-r--r--test/mppa/instr/lbz.c2
-rw-r--r--test/mppa/instr/muld.c2
-rw-r--r--test/mppa/instr/mulw.c2
-rw-r--r--test/mppa/instr/negd.c2
-rw-r--r--test/mppa/instr/ord.c2
-rw-r--r--test/mppa/instr/sbfd.c2
-rw-r--r--test/mppa/instr/sbfw.c2
-rw-r--r--test/mppa/instr/simple.c2
-rw-r--r--test/mppa/instr/sllw.c2
-rw-r--r--test/mppa/instr/srad.c2
-rw-r--r--test/mppa/instr/srld.c2
-rw-r--r--test/mppa/instr/tailcall.c2
-rw-r--r--test/mppa/instr/udivd.c2
-rw-r--r--test/mppa/instr/umodd.c2
-rw-r--r--test/mppa/instr/xord.c2
75 files changed, 305 insertions, 182 deletions
diff --git a/mppa_k1c/Asm.v b/mppa_k1c/Asm.v
index d7bfaffe..074885f6 100644
--- a/mppa_k1c/Asm.v
+++ b/mppa_k1c/Asm.v
@@ -94,11 +94,17 @@ Inductive instruction : Type :=
| Pmv (rd rs: ireg) (**r register move *)
| Pnegw (rd rs: ireg) (**r negate word *)
| Pnegl (rd rs: ireg) (**r negate long *)
- | Pfnegd (rd rs: ireg) (**r float negate double *)
| Pcvtl2w (rd rs: ireg) (**r Convert Long to Word *)
| Psxwd (rd rs: ireg) (**r Sign Extend Word to Double Word *)
| Pzxwd (rd rs: ireg) (**r Zero Extend Word to Double Word *)
+ | Pfabsd (rd rs: ireg) (**r float absolute double *)
+ | Pfabsw (rd rs: ireg) (**r float absolute word *)
+ | Pfnegd (rd rs: ireg) (**r float negate double *)
+ | Pfnegw (rd rs: ireg) (**r float negate word *)
+ | Pfnarrowdw (rd rs: ireg) (**r float narrow 64 -> 32 bits *)
+ | Pfwidenlwd (rd rs: ireg) (**r float widen 32 -> 64 bits *)
| Pfloatwrnsz (rd rs: ireg) (**r Floating Point Conversion from integer *)
+ | Pfloatudrnsz (rd rs: ireg) (**r Floating Point Conversion from unsigned integer (64 bits) *)
| Pfloatdrnsz (rd rs: ireg) (**r Floating Point Conversion from integer (64 bits) *)
| Pfixedwrzz (rd rs: ireg) (**r Integer conversion from floating point *)
| Pfixeddrzz (rd rs: ireg) (**r Integer conversion from floating point (64 bits) *)
@@ -139,6 +145,13 @@ Inductive instruction : Type :=
| Psrll (rd rs1 rs2: ireg) (**r shift right logical long *)
| Psral (rd rs1 rs2: ireg) (**r shift right arithmetic long *)
+ | Pfaddd (rd rs1 rs2: ireg) (**r Float addition double *)
+ | Pfaddw (rd rs1 rs2: ireg) (**r Float addition word *)
+ | Pfsbfd (rd rs1 rs2: ireg) (**r Float sub double *)
+ | Pfsbfw (rd rs1 rs2: ireg) (**r Float sub word *)
+ | Pfmuld (rd rs1 rs2: ireg) (**r Float mul double *)
+ | Pfmulw (rd rs1 rs2: ireg) (**r Float mul word *)
+
(** Arith RRI32 *)
| Pcompiw (it: itest) (rd rs: ireg) (imm: int) (**r comparison imm word *)
@@ -197,8 +210,14 @@ Definition basic_to_instruction (b: basic) :=
| PArithRR Asmblock.Pcvtl2w rd rs => Pcvtl2w rd rs
| PArithRR Asmblock.Psxwd rd rs => Psxwd rd rs
| PArithRR Asmblock.Pzxwd rd rs => Pzxwd rd rs
+ | PArithRR Asmblock.Pfabsd rd rs => Pfabsd rd rs
+ | PArithRR Asmblock.Pfabsw rd rs => Pfabsw rd rs
| PArithRR Asmblock.Pfnegd rd rs => Pfnegd rd rs
+ | PArithRR Asmblock.Pfnegw rd rs => Pfnegw rd rs
+ | PArithRR Asmblock.Pfnarrowdw rd rs => Pfnarrowdw rd rs
+ | PArithRR Asmblock.Pfwidenlwd rd rs => Pfwidenlwd rd rs
| PArithRR Asmblock.Pfloatwrnsz rd rs => Pfloatwrnsz rd rs
+ | PArithRR Asmblock.Pfloatudrnsz rd rs => Pfloatudrnsz rd rs
| PArithRR Asmblock.Pfloatdrnsz rd rs => Pfloatdrnsz rd rs
| PArithRR Asmblock.Pfixedwrzz rd rs => Pfixedwrzz rd rs
| PArithRR Asmblock.Pfixeddrzz rd rs => Pfixeddrzz rd rs
@@ -238,6 +257,13 @@ Definition basic_to_instruction (b: basic) :=
| PArithRRR Asmblock.Psrll rd rs1 rs2 => Psrll rd rs1 rs2
| PArithRRR Asmblock.Psral rd rs1 rs2 => Psral rd rs1 rs2
+ | PArithRRR Asmblock.Pfaddd rd rs1 rs2 => Pfaddd rd rs1 rs2
+ | PArithRRR Asmblock.Pfaddw rd rs1 rs2 => Pfaddw rd rs1 rs2
+ | PArithRRR Asmblock.Pfsbfd rd rs1 rs2 => Pfsbfd rd rs1 rs2
+ | PArithRRR Asmblock.Pfsbfw rd rs1 rs2 => Pfsbfw rd rs1 rs2
+ | PArithRRR Asmblock.Pfmuld rd rs1 rs2 => Pfmuld rd rs1 rs2
+ | PArithRRR Asmblock.Pfmulw rd rs1 rs2 => Pfmulw rd rs1 rs2
+
(* RRI32 *)
| PArithRRI32 (Asmblock.Pcompiw it) rd rs imm => Pcompiw it rd rs imm
| PArithRRI32 Asmblock.Paddiw rd rs imm => Paddiw rd rs imm
diff --git a/mppa_k1c/Asmblock.v b/mppa_k1c/Asmblock.v
index 3cd300c9..a582e866 100644
--- a/mppa_k1c/Asmblock.v
+++ b/mppa_k1c/Asmblock.v
@@ -279,14 +279,21 @@ Inductive arith_name_rr : Type :=
| Pmv (**r register move *)
| Pnegw (**r negate word *)
| Pnegl (**r negate long *)
- | Pfnegd (**r float negate double *)
| Pcvtl2w (**r Convert Long to Word *)
| Psxwd (**r Sign Extend Word to Double Word *)
| Pzxwd (**r Zero Extend Word to Double Word *)
- | Pfloatwrnsz (**r Floating Point Conversion from integer (single -> int) *)
- | Pfloatdrnsz (**r Floating Point Conversion from integer (float -> long) *)
- | Pfixedwrzz (**r Integer conversion from floating point (int -> single) *)
- | Pfixeddrzz (**r Integer conversion from floating point (long -> float) *)
+
+ | Pfabsd (**r float absolute double *)
+ | Pfabsw (**r float absolute word *)
+ | Pfnegd (**r float negate double *)
+ | Pfnegw (**r float negate word *)
+ | Pfnarrowdw (**r float narrow 64 -> 32 bits *)
+ | Pfwidenlwd (**r Floating Point widen from 32 bits to 64 bits *)
+ | Pfloatwrnsz (**r Floating Point Conversion from integer (int -> single) *)
+ | Pfloatudrnsz (**r Floating Point Conversion from unsigned integer (ulong -> float) *)
+ | Pfloatdrnsz (**r Floating Point Conversion from integer (long -> float) *)
+ | Pfixedwrzz (**r Integer conversion from floating point (single -> int) *)
+ | Pfixeddrzz (**r Integer conversion from floating point (float -> long) *)
.
Inductive arith_name_ri32 : Type :=
@@ -328,6 +335,13 @@ Inductive arith_name_rrr : Type :=
| Pslll (**r shift left logical long *)
| Psrll (**r shift right logical long *)
| Psral (**r shift right arithmetic long *)
+
+ | Pfaddd (**r float add double *)
+ | Pfaddw (**r float add word *)
+ | Pfsbfd (**r float sub double *)
+ | Pfsbfw (**r float sub word *)
+ | Pfmuld (**r float multiply double *)
+ | Pfmulw (**r float multiply word *)
.
Inductive arith_name_rri32 : Type :=
@@ -884,11 +898,17 @@ Definition exec_arith_instr (ai: ar_instruction) (rs: regset) (m: mem) : regset
| Pmv => rs#d <- (rs#s)
| Pnegw => rs#d <- (Val.neg rs#s)
| Pnegl => rs#d <- (Val.negl rs#s)
- | Pfnegd => rs#d <- (Val.negf rs#s)
| Pcvtl2w => rs#d <- (Val.loword rs#s)
| Psxwd => rs#d <- (Val.longofint rs#s)
| Pzxwd => rs#d <- (Val.longofintu rs#s)
+ | Pfnegd => rs#d <- (Val.negf rs#s)
+ | Pfnegw => rs#d <- (Val.negfs rs#s)
+ | Pfabsd => rs#d <- (Val.absf rs#s)
+ | Pfabsw => rs#d <- (Val.absfs rs#s)
+ | Pfnarrowdw => rs#d <- (Val.singleoffloat rs#s)
+ | Pfwidenlwd => rs#d <- (Val.floatofsingle rs#s)
| Pfloatwrnsz => rs#d <- (match Val.singleofint rs#s with Some f => f | _ => Vundef end)
+ | Pfloatudrnsz => rs#d <- (match Val.floatoflongu rs#s with Some f => f | _ => Vundef end)
| Pfloatdrnsz => rs#d <- (match Val.floatoflong rs#s with Some f => f | _ => Vundef end)
| Pfixedwrzz => rs#d <- (match Val.intofsingle rs#s with Some i => i | _ => Vundef end)
| Pfixeddrzz => rs#d <- (match Val.longoffloat rs#s with Some i => i | _ => Vundef end)
@@ -937,6 +957,13 @@ Definition exec_arith_instr (ai: ar_instruction) (rs: regset) (m: mem) : regset
| Pslll => rs#d <- (Val.shll rs#s1 rs#s2)
| Psrll => rs#d <- (Val.shrlu rs#s1 rs#s2)
| Psral => rs#d <- (Val.shrl rs#s1 rs#s2)
+
+ | Pfaddd => rs#d <- (Val.addf rs#s1 rs#s2)
+ | Pfaddw => rs#d <- (Val.addfs rs#s1 rs#s2)
+ | Pfsbfd => rs#d <- (Val.subf rs#s1 rs#s2)
+ | Pfsbfw => rs#d <- (Val.subfs rs#s1 rs#s2)
+ | Pfmuld => rs#d <- (Val.mulf rs#s1 rs#s2)
+ | Pfmulw => rs#d <- (Val.mulfs rs#s1 rs#s2)
end
| PArithRRI32 n d s i =>
diff --git a/mppa_k1c/Asmblockgen.v b/mppa_k1c/Asmblockgen.v
index e7fa8f6c..6503e5b3 100644
--- a/mppa_k1c/Asmblockgen.v
+++ b/mppa_k1c/Asmblockgen.v
@@ -544,21 +544,62 @@ Definition transl_op
Psrlil RTMP RTMP (Int.sub Int64.iwordsize' n) ::i
Paddl RTMP rs RTMP ::i
Psrail rd RTMP n ::i k)
+
+ | Oabsf, a1 :: nil =>
+ do rd <- freg_of res; do rs <- freg_of a1;
+ OK (Pfabsd rd rs ::i k)
+ | Oabsfs, a1 :: nil =>
+ do rd <- freg_of res; do rs <- freg_of a1;
+ OK (Pfabsw rd rs ::i k)
+ | Oaddf, a1 :: a2 :: nil =>
+ do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
+ OK (Pfaddd rd rs1 rs2 ::i k)
+ | Oaddfs, a1 :: a2 :: nil =>
+ do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
+ OK (Pfaddw rd rs1 rs2 ::i k)
+ | Osubf, a1 :: a2 :: nil =>
+ do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
+ OK (Pfsbfd rd rs1 rs2 ::i k)
+ | Osubfs, a1 :: a2 :: nil =>
+ do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
+ OK (Pfsbfw rd rs1 rs2 ::i k)
+ | Omulf, a1 :: a2 :: nil =>
+ do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
+ OK (Pfmuld rd rs1 rs2 ::i k)
+ | Omulfs, a1 :: a2 :: nil =>
+ do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
+ OK (Pfmulw rd rs1 rs2 ::i k)
| Onegf, a1 :: nil =>
do rd <- freg_of res; do rs <- freg_of a1;
OK (Pfnegd rd rs ::i k)
+ | Onegfs, a1 :: nil =>
+ do rd <- freg_of res; do rs <- freg_of a1;
+ OK (Pfnegw rd rs ::i k)
+
| Osingleofint, a1 :: nil =>
do rd <- freg_of res; do rs <- ireg_of a1;
OK (Pfloatwrnsz rd rs ::i k)
| Ofloatoflong, a1 :: nil =>
do rd <- freg_of res; do rs <- ireg_of a1;
OK (Pfloatdrnsz rd rs ::i k)
+ | Ofloatoflongu, a1 :: nil =>
+ do rd <- freg_of res; do rs <- ireg_of a1;
+ OK (Pfloatudrnsz rd rs ::i k)
| Ointofsingle, a1 :: nil =>
do rd <- ireg_of res; do rs <- freg_of a1;
OK (Pfixedwrzz rd rs ::i k)
| Olongoffloat, a1 :: nil =>
do rd <- ireg_of res; do rs <- freg_of a1;
OK (Pfixeddrzz rd rs ::i k)
+
+ | Ofloatofsingle, a1 :: nil =>
+ do rd <- freg_of res; do rs <- freg_of a1;
+ OK (Pfwidenlwd rd rs ::i k)
+ | Osingleoffloat, a1 :: nil =>
+ do rd <- freg_of res; do rs <- freg_of a1;
+ OK (Pfnarrowdw rd rs ::i k)
+
+
| Oabsf , _ => Error (msg "Asmblockgen.transl_op: Oabsf")
| Oaddf , _ => Error (msg "Asmblockgen.transl_op: Oaddf")
| Osubf , _ => Error (msg "Asmblockgen.transl_op: Osubf")
@@ -570,7 +611,6 @@ Definition transl_op
| Osubfs , _ => Error (msg "Asmblockgen.transl_op: Osubfs")
| Omulfs , _ => Error (msg "Asmblockgen.transl_op: Omulfs")
| Odivfs , _ => Error (msg "Asmblockgen.transl_op: Odivfs")
- | Ofloatoflong , _ => Error (msg "Asmblockgen.transl_op: Ofloatoflong")
| Ofloatoflongu , _ => Error (msg "Asmblockgen.transl_op: Ofloatoflongu")
| Osingleoflong , _ => Error (msg "Asmblockgen.transl_op: Osingleoflong")
| Osingleoflongu , _ => Error (msg "Asmblockgen.transl_op: Osingleoflongu")
@@ -580,114 +620,18 @@ Definition transl_op
| Ointuoffloat , _ => Error (msg "Asmblockgen.transl_op: Ointuoffloat")
| Ofloatofint , _ => Error (msg "Asmblockgen.transl_op: Ofloatofint")
| Ofloatofintu , _ => Error (msg "Asmblockgen.transl_op: Ofloatofintu")
- | Ointofsingle , _ => Error (msg "Asmblockgen.transl_op: Ointofsingle")
| Ointuofsingle , _ => Error (msg "Asmblockgen.transl_op: Ointuofsingle")
- | Osingleofint , _ => Error (msg "Asmblockgen.transl_op: Osingleofint")
| Osingleofintu , _ => Error (msg "Asmblockgen.transl_op: Osingleofintu")
- | Olongoffloat , _ => Error (msg "Asmblockgen.transl_op: Olongoffloat")
| Olonguoffloat , _ => Error (msg "Asmblockgen.transl_op: Olonguoffloat")
| Olongofsingle , _ => Error (msg "Asmblockgen.transl_op: Olongofsingle")
| Olonguofsingle , _ => Error (msg "Asmblockgen.transl_op: Olonguofsingle")
-
-(*| Oabsf, a1 :: nil =>
- do rd <- freg_of res; do rs <- freg_of a1;
- OK (Pfabsd rd rs :: k)
- | Oaddf, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfaddd rd rs1 rs2 :: k)
- | Osubf, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfsubd rd rs1 rs2 :: k)
- | Omulf, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfmuld rd rs1 rs2 :: k)
- | Odivf, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfdivd rd rs1 rs2 :: k)
-
- | Onegfs, a1 :: nil =>
- do rd <- freg_of res; do rs <- freg_of a1;
- OK (Pfnegs rd rs :: k)
- | Oabsfs, a1 :: nil =>
- do rd <- freg_of res; do rs <- freg_of a1;
- OK (Pfabss rd rs :: k)
- | Oaddfs, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfadds rd rs1 rs2 :: k)
- | Osubfs, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfsubs rd rs1 rs2 :: k)
- | Omulfs, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfmuls rd rs1 rs2 :: k)
- | Odivfs, a1 :: a2 :: nil =>
- do rd <- freg_of res; do rs1 <- freg_of a1; do rs2 <- freg_of a2;
- OK (Pfdivs rd rs1 rs2 :: k)
-
- | Osingleoffloat, a1 :: nil =>
- do rd <- freg_of res; do rs <- freg_of a1;
- OK (Pfcvtsd rd rs :: k)
- | Ofloatofsingle, a1 :: nil =>
- do rd <- freg_of res; do rs <- freg_of a1;
- OK (Pfcvtds rd rs :: k)
-
- | Ointoffloat, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtwd rd rs :: k)
- | Ointuoffloat, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtwud rd rs :: k)
- | Ofloatofint, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtdw rd rs :: k)
- | Ofloatofintu, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtdwu rd rs :: k)
- | Ointofsingle, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtws rd rs :: k)
- | Ointuofsingle, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtwus rd rs :: k)
- | Osingleofint, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtsw rd rs :: k)
- | Osingleofintu, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtswu rd rs :: k)
-
- | Olongoffloat, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtld rd rs :: k)
- | Olonguoffloat, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtlud rd rs :: k)
- | Ofloatoflong, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtdl rd rs :: k)
- | Ofloatoflongu, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtdlu rd rs :: k)
- | Olongofsingle, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtls rd rs :: k)
- | Olonguofsingle, a1 :: nil =>
- do rd <- ireg_of res; do rs <- freg_of a1;
- OK (Pfcvtlus rd rs :: k)
- | Osingleoflong, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtsl rd rs :: k)
- | Osingleoflongu, a1 :: nil =>
- do rd <- freg_of res; do rs <- ireg_of a1;
- OK (Pfcvtslu rd rs :: k)
-
-*)| Ocmp cmp, _ =>
+ | Ocmp cmp, _ =>
do rd <- ireg_of res;
transl_cond_op cmp rd args k
-
+
| _, _ =>
Error(msg "Asmgenblock.transl_op")
end.
diff --git a/mppa_k1c/PostpassSchedulingOracle.ml b/mppa_k1c/PostpassSchedulingOracle.ml
index f5742cc2..54a27966 100644
--- a/mppa_k1c/PostpassSchedulingOracle.ml
+++ b/mppa_k1c/PostpassSchedulingOracle.ml
@@ -31,10 +31,16 @@ let arith_rr_str = function
| Pmv -> "Pmv"
| Pnegw -> "Pnegw"
| Pnegl -> "Pnegl"
- | Pfnegd -> "Pfnegd"
| Psxwd -> "Psxwd"
| Pzxwd -> "Pzxwd"
+ | Pfabsw -> "Pfabsw"
+ | Pfabsd -> "Pfabsd"
+ | Pfnegw -> "Pfnegw"
+ | Pfnegd -> "Pfnegd"
+ | Pfnarrowdw -> "Pfnarrowdw"
+ | Pfwidenlwd -> "Pfwidenlwd"
| Pfloatwrnsz -> "Pfloatwrnsz"
+ | Pfloatudrnsz -> "Pfloatudrnsz"
| Pfloatdrnsz -> "Pfloatdrnsz"
| Pfixedwrzz -> "Pfixedwrzz"
| Pfixeddrzz -> "Pfixeddrzz"
@@ -60,6 +66,12 @@ let arith_rrr_str = function
| Pslll -> "Pslll"
| Psrll -> "Psrll"
| Psral -> "Psral"
+ | Pfaddd -> "Pfaddd"
+ | Pfaddw -> "Pfaddw"
+ | Pfsbfd -> "Pfsbfd"
+ | Pfsbfw -> "Pfsbfw"
+ | Pfmuld -> "Pfmuld"
+ | Pfmulw -> "Pfmulw"
let arith_rri32_str = function
| Pcompiw it -> "Pcompiw"
@@ -286,6 +298,10 @@ let alu_lite : int array = let resmap = fun r -> match r with
| "ISSUE" -> 1 | "TINY" -> 1 | "LITE" -> 1 | _ -> 0
in Array.of_list (List.map resmap resource_names)
+let alu_full : int array = let resmap = fun r -> match r with
+ | "ISSUE" -> 1 | "TINY" -> 1 | "LITE" -> 1 | "ALU" -> 1 | _ -> 0
+ in Array.of_list (List.map resmap resource_names)
+
let alu_nop : int array = let resmap = fun r -> match r with
| "ISSUE" -> 1 | "NOP" -> 1 | _ -> 0
in Array.of_list (List.map resmap resource_names)
@@ -347,7 +363,9 @@ type real_instruction =
(* BCU *)
| Icall | Call | Cb | Igoto | Goto | Ret | Get | Set
(* FPU *)
- | Fnegd | Floatwz | Floatdz | Fixedwz | Fixeddz
+ | Fabsd | Fabsw | Fnegw | Fnegd
+ | Faddd | Faddw | Fsbfd | Fsbfw | Fmuld | Fmulw
+ | Fnarrowdw | Fwidenlwd | Floatwz | Floatdz | Floatudz | Fixedwz | Fixeddz
let ab_inst_to_real = function
| "Paddw" | "Paddiw" | "Pcvtl2w" -> Addw
@@ -374,8 +392,11 @@ let ab_inst_to_real = function
| "Pnop" | "Pcvtw2l" -> Nop
| "Psxwd" -> Sxwd
| "Pzxwd" -> Zxwd
+ | "Pfnarrowdw" -> Fnarrowdw
+ | "Pfwidenlwd" -> Fwidenlwd
| "Pfloatwrnsz" -> Floatwz
| "Pfloatdrnsz" -> Floatdz
+ | "Pfloatudrnsz" -> Floatudz
| "Pfixedwrzz" -> Fixedwz
| "Pfixeddrzz" -> Fixeddz
@@ -400,7 +421,16 @@ let ab_inst_to_real = function
| "Pret" -> Ret
| "Pset" -> Set
+ | "Pfabsd" -> Fabsd
+ | "Pfabsw" -> Fabsw
+ | "Pfnegw" -> Fnegw
| "Pfnegd" -> Fnegd
+ | "Pfaddd" -> Faddd
+ | "Pfaddw" -> Faddw
+ | "Pfsbfd" -> Fsbfd
+ | "Pfsbfw" -> Fsbfw
+ | "Pfmuld" -> Fmuld
+ | "Pfmulw" -> Fmulw
| s -> failwith @@ sprintf "ab_inst_to_real: unrecognized instruction: %s" s
exception InvalidEncoding
@@ -439,7 +469,7 @@ let rec_to_usage r =
| Nop -> alu_nop
| Sraw | Srlw | Sllw | Srad | Srld | Slld -> (match encoding with None | Some U6 -> alu_tiny | _ -> raise InvalidEncoding)
| Sxwd | Zxwd -> (match encoding with None -> alu_lite | _ -> raise InvalidEncoding)
- | Fixedwz | Floatwz | Fixeddz | Floatdz -> mau
+ | Fixedwz | Floatwz | Fixeddz | Floatdz | Floatudz -> mau
| Lbs | Lbz | Lhs | Lhz | Lws | Ld ->
(match encoding with None | Some U6 | Some S10 -> lsu_data
| Some U27L5 | Some U27L10 -> lsu_data_x
@@ -450,7 +480,9 @@ let rec_to_usage r =
| Some E27U27L10 -> lsu_acc_y)
| Icall | Call | Cb | Igoto | Goto | Ret | Set -> bcu
| Get -> bcu_tiny_tiny_mau_xnop
- | Fnegd -> alu_lite
+ | Fnegd | Fnegw | Fabsd | Fabsw | Fwidenlwd -> alu_lite
+ | Fnarrowdw -> alu_full
+ | Faddd | Faddw | Fsbfd | Fsbfw | Fmuld | Fmulw -> mau
let real_inst_to_latency = function
| Nop -> 0 (* Only goes through ID *)
@@ -458,7 +490,7 @@ let real_inst_to_latency = function
| Addd | Andd | Compd | Ord | Sbfd | Srad | Srld | Slld | Xord | Make
| Sxwd | Zxwd
-> 1
- | Floatwz | Fixedwz | Floatdz | Fixeddz -> 4
+ | Floatwz | Fixedwz | Floatdz | Floatudz | Fixeddz -> 4
| Mulw | Muld -> 2 (* FIXME - WORST CASE. If it's S10 then it's only 1 *)
| Lbs | Lbz | Lhs | Lhz | Lws | Ld
| Sb | Sh | Sw | Sd
@@ -466,7 +498,8 @@ let real_inst_to_latency = function
| Get -> 1
| Set -> 3
| Icall | Call | Cb | Igoto | Goto | Ret -> 42 (* Should not matter since it's the final instruction of the basic block *)
- | Fnegd -> 1
+ | Fnegd | Fnegw | Fabsd | Fabsw | Fwidenlwd | Fnarrowdw -> 1
+ | Faddd | Faddw | Fsbfd | Fsbfw | Fmuld | Fmulw -> 4
let rec_to_info r : inst_info =
let usage = rec_to_usage r
diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml
index 703863b7..da3cf75f 100644
--- a/mppa_k1c/TargetPrinter.ml
+++ b/mppa_k1c/TargetPrinter.ml
@@ -288,14 +288,26 @@ module Target (*: TARGET*) =
fprintf oc " negd %a = %a\n" ireg rd ireg rs
| Pnegw(rd, rs) ->
fprintf oc " negw %a = %a\n" ireg rd ireg rs
- | Pfnegd(rd, rs) ->
- fprintf oc " fnegd %a = %a\n" ireg rs ireg rd
| Psxwd(rd, rs) ->
fprintf oc " sxwd %a = %a\n" ireg rd ireg rs
| Pzxwd(rd, rs) ->
fprintf oc " zxwd %a = %a\n" ireg rd ireg rs
+ | Pfabsd(rd, rs) ->
+ fprintf oc " fabsd %a = %a\n" ireg rd ireg rs
+ | Pfabsw(rd, rs) ->
+ fprintf oc " fabsw %a = %a\n" ireg rd ireg rs
+ | Pfnegd(rd, rs) ->
+ fprintf oc " fnegd %a = %a\n" ireg rs ireg rd
+ | Pfnegw(rd, rs) ->
+ fprintf oc " fnegw %a = %a\n" ireg rs ireg rd
+ | Pfnarrowdw(rd, rs) ->
+ fprintf oc " fnarrowdw %a = %a\n" ireg rs ireg rd
+ | Pfwidenlwd(rd, rs) ->
+ fprintf oc " fwidenlwd %a = %a\n" ireg rs ireg rd
| Pfloatwrnsz(rd, rs) ->
fprintf oc " floatw.rn.s %a = %a, 0\n" ireg rd ireg rs
+ | Pfloatudrnsz(rd, rs) ->
+ fprintf oc " floatud.rn.s %a = %a, 0\n" ireg rd ireg rs
| Pfloatdrnsz(rd, rs) ->
fprintf oc " floatd.rn.s %a = %a, 0\n" ireg rd ireg rs
| Pfixedwrzz(rd, rs) ->
@@ -367,6 +379,19 @@ module Target (*: TARGET*) =
| Psral (rd, rs1, rs2) ->
fprintf oc " srad %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+ | Pfaddd (rd, rs1, rs2) ->
+ fprintf oc " faddd %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+ | Pfaddw (rd, rs1, rs2) ->
+ fprintf oc " faddw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+ | Pfsbfd (rd, rs1, rs2) ->
+ fprintf oc " fsbfd %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+ | Pfsbfw (rd, rs1, rs2) ->
+ fprintf oc " fsbfw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+ | Pfmuld (rd, rs1, rs2) ->
+ fprintf oc " fmuld %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+ | Pfmulw (rd, rs1, rs2) ->
+ fprintf oc " fmulw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2
+
(* Arith RRI32 instructions *)
| Pcompiw (it, rd, rs, imm) ->
fprintf oc " compw.%a %a = %a, %a\n" icond it ireg rd ireg rs coqint64 imm
diff --git a/test/mppa/instr/Makefile b/test/mppa/instr/Makefile
index 66e40365..b4abb6a4 100644
--- a/test/mppa/instr/Makefile
+++ b/test/mppa/instr/Makefile
@@ -2,7 +2,7 @@ K1CC ?= k1-mbr-gcc
CC ?= gcc
CCOMP ?= ccomp
OPTIM ?= -O2
-CFLAGS ?= $(OPTIM) -Wl,--wrap=printf
+CFLAGS ?= $(OPTIM)
SIMU ?= k1-mppa
TIMEOUT ?= --signal=SIGTERM 120s
diff --git a/test/mppa/instr/addw.c b/test/mppa/instr/addw.c
index be8afc67..e22024cf 100644
--- a/test/mppa/instr/addw.c
+++ b/test/mppa/instr/addw.c
@@ -2,4 +2,4 @@
BEGIN_TEST(int)
c = a+b;
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/andd.c b/test/mppa/instr/andd.c
index 5a2c7863..e3221bd7 100644
--- a/test/mppa/instr/andd.c
+++ b/test/mppa/instr/andd.c
@@ -2,4 +2,4 @@
BEGIN_TEST(long long)
c = a&b;
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/andw.c b/test/mppa/instr/andw.c
index 99de0049..799dc7fb 100644
--- a/test/mppa/instr/andw.c
+++ b/test/mppa/instr/andw.c
@@ -2,4 +2,4 @@
BEGIN_TEST(int)
c = a&b;
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/branch.c b/test/mppa/instr/branch.c
index 72e7e20e..c9937e31 100644
--- a/test/mppa/instr/branch.c
+++ b/test/mppa/instr/branch.c
@@ -7,4 +7,4 @@ BEGIN_TEST(int)
else
c = 1;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/branchz.c b/test/mppa/instr/branchz.c
index fb86d357..d3e021b5 100644
--- a/test/mppa/instr/branchz.c
+++ b/test/mppa/instr/branchz.c
@@ -7,4 +7,4 @@ BEGIN_TEST(int)
else
c = 1;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/branchzu.c b/test/mppa/instr/branchzu.c
index 97adb605..d0169174 100644
--- a/test/mppa/instr/branchzu.c
+++ b/test/mppa/instr/branchzu.c
@@ -8,4 +8,4 @@ BEGIN_TEST(int)
else
c = 1;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/call.c b/test/mppa/instr/call.c
index 727cef63..ba2ec323 100644
--- a/test/mppa/instr/call.c
+++ b/test/mppa/instr/call.c
@@ -12,5 +12,5 @@ BEGIN_TEST(int)
{
c = sum(make(a), make(b));
}
-END_TEST()
+END_TEST32()
/* RETURN VALUE: 60 */
diff --git a/test/mppa/instr/cast_S64_U32.c b/test/mppa/instr/cast_S64_U32.c
index da49b2a8..2d9dc723 100644
--- a/test/mppa/instr/cast_S64_U32.c
+++ b/test/mppa/instr/cast_S64_U32.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = (unsigned int) a;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cast_U32_S64.c b/test/mppa/instr/cast_U32_S64.c
index b6bcdf6a..6f9cd059 100644
--- a/test/mppa/instr/cast_U32_S64.c
+++ b/test/mppa/instr/cast_U32_S64.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned int)
{
c = (long long) a;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/cb.deqz.c b/test/mppa/instr/cb.deqz.c
index c56733f0..6da2ab07 100644
--- a/test/mppa/instr/cb.deqz.c
+++ b/test/mppa/instr/cb.deqz.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long)
else
c = 0;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cb.dgez.c b/test/mppa/instr/cb.dgez.c
index abb6ec57..7bef25ad 100644
--- a/test/mppa/instr/cb.dgez.c
+++ b/test/mppa/instr/cb.dgez.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long)
else
c = 0;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cb.dgtz.c b/test/mppa/instr/cb.dgtz.c
index d4271845..1a43fb1f 100644
--- a/test/mppa/instr/cb.dgtz.c
+++ b/test/mppa/instr/cb.dgtz.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long)
else
c = 0;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cb.dlez.c b/test/mppa/instr/cb.dlez.c
index 18e67f06..2fb97939 100644
--- a/test/mppa/instr/cb.dlez.c
+++ b/test/mppa/instr/cb.dlez.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long)
else
c = 0;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cb.dltz.c b/test/mppa/instr/cb.dltz.c
index 366aea49..a431d5d0 100644
--- a/test/mppa/instr/cb.dltz.c
+++ b/test/mppa/instr/cb.dltz.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long)
else
c = 0;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cb.dnez.c b/test/mppa/instr/cb.dnez.c
index 81c2cd29..44516cbe 100644
--- a/test/mppa/instr/cb.dnez.c
+++ b/test/mppa/instr/cb.dnez.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long)
else
c = 0;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/cb.wgez.c b/test/mppa/instr/cb.wgez.c
index 477f4bc6..5779ad92 100644
--- a/test/mppa/instr/cb.wgez.c
+++ b/test/mppa/instr/cb.wgez.c
@@ -7,4 +7,4 @@ BEGIN_TEST(int)
else
c = 0;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/cb.wgtz.c b/test/mppa/instr/cb.wgtz.c
index c9ab9a06..abb695bd 100644
--- a/test/mppa/instr/cb.wgtz.c
+++ b/test/mppa/instr/cb.wgtz.c
@@ -7,4 +7,4 @@ BEGIN_TEST(int)
else
c = 0;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/cb.wlez.c b/test/mppa/instr/cb.wlez.c
index c3069fda..3a2e08c1 100644
--- a/test/mppa/instr/cb.wlez.c
+++ b/test/mppa/instr/cb.wlez.c
@@ -7,4 +7,4 @@ BEGIN_TEST(int)
else
c = 0;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/cb.wltz.c b/test/mppa/instr/cb.wltz.c
index 6cf5fcf0..5d52c72a 100644
--- a/test/mppa/instr/cb.wltz.c
+++ b/test/mppa/instr/cb.wltz.c
@@ -7,4 +7,4 @@ BEGIN_TEST(int)
else
c = 0;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compd.eq.c b/test/mppa/instr/compd.eq.c
index d19a4d20..4fe8de2a 100644
--- a/test/mppa/instr/compd.eq.c
+++ b/test/mppa/instr/compd.eq.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = ((a & 0x1LL) == (b & 0x1LL));
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.geu.c b/test/mppa/instr/compd.geu.c
index edc31183..fccf0804 100644
--- a/test/mppa/instr/compd.geu.c
+++ b/test/mppa/instr/compd.geu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = (a >= b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.gt.c b/test/mppa/instr/compd.gt.c
index 24147779..b9901436 100644
--- a/test/mppa/instr/compd.gt.c
+++ b/test/mppa/instr/compd.gt.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = (a > b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.gtu.c b/test/mppa/instr/compd.gtu.c
index 5ce82569..7b2b96a6 100644
--- a/test/mppa/instr/compd.gtu.c
+++ b/test/mppa/instr/compd.gtu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = (a > b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.le.c b/test/mppa/instr/compd.le.c
index a84aad97..6fa0f103 100644
--- a/test/mppa/instr/compd.le.c
+++ b/test/mppa/instr/compd.le.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = (a <= b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.leu.c b/test/mppa/instr/compd.leu.c
index e386bc27..1ad18281 100644
--- a/test/mppa/instr/compd.leu.c
+++ b/test/mppa/instr/compd.leu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = (a <= b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.lt.c b/test/mppa/instr/compd.lt.c
index df07a708..c42cda56 100644
--- a/test/mppa/instr/compd.lt.c
+++ b/test/mppa/instr/compd.lt.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = (a < b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.ltu.c b/test/mppa/instr/compd.ltu.c
index dfaa8921..b03d4d53 100644
--- a/test/mppa/instr/compd.ltu.c
+++ b/test/mppa/instr/compd.ltu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = (a < b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compd.ne.c b/test/mppa/instr/compd.ne.c
index 19ce0a69..fd9d0b28 100644
--- a/test/mppa/instr/compd.ne.c
+++ b/test/mppa/instr/compd.ne.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = ((a & 0x1ULL) != (b & 0x1ULL));
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/compw.eq.c b/test/mppa/instr/compw.eq.c
index dc7a3ab1..cd93f365 100644
--- a/test/mppa/instr/compw.eq.c
+++ b/test/mppa/instr/compw.eq.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = ((a & 0x1) == (b & 0x1));
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.geu.c b/test/mppa/instr/compw.geu.c
index d72ca56c..b8fb1adf 100644
--- a/test/mppa/instr/compw.geu.c
+++ b/test/mppa/instr/compw.geu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned int)
{
c = (a >= b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.gt.c b/test/mppa/instr/compw.gt.c
index 9ad02610..5f6bc907 100644
--- a/test/mppa/instr/compw.gt.c
+++ b/test/mppa/instr/compw.gt.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = (a > b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.gtu.c b/test/mppa/instr/compw.gtu.c
index 77f04989..947f6a14 100644
--- a/test/mppa/instr/compw.gtu.c
+++ b/test/mppa/instr/compw.gtu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned int)
{
c = (a > b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.le.c b/test/mppa/instr/compw.le.c
index b7a7a432..35ec6b7d 100644
--- a/test/mppa/instr/compw.le.c
+++ b/test/mppa/instr/compw.le.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = (a <= b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.leu.c b/test/mppa/instr/compw.leu.c
index 4892f06c..74ebfb42 100644
--- a/test/mppa/instr/compw.leu.c
+++ b/test/mppa/instr/compw.leu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned int)
{
c = (a <= b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.lt.c b/test/mppa/instr/compw.lt.c
index 2cc151bf..cb1f30bd 100644
--- a/test/mppa/instr/compw.lt.c
+++ b/test/mppa/instr/compw.lt.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = (a < b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.ltu.c b/test/mppa/instr/compw.ltu.c
index b524127f..6a0c5af1 100644
--- a/test/mppa/instr/compw.ltu.c
+++ b/test/mppa/instr/compw.ltu.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned int)
{
c = (a < b);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/compw.ne.c b/test/mppa/instr/compw.ne.c
index 433b0b86..7035e2c7 100644
--- a/test/mppa/instr/compw.ne.c
+++ b/test/mppa/instr/compw.ne.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned int)
{
c = ((a & 0x1U) != (b & 0x1U));
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/div2.c b/test/mppa/instr/div2.c
index 01a4b575..b5dfe63a 100644
--- a/test/mppa/instr/div2.c
+++ b/test/mppa/instr/div2.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = (a + b) / 2;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/doubleconv.c b/test/mppa/instr/doubleconv.c
index e40c65e5..55b1ddab 100644
--- a/test/mppa/instr/doubleconv.c
+++ b/test/mppa/instr/doubleconv.c
@@ -6,4 +6,4 @@ double long2double(long v){
BEGIN_TEST(long)
c = (long) long2double(a) + (long) long2double(b) + (long) long2double(42.3);
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/faddd.c b/test/mppa/instr/faddd.c
new file mode 100644
index 00000000..35b7fc92
--- /dev/null
+++ b/test/mppa/instr/faddd.c
@@ -0,0 +1,5 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+ c = ((double)a + (double)b);
+END_TESTF64()
diff --git a/test/mppa/instr/faddw.c b/test/mppa/instr/faddw.c
new file mode 100644
index 00000000..a00e9afe
--- /dev/null
+++ b/test/mppa/instr/faddw.c
@@ -0,0 +1,5 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+ c = ((float)a + (float)b);
+END_TESTF64()
diff --git a/test/mppa/instr/floatconv.c b/test/mppa/instr/floatconv.c
index 025f968b..32b798e1 100644
--- a/test/mppa/instr/floatconv.c
+++ b/test/mppa/instr/floatconv.c
@@ -6,4 +6,4 @@ float int2float(int v){
BEGIN_TEST(int)
c = (int) int2float(a) + (int) int2float(b) + (int) int2float(42.3);
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/fmuld.c b/test/mppa/instr/fmuld.c
new file mode 100644
index 00000000..03c990fa
--- /dev/null
+++ b/test/mppa/instr/fmuld.c
@@ -0,0 +1,7 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+{
+ c = ((double)a * (double)b);
+}
+END_TESTF64()
diff --git a/test/mppa/instr/fmulw.c b/test/mppa/instr/fmulw.c
new file mode 100644
index 00000000..030a6d9c
--- /dev/null
+++ b/test/mppa/instr/fmulw.c
@@ -0,0 +1,7 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+{
+ c = ((float)a * (float)b);
+}
+END_TESTF64()
diff --git a/test/mppa/instr/fnegd.c b/test/mppa/instr/fnegd.c
new file mode 100644
index 00000000..974eb7e8
--- /dev/null
+++ b/test/mppa/instr/fnegd.c
@@ -0,0 +1,7 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+{
+ c = (-(double)a);
+}
+END_TESTF64()
diff --git a/test/mppa/instr/fnegw.c b/test/mppa/instr/fnegw.c
new file mode 100644
index 00000000..acbabf68
--- /dev/null
+++ b/test/mppa/instr/fnegw.c
@@ -0,0 +1,7 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+{
+ c = (-(float)a);
+}
+END_TESTF64()
diff --git a/test/mppa/instr/for.c b/test/mppa/instr/for.c
index d6870afb..373ab6bd 100644
--- a/test/mppa/instr/for.c
+++ b/test/mppa/instr/for.c
@@ -6,4 +6,4 @@ BEGIN_TEST(int)
for (j = 0 ; j < 10 ; j++)
c += a;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/forvarl.c b/test/mppa/instr/forvarl.c
index 30717a51..c1fe90fd 100644
--- a/test/mppa/instr/forvarl.c
+++ b/test/mppa/instr/forvarl.c
@@ -7,4 +7,4 @@ BEGIN_TEST(long long int)
for (j = 0 ; j < (b & 0x8LL) ; j++)
c += a;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/framework.h b/test/mppa/instr/framework.h
index d1c652bd..d4f36f6b 100644
--- a/test/mppa/instr/framework.h
+++ b/test/mppa/instr/framework.h
@@ -1,10 +1,9 @@
#ifndef __FRAMEWORK_H__
#define __FRAMEWORK_H__
+#include <stdio.h>
#include "../prng/prng.c"
-int printf(const char *, ...);
-
#define BEGIN_TEST_N(type, N)\
int main(void){\
type t[N], c, i, j, S;\
@@ -18,7 +17,8 @@ int printf(const char *, ...);
#define BEGIN_TEST(type)\
int main(void){\
- type a, b, c, i, S;\
+ type a, b, c, S;\
+ int i;\
srand(0);\
S = 0;\
for (i = 0 ; i < 100 ; i++){\
@@ -29,22 +29,38 @@ int printf(const char *, ...);
/* In between BEGIN_TEST and END_TEST : definition of c */
-#define END_TEST()\
- printf("%llu\n", c);\
+#define END_TEST64()\
+ printf("%llu\t%llu\t%llu\n", a, b, c);\
S += c;\
}\
return S;\
}
- /* END END_TEST */
+ /* END END_TEST64 */
#define END_TEST32()\
- printf("%u\n", c);\
+ printf("%u\t%u\t%u\n", a, b, c);\
S += c;\
}\
return S;\
}
/* END END_TEST32 */
+#define END_TESTF32()\
+ printf("%f\t%f\t%f\n", a, b, c);\
+ S += c;\
+ }\
+ return 0;\
+ }
+ /* END END_TESTF32 */
+
+#define END_TESTF64()\
+ printf("%lf\t%lf\t%lf\n", a, b, c);\
+ S += c;\
+ }\
+ return 0;\
+ }
+ /* END END_TESTF64 */
+
#endif
diff --git a/test/mppa/instr/fsbfd.c b/test/mppa/instr/fsbfd.c
new file mode 100644
index 00000000..f80c1efe
--- /dev/null
+++ b/test/mppa/instr/fsbfd.c
@@ -0,0 +1,7 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+{
+ c = ((double)a - (double)b);
+}
+END_TESTF64()
diff --git a/test/mppa/instr/fsbfw.c b/test/mppa/instr/fsbfw.c
new file mode 100644
index 00000000..835963d5
--- /dev/null
+++ b/test/mppa/instr/fsbfw.c
@@ -0,0 +1,7 @@
+#include "framework.h"
+
+BEGIN_TEST(double)
+{
+ c = ((float)a - (float)b);
+}
+END_TESTF64()
diff --git a/test/mppa/instr/indirect_call.c b/test/mppa/instr/indirect_call.c
index 3a45ce52..f376c00a 100644
--- a/test/mppa/instr/indirect_call.c
+++ b/test/mppa/instr/indirect_call.c
@@ -30,4 +30,4 @@ BEGIN_TEST(long long)
c += op(make(a), make(b));
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/indirect_tailcall.c b/test/mppa/instr/indirect_tailcall.c
index 69295117..e6c16ea1 100644
--- a/test/mppa/instr/indirect_tailcall.c
+++ b/test/mppa/instr/indirect_tailcall.c
@@ -30,4 +30,4 @@ BEGIN_TEST(long long)
{
c += random_op(a, b);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/lbs.c b/test/mppa/instr/lbs.c
index f104d62b..22a50632 100644
--- a/test/mppa/instr/lbs.c
+++ b/test/mppa/instr/lbs.c
@@ -6,4 +6,4 @@ BEGIN_TEST(int)
c = s[(a & (sizeof(s)-1))];
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/lbz.c b/test/mppa/instr/lbz.c
index 2deeaebe..04ba098d 100644
--- a/test/mppa/instr/lbz.c
+++ b/test/mppa/instr/lbz.c
@@ -6,4 +6,4 @@ BEGIN_TEST(int)
c = s[a & (sizeof(s) - 1)];
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/muld.c b/test/mppa/instr/muld.c
index 9a40f389..f7e23850 100644
--- a/test/mppa/instr/muld.c
+++ b/test/mppa/instr/muld.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = a*b;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/mulw.c b/test/mppa/instr/mulw.c
index bf517ce8..a91d966e 100644
--- a/test/mppa/instr/mulw.c
+++ b/test/mppa/instr/mulw.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = a * b;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/negd.c b/test/mppa/instr/negd.c
index a8e8ff45..837b9828 100644
--- a/test/mppa/instr/negd.c
+++ b/test/mppa/instr/negd.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = -a;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/ord.c b/test/mppa/instr/ord.c
index eaedcb28..cae1ae8b 100644
--- a/test/mppa/instr/ord.c
+++ b/test/mppa/instr/ord.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = a | b;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/sbfd.c b/test/mppa/instr/sbfd.c
index 912f1fdb..77c28c77 100644
--- a/test/mppa/instr/sbfd.c
+++ b/test/mppa/instr/sbfd.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = a-b;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/sbfw.c b/test/mppa/instr/sbfw.c
index feffd497..e38a1fff 100644
--- a/test/mppa/instr/sbfw.c
+++ b/test/mppa/instr/sbfw.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = a-b;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/simple.c b/test/mppa/instr/simple.c
index 89bba27e..944f09c9 100644
--- a/test/mppa/instr/simple.c
+++ b/test/mppa/instr/simple.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = a+b;
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/sllw.c b/test/mppa/instr/sllw.c
index df55c9e8..6dd41a6c 100644
--- a/test/mppa/instr/sllw.c
+++ b/test/mppa/instr/sllw.c
@@ -4,4 +4,4 @@ BEGIN_TEST(int)
{
c = a << (b & 0x8);
}
-END_TEST()
+END_TEST32()
diff --git a/test/mppa/instr/srad.c b/test/mppa/instr/srad.c
index b4047bc7..00be9d0c 100644
--- a/test/mppa/instr/srad.c
+++ b/test/mppa/instr/srad.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = a >> (b & 0x8LL);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/srld.c b/test/mppa/instr/srld.c
index 71e82b2a..14970efd 100644
--- a/test/mppa/instr/srld.c
+++ b/test/mppa/instr/srld.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = a >> (b & 0x8ULL);
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/tailcall.c b/test/mppa/instr/tailcall.c
index 0d15d9e0..6c659a01 100644
--- a/test/mppa/instr/tailcall.c
+++ b/test/mppa/instr/tailcall.c
@@ -12,5 +12,5 @@ BEGIN_TEST(int)
{
c = sum(a, b);
}
-END_TEST()
+END_TEST32()
/* RETURN VALUE: 60 */
diff --git a/test/mppa/instr/udivd.c b/test/mppa/instr/udivd.c
index 52e0d412..cfb31881 100644
--- a/test/mppa/instr/udivd.c
+++ b/test/mppa/instr/udivd.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = a/b;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/umodd.c b/test/mppa/instr/umodd.c
index e7dd506f..a7f25f1c 100644
--- a/test/mppa/instr/umodd.c
+++ b/test/mppa/instr/umodd.c
@@ -4,4 +4,4 @@ BEGIN_TEST(unsigned long long)
{
c = a%b;
}
-END_TEST()
+END_TEST64()
diff --git a/test/mppa/instr/xord.c b/test/mppa/instr/xord.c
index b9d86f06..b6a90cb0 100644
--- a/test/mppa/instr/xord.c
+++ b/test/mppa/instr/xord.c
@@ -4,4 +4,4 @@ BEGIN_TEST(long long)
{
c = a^b;
}
-END_TEST()
+END_TEST64()