diff options
author | Christophe Lyon <christophe.lyon@st.com> | 2012-05-09 17:06:10 +0200 |
---|---|---|
committer | Christophe Lyon <christophe.lyon@st.com> | 2012-05-11 15:02:56 +0200 |
commit | eb8034b39a424f157b7117141e23cdad329d5cc0 (patch) | |
tree | 80291f26ba85698cb7d86be3bcaa7f6c66101566 | |
parent | 93e9bc588cd8f38808540ed136260fd7af359efa (diff) | |
download | platform_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-- | README | 9 | ||||
-rw-r--r-- | ref_v_binary_sat_op.c | 3 | ||||
-rw-r--r-- | ref_v_unary_sat_op.c | 2 | ||||
-rw-r--r-- | ref_vqdmlal.c | 2 | ||||
-rw-r--r-- | ref_vqdmlal_lane.c | 2 | ||||
-rw-r--r-- | ref_vqdmlal_n.c | 2 | ||||
-rw-r--r-- | ref_vqdmulh.c | 2 | ||||
-rw-r--r-- | ref_vqdmulh_lane.c | 2 | ||||
-rw-r--r-- | ref_vqdmulh_n.c | 2 | ||||
-rw-r--r-- | ref_vqdmull.c | 2 | ||||
-rw-r--r-- | ref_vqdmull_lane.c | 2 | ||||
-rw-r--r-- | ref_vqdmull_n.c | 2 | ||||
-rw-r--r-- | ref_vqmovn.c | 2 | ||||
-rw-r--r-- | ref_vqmovun.c | 2 | ||||
-rw-r--r-- | ref_vqrdmulh.c | 2 | ||||
-rw-r--r-- | ref_vqrdmulh_lane.c | 2 | ||||
-rw-r--r-- | ref_vqrdmulh_n.c | 2 | ||||
-rw-r--r-- | ref_vqrshl.c | 2 | ||||
-rw-r--r-- | ref_vqrshrn_n.c | 2 | ||||
-rw-r--r-- | ref_vqrshrun_n.c | 2 | ||||
-rw-r--r-- | ref_vqshl.c | 2 | ||||
-rw-r--r-- | ref_vqshl_n.c | 2 | ||||
-rw-r--r-- | ref_vqshlu_n.c | 2 | ||||
-rw-r--r-- | ref_vqshrn_n.c | 2 | ||||
-rw-r--r-- | ref_vqshrun_n.c | 2 | ||||
-rw-r--r-- | stm-arm-neon-ref.h | 24 |
26 files changed, 48 insertions, 34 deletions
@@ -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 */ |