aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristophe Lyon <christophe.lyon@st.com>2012-05-09 17:06:10 +0200
committerChristophe Lyon <christophe.lyon@st.com>2012-05-11 15:02:56 +0200
commiteb8034b39a424f157b7117141e23cdad329d5cc0 (patch)
tree80291f26ba85698cb7d86be3bcaa7f6c66101566
parent93e9bc588cd8f38808540ed136260fd7af359efa (diff)
downloadplatform_external_arm-neon-tests-eb8034b39a424f157b7117141e23cdad329d5cc0.tar.gz
platform_external_arm-neon-tests-eb8034b39a424f157b7117141e23cdad329d5cc0.tar.bz2
platform_external_arm-neon-tests-eb8034b39a424f157b7117141e23cdad329d5cc0.zip
Add accessor functions for Neon_Overflow, such that its value can be
read/changed when compiling with GCC/ARM too.
-rw-r--r--README9
-rw-r--r--ref_v_binary_sat_op.c3
-rw-r--r--ref_v_unary_sat_op.c2
-rw-r--r--ref_vqdmlal.c2
-rw-r--r--ref_vqdmlal_lane.c2
-rw-r--r--ref_vqdmlal_n.c2
-rw-r--r--ref_vqdmulh.c2
-rw-r--r--ref_vqdmulh_lane.c2
-rw-r--r--ref_vqdmulh_n.c2
-rw-r--r--ref_vqdmull.c2
-rw-r--r--ref_vqdmull_lane.c2
-rw-r--r--ref_vqdmull_n.c2
-rw-r--r--ref_vqmovn.c2
-rw-r--r--ref_vqmovun.c2
-rw-r--r--ref_vqrdmulh.c2
-rw-r--r--ref_vqrdmulh_lane.c2
-rw-r--r--ref_vqrdmulh_n.c2
-rw-r--r--ref_vqrshl.c2
-rw-r--r--ref_vqrshrn_n.c2
-rw-r--r--ref_vqrshrun_n.c2
-rw-r--r--ref_vqshl.c2
-rw-r--r--ref_vqshl_n.c2
-rw-r--r--ref_vqshlu_n.c2
-rw-r--r--ref_vqshrn_n.c2
-rw-r--r--ref_vqshrun_n.c2
-rw-r--r--stm-arm-neon-ref.h24
26 files changed, 48 insertions, 34 deletions
diff --git a/README b/README
index b926924..bbb0d83 100644
--- a/README
+++ b/README
@@ -23,13 +23,12 @@ $ make check # to compare the results with the expected output
Known issues:
-------------
-The tests currently fail to build with GCC/ARM:
-- no support for Neon_Overflow/fpsrc register
-- ICE when compiling ref_vldX.c, ref_vldX_lane.c, ref_vstX_lane.c
-- fails to compile vst1_lane.c
+Some tests currently fail to build with GCC/ARM:
- missing include files: dspfns.h, armdsp.h
-VS[LR]I.64 tests are disabled because QEmu aborts.
+As GCC/ARM provides no support for the Neon_Overflow/fpsrc register,
+auxiliary accessor functions have been implemented in
+stm-arm-neon-ref.h.
Engineering:
------------
diff --git a/ref_v_binary_sat_op.c b/ref_v_binary_sat_op.c
index cafbcb7..921573e 100644
--- a/ref_v_binary_sat_op.c
+++ b/ref_v_binary_sat_op.c
@@ -39,8 +39,9 @@ THE SOFTWARE.
FNNAME (INSN_NAME)
{
/* vector_res = OP(vector1,vector2), then store the result. */
+
#define TEST_BINARY_SAT_OP1(INSN, Q, T1, T2, W, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_##T2##W(VECT_VAR(vector1, T1, W, N), \
VECT_VAR(vector2, T1, W, N)); \
diff --git a/ref_v_unary_sat_op.c b/ref_v_unary_sat_op.c
index bd110fb..16c65ee 100644
--- a/ref_v_unary_sat_op.c
+++ b/ref_v_unary_sat_op.c
@@ -40,7 +40,7 @@ FNNAME (INSN_NAME)
{
/* Basic test: y=OP(x), then store the result. */
#define TEST_UNARY_SAT_OP1(INSN, Q, T1, T2, W, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N)); \
vst1##Q##_##T2##W(VECT_VAR(result, T1, W, N), \
diff --git a/ref_vqdmlal.c b/ref_vqdmlal.c
index fe6dd57..d2f229d 100644
--- a/ref_vqdmlal.c
+++ b/ref_vqdmlal.c
@@ -45,7 +45,7 @@ FNNAME (INSN_NAME)
/* vector_res = OP(vector, vector3, vector4),
then store the result. */
#define TEST_VQDMLXL1(INSN, T1, T2, W, W2, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##_##T2##W2(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector3, T1, W2, N), \
diff --git a/ref_vqdmlal_lane.c b/ref_vqdmlal_lane.c
index 6f1064c..456473c 100644
--- a/ref_vqdmlal_lane.c
+++ b/ref_vqdmlal_lane.c
@@ -44,7 +44,7 @@ FNNAME (INSN_NAME)
/* vector_res = vqdmlxl_lane(vector, vector3, vector4, lane),
then store the result. */
#define TEST_VQDMLXL_LANE1(INSN, T1, T2, W, W2, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##_##T2##W2(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector3, T1, W2, N), \
diff --git a/ref_vqdmlal_n.c b/ref_vqdmlal_n.c
index 5aba435..3f1a08b 100644
--- a/ref_vqdmlal_n.c
+++ b/ref_vqdmlal_n.c
@@ -44,7 +44,7 @@ FNNAME (INSN_NAME)
/* vector_res = vqdmlxl_n(vector, vector3, val),
then store the result. */
#define TEST_VQDMLXL_N1(INSN, T1, T2, W, W2, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##_##T2##W2(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector3, T1, W2, N), \
diff --git a/ref_vqdmulh.c b/ref_vqdmulh.c
index 688ffba..479b780 100644
--- a/ref_vqdmulh.c
+++ b/ref_vqdmulh.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* vector_res = vqdmulh(vector,vector2,lane), then store the result. */
#define TEST_VQDMULH2(INSN, Q, T1, T2, W, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector2, T1, W, N)); \
diff --git a/ref_vqdmulh_lane.c b/ref_vqdmulh_lane.c
index 8b9f635..60b98af 100644
--- a/ref_vqdmulh_lane.c
+++ b/ref_vqdmulh_lane.c
@@ -40,7 +40,7 @@ FNNAME (INSN)
{
/* vector_res = vqdmulh_lane(vector,vector2,lane), then store the result. */
#define TEST_VQDMULH_LANE2(INSN, Q, T1, T2, W, N, N2, L) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_lane_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector2, T1, W, N2), \
diff --git a/ref_vqdmulh_n.c b/ref_vqdmulh_n.c
index ae9d24e..ca78483 100644
--- a/ref_vqdmulh_n.c
+++ b/ref_vqdmulh_n.c
@@ -42,7 +42,7 @@ FNNAME (INSN)
/* vector_res = vqdmulh_n(vector,val), then store the result. */
#define TEST_VQDMULH_N2(INSN, Q, T1, T2, W, N, L) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_n_##T2##W(VECT_VAR(vector, T1, W, N), \
L); \
diff --git a/ref_vqdmull.c b/ref_vqdmull.c
index 35bf6f7..ba98f9c 100644
--- a/ref_vqdmull.c
+++ b/ref_vqdmull.c
@@ -40,7 +40,7 @@ FNNAME (INSN)
{
/* Basic test: y=vqdmull(x,x), then store the result. */
#define TEST_VQDMULL2(INSN, T1, T2, W, W2, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W2, N) = \
INSN##_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector2, T1, W, N)); \
diff --git a/ref_vqdmull_lane.c b/ref_vqdmull_lane.c
index 504b61b..6d4fb14 100644
--- a/ref_vqdmull_lane.c
+++ b/ref_vqdmull_lane.c
@@ -42,7 +42,7 @@ FNNAME (INSN)
/* vector_res = vqdmull_lane(vector,vector2,lane), then store the result. */
#define TEST_VQDMULL_LANE2(INSN, T1, T2, W, W2, N, L) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W2, N) = \
INSN##_lane_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector2, T1, W, N), \
diff --git a/ref_vqdmull_n.c b/ref_vqdmull_n.c
index 28557f4..a4465e2 100644
--- a/ref_vqdmull_n.c
+++ b/ref_vqdmull_n.c
@@ -42,7 +42,7 @@ FNNAME (INSN)
/* vector_res = vqdmull_n(vector,val), then store the result. */
#define TEST_VQDMULL_N2(INSN, T1, T2, W, W2, N, L) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W2, N) = \
INSN##_n_##T2##W(VECT_VAR(vector, T1, W, N), \
L); \
diff --git a/ref_vqmovn.c b/ref_vqmovn.c
index 9b91fe6..8b523f0 100644
--- a/ref_vqmovn.c
+++ b/ref_vqmovn.c
@@ -41,7 +41,7 @@ FNNAME (INSN_NAME)
{
/* Basic test: y=OP(x), then store the result. */
#define TEST_UNARY_OP1(INSN, T1, T2, W, W2, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##_##T2##W2(VECT_VAR(vector, T1, W2, N)); \
vst1##_##T2##W(VECT_VAR(result, T1, W, N), \
diff --git a/ref_vqmovun.c b/ref_vqmovun.c
index 199cdb4..6b2547c 100644
--- a/ref_vqmovun.c
+++ b/ref_vqmovun.c
@@ -41,7 +41,7 @@ FNNAME (INSN_NAME)
{
/* Basic test: y=OP(x), then store the result. */
#define TEST_UNARY_OP1(INSN, T1, T2, W, W2, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##_s##W2(VECT_VAR(vector, int, W2, N)); \
vst1##_##T2##W(VECT_VAR(result, T1, W, N), \
diff --git a/ref_vqrdmulh.c b/ref_vqrdmulh.c
index 19a7bf3..d62c87b 100644
--- a/ref_vqrdmulh.c
+++ b/ref_vqrdmulh.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* vector_res = vqrdmulh(vector,vector2), then store the result. */
#define TEST_VQRDMULH2(INSN, Q, T1, T2, W, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector2, T1, W, N)); \
diff --git a/ref_vqrdmulh_lane.c b/ref_vqrdmulh_lane.c
index 85ce55b..d5e225f 100644
--- a/ref_vqrdmulh_lane.c
+++ b/ref_vqrdmulh_lane.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* vector_res = vqrdmulh_lane(vector,vector2,lane), then store the result. */
#define TEST_VQRDMULH_LANE2(INSN, Q, T1, T2, W, N, N2, L) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_lane_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector2, T1, W, N2), \
diff --git a/ref_vqrdmulh_n.c b/ref_vqrdmulh_n.c
index ac6255b..4822b21 100644
--- a/ref_vqrdmulh_n.c
+++ b/ref_vqrdmulh_n.c
@@ -43,7 +43,7 @@ FNNAME (INSN)
/* vector_res = vqrdmulh_n(vector,val), then store the result. */
#define TEST_VQRDMULH_N2(INSN, Q, T1, T2, W, N, L) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_n_##T2##W(VECT_VAR(vector, T1, W, N), \
L); \
diff --git a/ref_vqrshl.c b/ref_vqrshl.c
index 975d7aa..c91a31b 100644
--- a/ref_vqrshl.c
+++ b/ref_vqrshl.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: v3=vqrshl(v1,v2), then store the result. */
#define TEST_VQRSHL2(INSN, T3, Q, T1, T2, W, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector_shift, T3, W, N)); \
diff --git a/ref_vqrshrn_n.c b/ref_vqrshrn_n.c
index 0d6a295..21765e5 100644
--- a/ref_vqrshrn_n.c
+++ b/ref_vqrshrn_n.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: y=vqrshrn_n(x,v), then store the result. */
#define TEST_VQRSHRN_N2(INSN, T1, T2, W, W2, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W2, N) = \
INSN##_##T2##W(VECT_VAR(vector, T1, W, N), \
V); \
diff --git a/ref_vqrshrun_n.c b/ref_vqrshrun_n.c
index 785c487..a80b396 100644
--- a/ref_vqrshrun_n.c
+++ b/ref_vqrshrun_n.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: y=vqrshrun_n(x,v), then store the result. */
#define TEST_VQRSHRUN_N2(INSN, T1, T2, W, W2, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, uint, W2, N) = \
INSN##_##T2##W(VECT_VAR(vector, T1, W, N), \
V); \
diff --git a/ref_vqshl.c b/ref_vqshl.c
index d843755..277c2f4 100644
--- a/ref_vqshl.c
+++ b/ref_vqshl.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: v3=vqshl(v1,v2), then store the result. */
#define TEST_VQSHL2(INSN, T3, Q, T1, T2, W, N) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_##T2##W(VECT_VAR(vector, T1, W, N), \
VECT_VAR(vector_shift, T3, W, N)); \
diff --git a/ref_vqshl_n.c b/ref_vqshl_n.c
index 74ec3c6..af25203 100644
--- a/ref_vqshl_n.c
+++ b/ref_vqshl_n.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: v2=vqshl_n(v1,v), then store the result. */
#define TEST_VQSHL_N2(INSN, Q, T1, T2, W, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W, N) = \
INSN##Q##_n_##T2##W(VECT_VAR(vector, T1, W, N), \
V); \
diff --git a/ref_vqshlu_n.c b/ref_vqshlu_n.c
index 5090708..3437e0f 100644
--- a/ref_vqshlu_n.c
+++ b/ref_vqshlu_n.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: v2=vqshlu_n(v1,v), then store the result. */
#define TEST_VQSHLU_N2(INSN, Q, T1, T2, T3, T4, W, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T3, W, N) = \
INSN##Q##_n_##T2##W(VECT_VAR(vector, T1, W, N), \
V); \
diff --git a/ref_vqshrn_n.c b/ref_vqshrn_n.c
index 6b6f047..f464563 100644
--- a/ref_vqshrn_n.c
+++ b/ref_vqshrn_n.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: y=vqshrn_n(x,v), then store the result. */
#define TEST_VQSHRN_N2(INSN, T1, T2, W, W2, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, T1, W2, N) = \
INSN##_##T2##W(VECT_VAR(vector, T1, W, N), \
V); \
diff --git a/ref_vqshrun_n.c b/ref_vqshrun_n.c
index 4dc3bd6..cf9d4a5 100644
--- a/ref_vqshrun_n.c
+++ b/ref_vqshrun_n.c
@@ -41,7 +41,7 @@ FNNAME (INSN)
{
/* Basic test: y=vqshrun_n(x,v), then store the result. */
#define TEST_VQSHRUN_N2(INSN, T1, T2, W, W2, N, V) \
- Neon_Overflow = 0; \
+ Set_Neon_Overflow(0); \
VECT_VAR(vector_res, uint, W2, N) = \
INSN##_##T2##W(VECT_VAR(vector, T1, W, N), \
V); \
diff --git a/stm-arm-neon-ref.h b/stm-arm-neon-ref.h
index e4d17d3..7d09a38 100644
--- a/stm-arm-neon-ref.h
+++ b/stm-arm-neon-ref.h
@@ -238,7 +238,7 @@ static void dump_results_hex (const char *test_name)
typedef union {
struct {
int _xxx:27;
- int QC:1;
+ unsigned int QC:1;
int V:1;
int C:1;
int Z:1;
@@ -255,7 +255,7 @@ typedef union {
int Z:1;
int C:1;
int V:1;
- int QC:1;
+ unsigned int QC:1;
int _dnm:27;
} b;
unsigned int word;
@@ -266,10 +266,24 @@ typedef union {
#ifdef __ARMCC_VERSION
register _ARM_FPSCR _afpscr_for_qc __asm("fpscr");
#define Neon_Overflow _afpscr_for_qc.b.QC
+#define Set_Neon_Overflow(x) {Neon_Overflow = (x);}
#else
-/* Fake declaration because GCC/ARM does not know this register */
- int myerrno;
-#define Neon_Overflow myerrno
+/* GCC/ARM does not know this register */
+#define Neon_Overflow __read_neon_overflow()
+static int __read_neon_overflow() {
+ _ARM_FPSCR _afpscr_for_qc;
+ asm("vmrs %0,fpscr" : "=r" (_afpscr_for_qc));
+ return _afpscr_for_qc.b.QC;
+}
+#define Set_Neon_Overflow(x) __set_neon_overflow((x))
+static void __set_neon_overflow(int x) {
+ _ARM_FPSCR _afpscr_for_qc;
+ asm("vmrs %0,fpscr" : "=r" (_afpscr_for_qc));
+ _afpscr_for_qc.b.QC = x;
+ asm("vmsr fpscr,%0" : : "r" (_afpscr_for_qc));
+ return;
+}
+
#endif
#endif /* STM_ARM_NEON_MODELS */