1 | Finish the conversion of all aarch64 instructions to decodetree. | 1 | Finish the conversion of all aarch64 instructions to decodetree. |
---|---|---|---|
2 | |||
3 | Changes for v2: | ||
4 | - Apply review nits as appropriate. | ||
5 | - Split out gen_gvec_fabs, gen_gvec_fneg and share with a32 neon. | ||
6 | |||
7 | Patches lacking review: | ||
8 | 23-target-arm-Fix-decode-of-fp16-vector-fabs-fneg.patch | ||
9 | 24-target-arm-Convert-FMOV-FABS-FNEG-scalar-to-decod.patch | ||
10 | 29-target-arm-Convert-BFCVT-to-decodetree.patch | ||
11 | 43-target-arm-Convert-handle_rev-to-decodetree.patch | ||
12 | 53-target-arm-Implement-gen_gvec_fabs-gen_gvec_fneg.patch | ||
13 | 57-target-arm-Convert-FCVT-vector-integer-scalar-to-.patch | ||
14 | 58-target-arm-Convert-FCVT-vector-fixed-point-scalar.patch | ||
15 | 60-target-arm-Convert-US-CVTF-vector-fixed-point-sca.patch | ||
16 | 62-target-arm-Convert-US-CVTF-vector-to-decodetree.patch | ||
17 | 63-target-arm-Convert-FCVTZ-SU-vector-fixed-point-to.patch | ||
18 | 64-target-arm-Convert-FCVT-vector-integer-to-decodet.patch | ||
19 | 67-target-arm-Introduce-gen_gvec_urecpe-gen_gvec_urs.patch | ||
20 | 68-target-arm-Convert-URECPE-and-URSQRTE-to-decodetr.patch | ||
21 | |||
2 | 22 | ||
3 | r~ | 23 | r~ |
4 | 24 | ||
5 | Richard Henderson (67): | 25 | |
6 | target/arm: Use ### to separate 3rd-level sections in a64.decode | 26 | Richard Henderson (69): |
27 | target/arm: Add section labels for "Data Processing (register)" | ||
7 | target/arm: Convert UDIV, SDIV to decodetree | 28 | target/arm: Convert UDIV, SDIV to decodetree |
8 | target/arm: Convert LSLV, LSRV, ASRV, RORV to decodetree | 29 | target/arm: Convert LSLV, LSRV, ASRV, RORV to decodetree |
9 | target/arm: Convert CRC32, CRC32C to decodetree | 30 | target/arm: Convert CRC32, CRC32C to decodetree |
10 | target/arm: Convert SUBP, IRG, GMI to decodetree | 31 | target/arm: Convert SUBP, IRG, GMI to decodetree |
11 | target/arm: Convert PACGA to decodetree | 32 | target/arm: Convert PACGA to decodetree |
... | ... | ||
23 | target/arm: Convert CCMP, CCMN to decodetree | 44 | target/arm: Convert CCMP, CCMN to decodetree |
24 | target/arm: Convert disas_cond_select to decodetree | 45 | target/arm: Convert disas_cond_select to decodetree |
25 | target/arm: Introduce fp_access_check_scalar_hsd | 46 | target/arm: Introduce fp_access_check_scalar_hsd |
26 | target/arm: Introduce fp_access_check_vector_hsd | 47 | target/arm: Introduce fp_access_check_vector_hsd |
27 | target/arm: Convert FCMP, FCMPE, FCCMP, FCCMPE to decodetree | 48 | target/arm: Convert FCMP, FCMPE, FCCMP, FCCMPE to decodetree |
49 | target/arm: Fix decode of fp16 vector fabs, fneg | ||
28 | target/arm: Convert FMOV, FABS, FNEG (scalar) to decodetree | 50 | target/arm: Convert FMOV, FABS, FNEG (scalar) to decodetree |
29 | target/arm: Pass fpstatus to vfp_sqrt* | 51 | target/arm: Pass fpstatus to vfp_sqrt* |
30 | target/arm: Remove helper_sqrt_f16 | 52 | target/arm: Remove helper_sqrt_f16 |
31 | target/arm: Convert FSQRT (scalar) to decodetree | 53 | target/arm: Convert FSQRT (scalar) to decodetree |
32 | target/arm: Convert FRINT[NPMSAXI] (scalar) to decodetree | 54 | target/arm: Convert FRINT[NPMSAXI] (scalar) to decodetree |
... | ... | ||
52 | target/arm: Introduce clear_vec | 74 | target/arm: Introduce clear_vec |
53 | target/arm: Convert XTN, SQXTUN, SQXTN, UQXTN to decodetree | 75 | target/arm: Convert XTN, SQXTUN, SQXTN, UQXTN to decodetree |
54 | target/arm: Convert FCVTN, BFCVTN to decodetree | 76 | target/arm: Convert FCVTN, BFCVTN to decodetree |
55 | target/arm: Convert FCVTXN to decodetree | 77 | target/arm: Convert FCVTXN to decodetree |
56 | target/arm: Convert SHLL to decodetree | 78 | target/arm: Convert SHLL to decodetree |
79 | target/arm: Implement gen_gvec_fabs, gen_gvec_fneg | ||
57 | target/arm: Convert FABS, FNEG (vector) to decodetree | 80 | target/arm: Convert FABS, FNEG (vector) to decodetree |
58 | target/arm: Convert FSQRT (vector) to decodetree | 81 | target/arm: Convert FSQRT (vector) to decodetree |
59 | target/arm: Convert FRINT* (vector) to decodetree | 82 | target/arm: Convert FRINT* (vector) to decodetree |
60 | target/arm: Convert FCVT* (vector, integer) scalar to decodetree | 83 | target/arm: Convert FCVT* (vector, integer) scalar to decodetree |
61 | target/arm: Convert FCVT* (vector, fixed-point) scalar to decodetree | 84 | target/arm: Convert FCVT* (vector, fixed-point) scalar to decodetree |
... | ... | ||
72 | target/arm: Convert URECPE and URSQRTE to decodetree | 95 | target/arm: Convert URECPE and URSQRTE to decodetree |
73 | target/arm: Convert FCVTL to decodetree | 96 | target/arm: Convert FCVTL to decodetree |
74 | 97 | ||
75 | target/arm/helper.h | 43 +- | 98 | target/arm/helper.h | 43 +- |
76 | target/arm/tcg/helper-a64.h | 7 - | 99 | target/arm/tcg/helper-a64.h | 7 - |
77 | target/arm/tcg/translate.h | 29 + | 100 | target/arm/tcg/translate.h | 35 + |
78 | target/arm/tcg/gengvec.c | 355 ++ | 101 | target/arm/tcg/gengvec.c | 369 ++ |
79 | target/arm/tcg/helper-a64.c | 104 - | 102 | target/arm/tcg/helper-a64.c | 104 - |
80 | target/arm/tcg/neon_helper.c | 106 +- | 103 | target/arm/tcg/neon_helper.c | 106 +- |
81 | target/arm/tcg/translate-a64.c | 5674 ++++++++++--------------------- | 104 | target/arm/tcg/translate-a64.c | 5670 ++++++++++--------------------- |
82 | target/arm/tcg/translate-neon.c | 317 +- | 105 | target/arm/tcg/translate-neon.c | 337 +- |
83 | target/arm/tcg/translate-vfp.c | 6 +- | 106 | target/arm/tcg/translate-vfp.c | 6 +- |
84 | target/arm/tcg/vec_helper.c | 65 +- | 107 | target/arm/tcg/vec_helper.c | 65 +- |
85 | target/arm/vfp_helper.c | 16 +- | 108 | target/arm/vfp_helper.c | 16 +- |
86 | target/arm/tcg/a64.decode | 502 ++- | 109 | target/arm/tcg/a64.decode | 502 ++- |
87 | 12 files changed, 2874 insertions(+), 4350 deletions(-) | 110 | 12 files changed, 2888 insertions(+), 4372 deletions(-) |
88 | 111 | ||
89 | -- | 112 | -- |
90 | 2.43.0 | 113 | 2.43.0 | diff view generated by jsdifflib |
1 | At the same time, use ### to separate 3rd-level sections. | ||
---|---|---|---|
1 | We already use ### for 4.1.92 Data Processing (immediate), | 2 | We already use ### for 4.1.92 Data Processing (immediate), |
2 | but not the two following two third-level sections: | 3 | but not the two following two third-level sections: |
3 | 4.1.93 Branches, and 4.1.94 Loads and stores. | 4 | 4.1.93 Branches, and 4.1.94 Loads and stores. |
4 | 5 | ||
6 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 8 | --- |
7 | target/arm/tcg/a64.decode | 4 ++-- | 9 | target/arm/tcg/a64.decode | 19 +++++++++++++++++-- |
8 | 1 file changed, 2 insertions(+), 2 deletions(-) | 10 | 1 file changed, 17 insertions(+), 2 deletions(-) |
9 | 11 | ||
10 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 12 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
11 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/arm/tcg/a64.decode | 14 | --- a/target/arm/tcg/a64.decode |
13 | +++ b/target/arm/tcg/a64.decode | 15 | +++ b/target/arm/tcg/a64.decode |
... | ... | ||
27 | -# Loads and stores | 29 | -# Loads and stores |
28 | +### Loads and stores | 30 | +### Loads and stores |
29 | 31 | ||
30 | &stxr rn rt rt2 rs sz lasr | 32 | &stxr rn rt rt2 rs sz lasr |
31 | &stlr rn rt sz lasr | 33 | &stlr rn rt sz lasr |
34 | @@ -XXX,XX +XXX,XX @@ CPYP 00 011 1 01000 ..... .... 01 ..... ..... @cpy | ||
35 | CPYM 00 011 1 01010 ..... .... 01 ..... ..... @cpy | ||
36 | CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy | ||
37 | |||
38 | +### Data Processing (register) | ||
39 | + | ||
40 | +# Data Processing (2-source) | ||
41 | +# Data Processing (1-source) | ||
42 | +# Logical (shifted reg) | ||
43 | +# Add/subtract (shifted reg) | ||
44 | +# Add/subtract (extended reg) | ||
45 | +# Add/subtract (carry) | ||
46 | +# Rotate right into flags | ||
47 | +# Evaluate into flags | ||
48 | +# Conditional compare (regster) | ||
49 | +# Conditional compare (immediate) | ||
50 | +# Conditional select | ||
51 | +# Data Processing (3-source) | ||
52 | + | ||
53 | ### Cryptographic AES | ||
54 | |||
55 | AESE 01001110 00 10100 00100 10 ..... ..... @r2r_q1e0 | ||
32 | -- | 56 | -- |
33 | 2.43.0 | 57 | 2.43.0 |
58 | |||
59 | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 64 +++++++++++++++++----------------- | 4 | target/arm/tcg/translate-a64.c | 64 +++++++++++++++++----------------- |
4 | target/arm/tcg/a64.decode | 22 ++++++++++++ | 5 | target/arm/tcg/a64.decode | 7 ++++ |
5 | 2 files changed, 54 insertions(+), 32 deletions(-) | 6 | 2 files changed, 39 insertions(+), 32 deletions(-) |
6 | 7 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 8 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 10 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 11 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
110 | &rri_sf rd rn imm sf | 111 | &rri_sf rd rn imm sf |
111 | +&rrr_sf rd rn rm sf | 112 | +&rrr_sf rd rn rm sf |
112 | &i imm | 113 | &i imm |
113 | &rr_e rd rn esz | 114 | &rr_e rd rn esz |
114 | &rri_e rd rn imm esz | 115 | &rri_e rd rn imm esz |
115 | @@ -XXX,XX +XXX,XX @@ CPYP 00 011 1 01000 ..... .... 01 ..... ..... @cpy | 116 | @@ -XXX,XX +XXX,XX @@ CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy |
116 | CPYM 00 011 1 01010 ..... .... 01 ..... ..... @cpy | 117 | ### Data Processing (register) |
117 | CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy | 118 | |
118 | 119 | # Data Processing (2-source) | |
119 | +### Data Processing (register) | ||
120 | + | ||
121 | +# Data Processing (2-source) | ||
122 | + | 120 | + |
123 | +@rrr_sf sf:1 .......... rm:5 ...... rn:5 rd:5 &rrr_sf | 121 | +@rrr_sf sf:1 .......... rm:5 ...... rn:5 rd:5 &rrr_sf |
124 | + | 122 | + |
125 | +UDIV . 00 11010110 ..... 00001 0 ..... ..... @rrr_sf | 123 | +UDIV . 00 11010110 ..... 00001 0 ..... ..... @rrr_sf |
126 | +SDIV . 00 11010110 ..... 00001 1 ..... ..... @rrr_sf | 124 | +SDIV . 00 11010110 ..... 00001 1 ..... ..... @rrr_sf |
127 | + | 125 | + |
128 | +# Data Processing (1-source) | 126 | # Data Processing (1-source) |
129 | +# Logical (shifted reg) | 127 | # Logical (shifted reg) |
130 | +# Add/subtract (shifted reg) | 128 | # Add/subtract (shifted reg) |
131 | +# Add/subtract (extended reg) | ||
132 | +# Add/subtract (carry) | ||
133 | +# Rotate right into flags | ||
134 | +# Evaluate into flags | ||
135 | +# Conditional compare (regster) | ||
136 | +# Conditional compare (immediate) | ||
137 | +# Conditional select | ||
138 | +# Data Processing (3-source) | ||
139 | + | ||
140 | ### Cryptographic AES | ||
141 | |||
142 | AESE 01001110 00 10100 00100 10 ..... ..... @r2r_q1e0 | ||
143 | -- | 129 | -- |
144 | 2.43.0 | 130 | 2.43.0 |
131 | |||
132 | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 46 ++++++++++++++++------------------ | 4 | target/arm/tcg/translate-a64.c | 46 ++++++++++++++++------------------ |
4 | target/arm/tcg/a64.decode | 4 +++ | 5 | target/arm/tcg/a64.decode | 4 +++ |
5 | 2 files changed, 25 insertions(+), 25 deletions(-) | 6 | 2 files changed, 25 insertions(+), 25 deletions(-) |
... | ... | ||
97 | 98 | ||
98 | # Data Processing (1-source) | 99 | # Data Processing (1-source) |
99 | # Logical (shifted reg) | 100 | # Logical (shifted reg) |
100 | -- | 101 | -- |
101 | 2.43.0 | 102 | 2.43.0 |
103 | |||
104 | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 101 +++++++++++++-------------------- | 4 | target/arm/tcg/translate-a64.c | 101 +++++++++++++-------------------- |
4 | target/arm/tcg/a64.decode | 12 ++++ | 5 | target/arm/tcg/a64.decode | 12 ++++ |
5 | 2 files changed, 53 insertions(+), 60 deletions(-) | 6 | 2 files changed, 53 insertions(+), 60 deletions(-) |
... | ... | ||
168 | # Data Processing (1-source) | 169 | # Data Processing (1-source) |
169 | # Logical (shifted reg) | 170 | # Logical (shifted reg) |
170 | # Add/subtract (shifted reg) | 171 | # Add/subtract (shifted reg) |
171 | -- | 172 | -- |
172 | 2.43.0 | 173 | 2.43.0 |
174 | |||
175 | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 94 +++++++++++++++++++--------------- | 4 | target/arm/tcg/translate-a64.c | 94 +++++++++++++++++++--------------- |
4 | target/arm/tcg/a64.decode | 7 +++ | 5 | target/arm/tcg/a64.decode | 7 +++ |
5 | 2 files changed, 59 insertions(+), 42 deletions(-) | 6 | 2 files changed, 59 insertions(+), 42 deletions(-) |
... | ... | ||
157 | # Data Processing (1-source) | 158 | # Data Processing (1-source) |
158 | # Logical (shifted reg) | 159 | # Logical (shifted reg) |
159 | # Add/subtract (shifted reg) | 160 | # Add/subtract (shifted reg) |
160 | -- | 161 | -- |
161 | 2.43.0 | 162 | 2.43.0 |
163 | |||
164 | diff view generated by jsdifflib |
1 | Remove disas_data_proc_2src, as this was the last insn | 1 | Remove disas_data_proc_2src, as this was the last insn |
---|---|---|---|
2 | decoded by that function. | 2 | decoded by that function. |
3 | 3 | ||
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 65 ++++++---------------------------- | 7 | target/arm/tcg/translate-a64.c | 65 ++++++---------------------------- |
7 | target/arm/tcg/a64.decode | 2 ++ | 8 | target/arm/tcg/a64.decode | 2 ++ |
8 | 2 files changed, 13 insertions(+), 54 deletions(-) | 9 | 2 files changed, 13 insertions(+), 54 deletions(-) |
... | ... | ||
110 | # Data Processing (1-source) | 111 | # Data Processing (1-source) |
111 | # Logical (shifted reg) | 112 | # Logical (shifted reg) |
112 | # Add/subtract (shifted reg) | 113 | # Add/subtract (shifted reg) |
113 | -- | 114 | -- |
114 | 2.43.0 | 115 | 2.43.0 |
116 | |||
117 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 137 +++++++++++++++------------------ | 4 | target/arm/tcg/translate-a64.c | 137 +++++++++++++++------------------ |
4 | target/arm/tcg/a64.decode | 11 +++ | 5 | target/arm/tcg/a64.decode | 11 +++ |
5 | 2 files changed, 72 insertions(+), 76 deletions(-) | 6 | 2 files changed, 72 insertions(+), 76 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 72 ++++++++++++++-------------------- | 4 | target/arm/tcg/translate-a64.c | 72 ++++++++++++++-------------------- |
4 | target/arm/tcg/a64.decode | 3 ++ | 5 | target/arm/tcg/a64.decode | 3 ++ |
5 | 2 files changed, 33 insertions(+), 42 deletions(-) | 6 | 2 files changed, 33 insertions(+), 42 deletions(-) |
... | ... | ||
122 | # Logical (shifted reg) | 123 | # Logical (shifted reg) |
123 | # Add/subtract (shifted reg) | 124 | # Add/subtract (shifted reg) |
124 | # Add/subtract (extended reg) | 125 | # Add/subtract (extended reg) |
125 | -- | 126 | -- |
126 | 2.43.0 | 127 | 2.43.0 |
128 | |||
129 | diff view generated by jsdifflib |
1 | This includes PACIA, PACIZA, PACIB, PACIZB, PACDA, PACDZA, PACDB, | 1 | This includes PACIA, PACIZA, PACIB, PACIZB, PACDA, PACDZA, PACDB, |
---|---|---|---|
2 | PACDZB, AUTIA, AUTIZA, AUTIB, AUTIZB, AUTDA, AUTDZA, AUTDB, AUTDZB. | 2 | PACDZB, AUTIA, AUTIZA, AUTIB, AUTIZB, AUTDA, AUTDZA, AUTDB, AUTDZB. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 173 +++++++++------------------------ | 7 | target/arm/tcg/translate-a64.c | 173 +++++++++------------------------ |
7 | target/arm/tcg/a64.decode | 13 +++ | 8 | target/arm/tcg/a64.decode | 13 +++ |
8 | 2 files changed, 58 insertions(+), 128 deletions(-) | 9 | 2 files changed, 58 insertions(+), 128 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Remove disas_data_proc_1src, as these were the last insns | 1 | Remove disas_data_proc_1src, as these were the last insns |
---|---|---|---|
2 | decoded by that function. | 2 | decoded by that function. |
3 | 3 | ||
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 99 +++++----------------------------- | 7 | target/arm/tcg/translate-a64.c | 99 +++++----------------------------- |
7 | target/arm/tcg/a64.decode | 3 ++ | 8 | target/arm/tcg/a64.decode | 3 ++ |
8 | 2 files changed, 16 insertions(+), 86 deletions(-) | 9 | 2 files changed, 16 insertions(+), 86 deletions(-) |
... | ... | ||
158 | # Logical (shifted reg) | 159 | # Logical (shifted reg) |
159 | # Add/subtract (shifted reg) | 160 | # Add/subtract (shifted reg) |
160 | # Add/subtract (extended reg) | 161 | # Add/subtract (extended reg) |
161 | -- | 162 | -- |
162 | 2.43.0 | 163 | 2.43.0 |
164 | |||
165 | diff view generated by jsdifflib |
1 | This includes AND, BIC, ORR, ORN, EOR, EON, ANDS, BICS (shifted reg). | 1 | This includes AND, BIC, ORR, ORN, EOR, EON, ANDS, BICS (shifted reg). |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/translate-a64.c | 117 ++++++++++++--------------------- | 6 | target/arm/tcg/translate-a64.c | 117 ++++++++++++--------------------- |
6 | target/arm/tcg/a64.decode | 9 +++ | 7 | target/arm/tcg/a64.decode | 9 +++ |
7 | 2 files changed, 51 insertions(+), 75 deletions(-) | 8 | 2 files changed, 51 insertions(+), 75 deletions(-) |
... | ... | ||
169 | XPACD 1 10 11010110 00001 010001 11111 rd:5 | 170 | XPACD 1 10 11010110 00001 010001 11111 rd:5 |
170 | 171 | ||
171 | # Logical (shifted reg) | 172 | # Logical (shifted reg) |
172 | + | 173 | + |
173 | +&logic_shift rd rn rm sf sa st n | 174 | +&logic_shift rd rn rm sf sa st n |
174 | +@logic_shift sf:1 .. ..... st:2 n:1 rm:5 sa:6 rn:5 rd:5 | 175 | +@logic_shift sf:1 .. ..... st:2 n:1 rm:5 sa:6 rn:5 rd:5 &logic_shift |
175 | + | 176 | + |
176 | +AND_r . 00 01010 .. . ..... ...... ..... ..... @logic_shift | 177 | +AND_r . 00 01010 .. . ..... ...... ..... ..... @logic_shift |
177 | +ORR_r . 01 01010 .. . ..... ...... ..... ..... @logic_shift | 178 | +ORR_r . 01 01010 .. . ..... ...... ..... ..... @logic_shift |
178 | +EOR_r . 10 01010 .. . ..... ...... ..... ..... @logic_shift | 179 | +EOR_r . 10 01010 .. . ..... ...... ..... ..... @logic_shift |
179 | +ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift | 180 | +ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift |
180 | + | 181 | + |
181 | # Add/subtract (shifted reg) | 182 | # Add/subtract (shifted reg) |
182 | # Add/subtract (extended reg) | 183 | # Add/subtract (extended reg) |
183 | # Add/subtract (carry) | 184 | # Add/subtract (carry) |
184 | -- | 185 | -- |
185 | 2.43.0 | 186 | 2.43.0 | diff view generated by jsdifflib |
1 | This includes ADD, SUB, ADDS, SUBS (extended register). | 1 | This includes ADD, SUB, ADDS, SUBS (extended register). |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/translate-a64.c | 65 +++++++++++----------------------- | 6 | target/arm/tcg/translate-a64.c | 65 +++++++++++----------------------- |
6 | target/arm/tcg/a64.decode | 9 +++++ | 7 | target/arm/tcg/a64.decode | 9 +++++ |
7 | 2 files changed, 29 insertions(+), 45 deletions(-) | 8 | 2 files changed, 29 insertions(+), 45 deletions(-) |
... | ... | ||
119 | disas_add_sub_reg(s, insn); | 120 | disas_add_sub_reg(s, insn); |
120 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 121 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
121 | index XXXXXXX..XXXXXXX 100644 | 122 | index XXXXXXX..XXXXXXX 100644 |
122 | --- a/target/arm/tcg/a64.decode | 123 | --- a/target/arm/tcg/a64.decode |
123 | +++ b/target/arm/tcg/a64.decode | 124 | +++ b/target/arm/tcg/a64.decode |
124 | @@ -XXX,XX +XXX,XX @@ ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift | 125 | @@ -XXX,XX +XXX,XX @@ ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift |
125 | 126 | ||
126 | # Add/subtract (shifted reg) | 127 | # Add/subtract (shifted reg) |
127 | # Add/subtract (extended reg) | 128 | # Add/subtract (extended reg) |
128 | + | 129 | + |
129 | +&addsub_ext rd rn rm sf sa st | 130 | +&addsub_ext rd rn rm sf sa st |
130 | +@addsub_ext sf:1 .. ........ rm:5 st:3 sa:3 rn:5 rd:5 &addsub_ext | 131 | +@addsub_ext sf:1 .. ........ rm:5 st:3 sa:3 rn:5 rd:5 &addsub_ext |
131 | + | 132 | + |
132 | +ADD_ext . 00 01011001 ..... ... ... ..... ..... @addsub_ext | 133 | +ADD_ext . 00 01011001 ..... ... ... ..... ..... @addsub_ext |
133 | +SUB_ext . 10 01011001 ..... ... ... ..... ..... @addsub_ext | 134 | +SUB_ext . 10 01011001 ..... ... ... ..... ..... @addsub_ext |
134 | +ADDS_ext . 01 01011001 ..... ... ... ..... ..... @addsub_ext | 135 | +ADDS_ext . 01 01011001 ..... ... ... ..... ..... @addsub_ext |
135 | +SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext | 136 | +SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext |
136 | + | 137 | + |
137 | # Add/subtract (carry) | 138 | # Add/subtract (carry) |
138 | # Rotate right into flags | 139 | # Rotate right into flags |
139 | # Evaluate into flags | 140 | # Evaluate into flags |
140 | -- | 141 | -- |
141 | 2.43.0 | 142 | 2.43.0 | diff view generated by jsdifflib |
1 | This includes ADD, SUB, ADDS, SUBS (shifted register). | 1 | This includes ADD, SUB, ADDS, SUBS (shifted register). |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/translate-a64.c | 64 ++++++++++------------------------ | 6 | target/arm/tcg/translate-a64.c | 64 ++++++++++------------------------ |
6 | target/arm/tcg/a64.decode | 11 +++++- | 7 | target/arm/tcg/a64.decode | 9 +++++ |
7 | 2 files changed, 28 insertions(+), 47 deletions(-) | 8 | 2 files changed, 27 insertions(+), 46 deletions(-) |
8 | 9 | ||
9 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
10 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/arm/tcg/translate-a64.c | 12 | --- a/target/arm/tcg/translate-a64.c |
12 | +++ b/target/arm/tcg/translate-a64.c | 13 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
114 | 115 | ||
115 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 116 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
116 | index XXXXXXX..XXXXXXX 100644 | 117 | index XXXXXXX..XXXXXXX 100644 |
117 | --- a/target/arm/tcg/a64.decode | 118 | --- a/target/arm/tcg/a64.decode |
118 | +++ b/target/arm/tcg/a64.decode | 119 | +++ b/target/arm/tcg/a64.decode |
119 | @@ -XXX,XX +XXX,XX @@ XPACD 1 10 11010110 00001 010001 11111 rd:5 | 120 | @@ -XXX,XX +XXX,XX @@ EOR_r . 10 01010 .. . ..... ...... ..... ..... @logic_shift |
120 | # Logical (shifted reg) | 121 | ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift |
121 | |||
122 | &logic_shift rd rn rm sf sa st n | ||
123 | -@logic_shift sf:1 .. ..... st:2 n:1 rm:5 sa:6 rn:5 rd:5 | ||
124 | +@logic_shift sf:1 .. ..... st:2 n:1 rm:5 sa:6 rn:5 rd:5 &logic_shift | ||
125 | |||
126 | AND_r . 00 01010 .. . ..... ...... ..... ..... @logic_shift | ||
127 | ORR_r . 01 01010 .. . ..... ...... ..... ..... @logic_shift | ||
128 | @@ -XXX,XX +XXX,XX @@ EOR_r . 10 01010 .. . ..... ...... ..... ..... @logic_shift | ||
129 | ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift | ||
130 | 122 | ||
131 | # Add/subtract (shifted reg) | 123 | # Add/subtract (shifted reg) |
132 | + | 124 | + |
133 | +&addsub_shift rd rn rm sf sa st | 125 | +&addsub_shift rd rn rm sf sa st |
134 | +@addsub_shift sf:1 .. ..... st:2 . rm:5 sa:6 rn:5 rd:5 &addsub_shift | 126 | +@addsub_shift sf:1 .. ..... st:2 . rm:5 sa:6 rn:5 rd:5 &addsub_shift |
135 | + | 127 | + |
136 | +ADD_r . 00 01011 .. 0 ..... ...... ..... ..... @addsub_shift | 128 | +ADD_r . 00 01011 .. 0 ..... ...... ..... ..... @addsub_shift |
137 | +SUB_r . 10 01011 .. 0 ..... ...... ..... ..... @addsub_shift | 129 | +SUB_r . 10 01011 .. 0 ..... ...... ..... ..... @addsub_shift |
138 | +ADDS_r . 01 01011 .. 0 ..... ...... ..... ..... @addsub_shift | 130 | +ADDS_r . 01 01011 .. 0 ..... ...... ..... ..... @addsub_shift |
139 | +SUBS_r . 11 01011 .. 0 ..... ...... ..... ..... @addsub_shift | 131 | +SUBS_r . 11 01011 .. 0 ..... ...... ..... ..... @addsub_shift |
140 | + | 132 | + |
141 | # Add/subtract (extended reg) | 133 | # Add/subtract (extended reg) |
142 | 134 | ||
143 | &addsub_ext rd rn rm sf sa st | 135 | &addsub_ext rd rn rm sf sa st |
144 | -- | 136 | -- |
145 | 2.43.0 | 137 | 2.43.0 | diff view generated by jsdifflib |
1 | This includes MADD, MSUB, SMADDL, SMSUBL, UMADDL, UMSUBL, SMULH, UMULH. | 1 | This includes MADD, MSUB, SMADDL, SMSUBL, UMADDL, UMSUBL, SMULH, UMULH. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/translate-a64.c | 119 ++++++++++++--------------------- | 6 | target/arm/tcg/translate-a64.c | 119 ++++++++++++--------------------- |
6 | target/arm/tcg/a64.decode | 16 +++++ | 7 | target/arm/tcg/a64.decode | 16 +++++ |
7 | 2 files changed, 59 insertions(+), 76 deletions(-) | 8 | 2 files changed, 59 insertions(+), 76 deletions(-) |
... | ... | ||
168 | } | 169 | } |
169 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 170 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
170 | index XXXXXXX..XXXXXXX 100644 | 171 | index XXXXXXX..XXXXXXX 100644 |
171 | --- a/target/arm/tcg/a64.decode | 172 | --- a/target/arm/tcg/a64.decode |
172 | +++ b/target/arm/tcg/a64.decode | 173 | +++ b/target/arm/tcg/a64.decode |
173 | @@ -XXX,XX +XXX,XX @@ SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext | 174 | @@ -XXX,XX +XXX,XX @@ SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext |
174 | # Conditional select | 175 | # Conditional select |
175 | # Data Processing (3-source) | 176 | # Data Processing (3-source) |
176 | 177 | ||
177 | +&rrrr rd rn rm ra | 178 | +&rrrr rd rn rm ra |
178 | +@rrrr . .. ........ rm:5 . ra:5 rn:5 rd:5 &rrrr | 179 | +@rrrr . .. ........ rm:5 . ra:5 rn:5 rd:5 &rrrr |
... | ... | diff view generated by jsdifflib |
1 | This includes ADC, SBC, ADCS, SBCS. | 1 | This includes ADC, SBC, ADCS, SBCS. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/translate-a64.c | 43 +++++++++++++--------------------- | 6 | target/arm/tcg/translate-a64.c | 43 +++++++++++++--------------------- |
6 | target/arm/tcg/a64.decode | 6 +++++ | 7 | target/arm/tcg/a64.decode | 6 +++++ |
7 | 2 files changed, 22 insertions(+), 27 deletions(-) | 8 | 2 files changed, 22 insertions(+), 27 deletions(-) |
... | ... | ||
89 | break; | 90 | break; |
90 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 91 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
91 | index XXXXXXX..XXXXXXX 100644 | 92 | index XXXXXXX..XXXXXXX 100644 |
92 | --- a/target/arm/tcg/a64.decode | 93 | --- a/target/arm/tcg/a64.decode |
93 | +++ b/target/arm/tcg/a64.decode | 94 | +++ b/target/arm/tcg/a64.decode |
94 | @@ -XXX,XX +XXX,XX @@ ADDS_ext . 01 01011001 ..... ... ... ..... ..... @addsub_ext | 95 | @@ -XXX,XX +XXX,XX @@ ADDS_ext . 01 01011001 ..... ... ... ..... ..... @addsub_ext |
95 | SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext | 96 | SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext |
96 | 97 | ||
97 | # Add/subtract (carry) | 98 | # Add/subtract (carry) |
98 | + | 99 | + |
99 | +ADC . 00 11010000 ..... 000000 ..... ..... @rrr_sf | 100 | +ADC . 00 11010000 ..... 000000 ..... ..... @rrr_sf |
100 | +ADCS . 01 11010000 ..... 000000 ..... ..... @rrr_sf | 101 | +ADCS . 01 11010000 ..... 000000 ..... ..... @rrr_sf |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 32 +++++++++----------------------- | 4 | target/arm/tcg/translate-a64.c | 32 +++++++++----------------------- |
4 | target/arm/tcg/a64.decode | 3 +++ | 5 | target/arm/tcg/a64.decode | 3 +++ |
5 | 2 files changed, 12 insertions(+), 23 deletions(-) | 6 | 2 files changed, 12 insertions(+), 23 deletions(-) |
... | ... | ||
88 | # Evaluate into flags | 89 | # Evaluate into flags |
89 | # Conditional compare (regster) | 90 | # Conditional compare (regster) |
90 | # Conditional compare (immediate) | 91 | # Conditional compare (immediate) |
91 | -- | 92 | -- |
92 | 2.43.0 | 93 | 2.43.0 |
94 | |||
95 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 48 +++++----------------------------- | 4 | target/arm/tcg/translate-a64.c | 48 +++++----------------------------- |
4 | target/arm/tcg/a64.decode | 4 +++ | 5 | target/arm/tcg/a64.decode | 4 +++ |
5 | 2 files changed, 11 insertions(+), 41 deletions(-) | 6 | 2 files changed, 11 insertions(+), 41 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 66 +++++++++++----------------------- | 4 | target/arm/tcg/translate-a64.c | 66 +++++++++++----------------------- |
4 | target/arm/tcg/a64.decode | 6 ++-- | 5 | target/arm/tcg/a64.decode | 6 ++-- |
5 | 2 files changed, 25 insertions(+), 47 deletions(-) | 6 | 2 files changed, 25 insertions(+), 47 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | This includes CSEL, CSINC, CSINV, CSNEG. Remove disas_data_proc_reg, | 1 | This includes CSEL, CSINC, CSINV, CSNEG. Remove disas_data_proc_reg, |
---|---|---|---|
2 | as these were the last insns decoded by that function. | 2 | as these were the last insns decoded by that function. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 84 ++++++---------------------------- | 7 | target/arm/tcg/translate-a64.c | 84 ++++++---------------------------- |
7 | target/arm/tcg/a64.decode | 3 ++ | 8 | target/arm/tcg/a64.decode | 3 ++ |
8 | 2 files changed, 17 insertions(+), 70 deletions(-) | 9 | 2 files changed, 17 insertions(+), 70 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Provide a simple way to check for float64, float32, | 1 | Provide a simple way to check for float64, float32, |
---|---|---|---|
2 | and float16 support, as well as the fpu enabled. | 2 | and float16 support, as well as the fpu enabled. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 62 ++++++++++++++++++---------------- | 7 | target/arm/tcg/translate-a64.c | 62 ++++++++++++++++++---------------- |
7 | 1 file changed, 32 insertions(+), 30 deletions(-) | 8 | 1 file changed, 32 insertions(+), 30 deletions(-) |
8 | 9 | ||
... | ... | diff view generated by jsdifflib |
1 | Provide a simple way to check for float64, float32, and float16 | 1 | Provide a simple way to check for float64, float32, and float16 |
---|---|---|---|
2 | support vs vector width, as well as the fpu enabled. | 2 | support vs vector width, as well as the fpu enabled. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 135 +++++++++++++-------------------- | 7 | target/arm/tcg/translate-a64.c | 135 +++++++++++++-------------------- |
7 | 1 file changed, 54 insertions(+), 81 deletions(-) | 8 | 1 file changed, 54 insertions(+), 81 deletions(-) |
8 | 9 | ||
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 287 +++++++++++++-------------------- | 4 | target/arm/tcg/translate-a64.c | 283 ++++++++++++--------------------- |
4 | target/arm/tcg/a64.decode | 8 + | 5 | target/arm/tcg/a64.decode | 8 + |
5 | 2 files changed, 116 insertions(+), 179 deletions(-) | 6 | 2 files changed, 112 insertions(+), 179 deletions(-) |
6 | 7 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 8 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 10 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 11 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
72 | +} | 73 | +} |
73 | + | 74 | + |
74 | +/* FCMP, FCMPE */ | 75 | +/* FCMP, FCMPE */ |
75 | +static bool trans_FCMP(DisasContext *s, arg_FCMP *a) | 76 | +static bool trans_FCMP(DisasContext *s, arg_FCMP *a) |
76 | +{ | 77 | +{ |
77 | + int check; | 78 | + int check = fp_access_check_scalar_hsd(s, a->esz); |
78 | + | 79 | + |
79 | + if (a->z && a->rm != 0) { | ||
80 | + return false; | ||
81 | + } | ||
82 | + check = fp_access_check_scalar_hsd(s, a->esz); | ||
83 | + if (check <= 0) { | 80 | + if (check <= 0) { |
84 | + return check == 0; | 81 | + return check == 0; |
85 | + } | 82 | + } |
86 | + | 83 | + |
87 | + handle_fp_compare(s, a->esz, a->rn, a->rm, a->z, a->e); | 84 | + handle_fp_compare(s, a->esz, a->rn, a->rm, a->z, a->e); |
... | ... | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | These opcodes are only supported as vector operations, | ||
2 | not as advsimd scalar. Set only_in_vector, and remove | ||
3 | the unreachable implementation of scalar fneg. | ||
1 | 4 | ||
5 | Reported-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/arm/tcg/translate-a64.c | 4 +--- | ||
9 | 1 file changed, 1 insertion(+), 3 deletions(-) | ||
10 | |||
11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/arm/tcg/translate-a64.c | ||
14 | +++ b/target/arm/tcg/translate-a64.c | ||
15 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | ||
16 | break; | ||
17 | case 0x2f: /* FABS */ | ||
18 | case 0x6f: /* FNEG */ | ||
19 | + only_in_vector = true; | ||
20 | need_fpst = false; | ||
21 | break; | ||
22 | case 0x7d: /* FRSQRTE */ | ||
23 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | ||
24 | case 0x7b: /* FCVTZU */ | ||
25 | gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus); | ||
26 | break; | ||
27 | - case 0x6f: /* FNEG */ | ||
28 | - tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000); | ||
29 | - break; | ||
30 | case 0x7d: /* FRSQRTE */ | ||
31 | gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); | ||
32 | break; | ||
33 | -- | ||
34 | 2.43.0 | diff view generated by jsdifflib |
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
---|---|---|---|
2 | --- | 2 | --- |
3 | target/arm/tcg/translate-a64.c | 104 ++++++++++++++++++++++----------- | 3 | target/arm/tcg/translate-a64.c | 105 +++++++++++++++++++++++---------- |
4 | target/arm/tcg/a64.decode | 7 +++ | 4 | target/arm/tcg/a64.decode | 7 +++ |
5 | 2 files changed, 78 insertions(+), 33 deletions(-) | 5 | 2 files changed, 81 insertions(+), 31 deletions(-) |
6 | 6 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 8 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 9 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 10 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
159 | + case 0x1: /* FABS */ | 159 | + case 0x1: /* FABS */ |
160 | + case 0x2: /* FNEG */ | 160 | + case 0x2: /* FNEG */ |
161 | g_assert_not_reached(); | 161 | g_assert_not_reached(); |
162 | } | 162 | } |
163 | 163 | ||
164 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 164 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) |
165 | case 0x7b: /* FCVTZU */ | 165 | goto do_unallocated; |
166 | gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus); | ||
167 | break; | ||
168 | - case 0x6f: /* FNEG */ | ||
169 | - tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000); | ||
170 | - break; | ||
171 | case 0x7d: /* FRSQRTE */ | ||
172 | gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); | ||
173 | break; | ||
174 | default: | ||
175 | + case 0x6f: /* FNEG */ | ||
176 | g_assert_not_reached(); | ||
177 | } | 166 | } |
178 | 167 | /* fall through */ | |
168 | - case 0x0 ... 0x3: | ||
169 | + case 0x3: | ||
170 | case 0x8 ... 0xc: | ||
171 | case 0xe ... 0xf: | ||
172 | /* 32-to-32 and 64-to-64 ops */ | ||
173 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | ||
174 | |||
175 | default: | ||
176 | do_unallocated: | ||
177 | + case 0x0: /* FMOV */ | ||
178 | + case 0x1: /* FABS */ | ||
179 | + case 0x2: /* FNEG */ | ||
180 | unallocated_encoding(s); | ||
181 | break; | ||
182 | } | ||
179 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 183 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
180 | index XXXXXXX..XXXXXXX 100644 | 184 | index XXXXXXX..XXXXXXX 100644 |
181 | --- a/target/arm/tcg/a64.decode | 185 | --- a/target/arm/tcg/a64.decode |
182 | +++ b/target/arm/tcg/a64.decode | 186 | +++ b/target/arm/tcg/a64.decode |
183 | @@ -XXX,XX +XXX,XX @@ | 187 | @@ -XXX,XX +XXX,XX @@ |
... | ... | diff view generated by jsdifflib |
1 | Pass fpstatus not env, like most other fp helpers. | 1 | Pass fpstatus not env, like most other fp helpers. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/helper.h | 6 +++--- | 6 | target/arm/helper.h | 6 +++--- |
6 | target/arm/tcg/translate-a64.c | 15 +++++++-------- | 7 | target/arm/tcg/translate-a64.c | 15 +++++++-------- |
7 | target/arm/tcg/translate-vfp.c | 6 +++--- | 8 | target/arm/tcg/translate-vfp.c | 6 +++--- |
... | ... | diff view generated by jsdifflib |
1 | This function is identical with helper_vfp_sqrth. | 1 | This function is identical with helper_vfp_sqrth. |
---|---|---|---|
2 | Replace all uses. | 2 | Replace all uses. |
3 | 3 | ||
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/helper-a64.h | 1 - | 7 | target/arm/tcg/helper-a64.h | 1 - |
7 | target/arm/tcg/helper-a64.c | 11 ----------- | 8 | target/arm/tcg/helper-a64.c | 11 ----------- |
8 | target/arm/tcg/translate-a64.c | 4 ++-- | 9 | target/arm/tcg/translate-a64.c | 4 ++-- |
... | ... | ||
64 | break; | 65 | break; |
65 | default: | 66 | default: |
66 | g_assert_not_reached(); | 67 | g_assert_not_reached(); |
67 | -- | 68 | -- |
68 | 2.43.0 | 69 | 2.43.0 |
70 | |||
71 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 70 +++++++++++++++++++++++++++++----- | 4 | target/arm/tcg/translate-a64.c | 72 ++++++++++++++++++++++++++++------ |
4 | target/arm/tcg/a64.decode | 1 + | 5 | target/arm/tcg/a64.decode | 1 + |
5 | 2 files changed, 61 insertions(+), 10 deletions(-) | 6 | 2 files changed, 62 insertions(+), 11 deletions(-) |
6 | 7 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 8 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 10 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 11 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
125 | case 0x2: /* FNEG */ | 126 | case 0x2: /* FNEG */ |
126 | + case 0x3: /* FSQRT */ | 127 | + case 0x3: /* FSQRT */ |
127 | g_assert_not_reached(); | 128 | g_assert_not_reached(); |
128 | } | 129 | } |
129 | 130 | ||
131 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | ||
132 | goto do_unallocated; | ||
133 | } | ||
134 | /* fall through */ | ||
135 | - case 0x3: | ||
136 | case 0x8 ... 0xc: | ||
137 | case 0xe ... 0xf: | ||
138 | /* 32-to-32 and 64-to-64 ops */ | ||
139 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | ||
140 | case 0x0: /* FMOV */ | ||
141 | case 0x1: /* FABS */ | ||
142 | case 0x2: /* FNEG */ | ||
143 | + case 0x3: /* FSQRT */ | ||
144 | unallocated_encoding(s); | ||
145 | break; | ||
146 | } | ||
130 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 147 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
131 | index XXXXXXX..XXXXXXX 100644 | 148 | index XXXXXXX..XXXXXXX 100644 |
132 | --- a/target/arm/tcg/a64.decode | 149 | --- a/target/arm/tcg/a64.decode |
133 | +++ b/target/arm/tcg/a64.decode | 150 | +++ b/target/arm/tcg/a64.decode |
134 | @@ -XXX,XX +XXX,XX @@ FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2 | 151 | @@ -XXX,XX +XXX,XX @@ FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2 |
... | ... | diff view generated by jsdifflib |
1 | Remove handle_fp_1src_half as these were the last insns | 1 | Remove handle_fp_1src_half as these were the last insns |
---|---|---|---|
2 | decoded by that function. | 2 | decoded by that function. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 107 ++++++++++----------------------- | 7 | target/arm/tcg/translate-a64.c | 117 +++++++++++---------------------- |
7 | target/arm/tcg/a64.decode | 8 +++ | 8 | target/arm/tcg/a64.decode | 8 +++ |
8 | 2 files changed, 39 insertions(+), 76 deletions(-) | 9 | 2 files changed, 46 insertions(+), 79 deletions(-) |
9 | 10 | ||
10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
11 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/arm/tcg/translate-a64.c | 13 | --- a/target/arm/tcg/translate-a64.c |
13 | +++ b/target/arm/tcg/translate-a64.c | 14 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
103 | + case 0x8: /* FRINTN */ | 104 | + case 0x8: /* FRINTN */ |
104 | + case 0x9: /* FRINTP */ | 105 | + case 0x9: /* FRINTP */ |
105 | + case 0xa: /* FRINTM */ | 106 | + case 0xa: /* FRINTM */ |
106 | + case 0xb: /* FRINTZ */ | 107 | + case 0xb: /* FRINTZ */ |
107 | + case 0xc: /* FRINTA */ | 108 | + case 0xc: /* FRINTA */ |
109 | + case 0xe: /* FRINTX */ | ||
108 | + case 0xf: /* FRINTI */ | 110 | + case 0xf: /* FRINTI */ |
109 | + case 0xe: /* FRINTX */ | ||
110 | g_assert_not_reached(); | 111 | g_assert_not_reached(); |
111 | } | 112 | } |
112 | 113 | ||
113 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn) | 114 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn) |
114 | tcg_res = tcg_temp_new_i64(); | 115 | tcg_res = tcg_temp_new_i64(); |
... | ... | ||
138 | + case 0x8: /* FRINTN */ | 139 | + case 0x8: /* FRINTN */ |
139 | + case 0x9: /* FRINTP */ | 140 | + case 0x9: /* FRINTP */ |
140 | + case 0xa: /* FRINTM */ | 141 | + case 0xa: /* FRINTM */ |
141 | + case 0xb: /* FRINTZ */ | 142 | + case 0xb: /* FRINTZ */ |
142 | + case 0xc: /* FRINTA */ | 143 | + case 0xc: /* FRINTA */ |
144 | + case 0xe: /* FRINTX */ | ||
143 | + case 0xf: /* FRINTI */ | 145 | + case 0xf: /* FRINTI */ |
144 | + case 0xe: /* FRINTX */ | ||
145 | g_assert_not_reached(); | 146 | g_assert_not_reached(); |
146 | } | 147 | } |
147 | 148 | ||
149 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | ||
150 | if (type > 1 || !dc_isar_feature(aa64_frint, s)) { | ||
151 | goto do_unallocated; | ||
152 | } | ||
153 | - /* fall through */ | ||
154 | - case 0x8 ... 0xc: | ||
155 | - case 0xe ... 0xf: | ||
156 | /* 32-to-32 and 64-to-64 ops */ | ||
157 | switch (type) { | ||
158 | case 0: | ||
148 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | 159 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) |
149 | handle_fp_1src_double(s, opcode, rd, rn); | 160 | handle_fp_1src_double(s, opcode, rd, rn); |
150 | break; | 161 | break; |
151 | case 3: | 162 | case 3: |
152 | - if (!dc_isar_feature(aa64_fp16, s)) { | 163 | - if (!dc_isar_feature(aa64_fp16, s)) { |
... | ... | ||
159 | - handle_fp_1src_half(s, opcode, rd, rn); | 170 | - handle_fp_1src_half(s, opcode, rd, rn); |
160 | - break; | 171 | - break; |
161 | default: | 172 | default: |
162 | goto do_unallocated; | 173 | goto do_unallocated; |
163 | } | 174 | } |
175 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | ||
176 | case 0x1: /* FABS */ | ||
177 | case 0x2: /* FNEG */ | ||
178 | case 0x3: /* FSQRT */ | ||
179 | + case 0x8: /* FRINTN */ | ||
180 | + case 0x9: /* FRINTP */ | ||
181 | + case 0xa: /* FRINTM */ | ||
182 | + case 0xb: /* FRINTZ */ | ||
183 | + case 0xc: /* FRINTA */ | ||
184 | + case 0xe: /* FRINTX */ | ||
185 | + case 0xf: /* FRINTI */ | ||
186 | unallocated_encoding(s); | ||
187 | break; | ||
188 | } | ||
164 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 189 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
165 | index XXXXXXX..XXXXXXX 100644 | 190 | index XXXXXXX..XXXXXXX 100644 |
166 | --- a/target/arm/tcg/a64.decode | 191 | --- a/target/arm/tcg/a64.decode |
167 | +++ b/target/arm/tcg/a64.decode | 192 | +++ b/target/arm/tcg/a64.decode |
168 | @@ -XXX,XX +XXX,XX @@ FABS_s 00011110 .. 1 000001 10000 ..... ..... @rr_hsd | 193 | @@ -XXX,XX +XXX,XX @@ FABS_s 00011110 .. 1 000001 10000 ..... ..... @rr_hsd |
... | ... | diff view generated by jsdifflib |
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
---|---|---|---|
2 | --- | 2 | --- |
3 | target/arm/tcg/translate-a64.c | 24 ++++++------------------ | 3 | target/arm/tcg/translate-a64.c | 26 +++++++------------------- |
4 | target/arm/tcg/a64.decode | 3 +++ | 4 | target/arm/tcg/a64.decode | 3 +++ |
5 | 2 files changed, 9 insertions(+), 18 deletions(-) | 5 | 2 files changed, 10 insertions(+), 19 deletions(-) |
6 | 6 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 8 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 9 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 10 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
37 | + case 0x6: /* BFCVT */ | 37 | + case 0x6: /* BFCVT */ |
38 | case 0x8: /* FRINTN */ | 38 | case 0x8: /* FRINTN */ |
39 | case 0x9: /* FRINTP */ | 39 | case 0x9: /* FRINTP */ |
40 | case 0xa: /* FRINTM */ | 40 | case 0xa: /* FRINTM */ |
41 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | 41 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) |
42 | } | ||
42 | break; | 43 | break; |
43 | 44 | ||
44 | case 0x6: | 45 | - case 0x6: |
45 | - switch (type) { | 46 | - switch (type) { |
46 | - case 1: /* BFCVT */ | 47 | - case 1: /* BFCVT */ |
47 | - if (!dc_isar_feature(aa64_bf16, s)) { | 48 | - if (!dc_isar_feature(aa64_bf16, s)) { |
48 | - goto do_unallocated; | 49 | - goto do_unallocated; |
49 | - } | 50 | - } |
... | ... | ||
57 | - } | 58 | - } |
58 | - break; | 59 | - break; |
59 | - | 60 | - |
60 | default: | 61 | default: |
61 | do_unallocated: | 62 | do_unallocated: |
62 | unallocated_encoding(s); | 63 | case 0x0: /* FMOV */ |
64 | case 0x1: /* FABS */ | ||
65 | case 0x2: /* FNEG */ | ||
66 | case 0x3: /* FSQRT */ | ||
67 | + case 0x6: /* BFCVT */ | ||
68 | case 0x8: /* FRINTN */ | ||
69 | case 0x9: /* FRINTP */ | ||
70 | case 0xa: /* FRINTM */ | ||
63 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 71 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
64 | index XXXXXXX..XXXXXXX 100644 | 72 | index XXXXXXX..XXXXXXX 100644 |
65 | --- a/target/arm/tcg/a64.decode | 73 | --- a/target/arm/tcg/a64.decode |
66 | +++ b/target/arm/tcg/a64.decode | 74 | +++ b/target/arm/tcg/a64.decode |
67 | @@ -XXX,XX +XXX,XX @@ | 75 | @@ -XXX,XX +XXX,XX @@ |
... | ... | ||
74 | @rr_hsd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_hsd | 82 | @rr_hsd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_hsd |
75 | @@ -XXX,XX +XXX,XX @@ FRINTA_s 00011110 .. 1 001100 10000 ..... ..... @rr_hsd | 83 | @@ -XXX,XX +XXX,XX @@ FRINTA_s 00011110 .. 1 001100 10000 ..... ..... @rr_hsd |
76 | FRINTX_s 00011110 .. 1 001110 10000 ..... ..... @rr_hsd | 84 | FRINTX_s 00011110 .. 1 001110 10000 ..... ..... @rr_hsd |
77 | FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd | 85 | FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd |
78 | 86 | ||
79 | +BFCVT_s 00011110 10 1 000110 10000 ..... ..... @rr_s | 87 | +BFCVT_s 00011110 01 1 000110 10000 ..... ..... @rr_s |
80 | + | 88 | + |
81 | # Floating-point Immediate | 89 | # Floating-point Immediate |
82 | 90 | ||
83 | FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd | 91 | FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd |
84 | -- | 92 | -- |
85 | 2.43.0 | 93 | 2.43.0 | diff view generated by jsdifflib |
1 | Remove handle_fp_1src_single and handle_fp_1src_double as | 1 | Remove handle_fp_1src_single and handle_fp_1src_double as |
---|---|---|---|
2 | these were the last insns decoded by those functions. | 2 | these were the last insns decoded by those functions. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 150 ++++----------------------------- | 7 | target/arm/tcg/translate-a64.c | 146 ++++----------------------------- |
7 | target/arm/tcg/a64.decode | 5 ++ | 8 | target/arm/tcg/a64.decode | 5 ++ |
8 | 2 files changed, 21 insertions(+), 134 deletions(-) | 9 | 2 files changed, 22 insertions(+), 129 deletions(-) |
9 | 10 | ||
10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
11 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/arm/tcg/translate-a64.c | 13 | --- a/target/arm/tcg/translate-a64.c |
13 | +++ b/target/arm/tcg/translate-a64.c | 14 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
58 | - case 0x8: /* FRINTN */ | 59 | - case 0x8: /* FRINTN */ |
59 | - case 0x9: /* FRINTP */ | 60 | - case 0x9: /* FRINTP */ |
60 | - case 0xa: /* FRINTM */ | 61 | - case 0xa: /* FRINTM */ |
61 | - case 0xb: /* FRINTZ */ | 62 | - case 0xb: /* FRINTZ */ |
62 | - case 0xc: /* FRINTA */ | 63 | - case 0xc: /* FRINTA */ |
64 | - case 0xe: /* FRINTX */ | ||
63 | - case 0xf: /* FRINTI */ | 65 | - case 0xf: /* FRINTI */ |
64 | - case 0xe: /* FRINTX */ | ||
65 | - g_assert_not_reached(); | 66 | - g_assert_not_reached(); |
66 | - } | 67 | - } |
67 | - | 68 | - |
68 | - fpst = fpstatus_ptr(FPST_FPCR); | 69 | - fpst = fpstatus_ptr(FPST_FPCR); |
69 | - if (rmode >= 0) { | 70 | - if (rmode >= 0) { |
... | ... | ||
111 | - case 0x8: /* FRINTN */ | 112 | - case 0x8: /* FRINTN */ |
112 | - case 0x9: /* FRINTP */ | 113 | - case 0x9: /* FRINTP */ |
113 | - case 0xa: /* FRINTM */ | 114 | - case 0xa: /* FRINTM */ |
114 | - case 0xb: /* FRINTZ */ | 115 | - case 0xb: /* FRINTZ */ |
115 | - case 0xc: /* FRINTA */ | 116 | - case 0xc: /* FRINTA */ |
117 | - case 0xe: /* FRINTX */ | ||
116 | - case 0xf: /* FRINTI */ | 118 | - case 0xf: /* FRINTI */ |
117 | - case 0xe: /* FRINTX */ | ||
118 | - g_assert_not_reached(); | 119 | - g_assert_not_reached(); |
119 | - } | 120 | - } |
120 | - | 121 | - |
121 | - fpst = fpstatus_ptr(FPST_FPCR); | 122 | - fpst = fpstatus_ptr(FPST_FPCR); |
122 | - if (rmode >= 0) { | 123 | - if (rmode >= 0) { |
... | ... | ||
146 | 147 | ||
147 | - case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */ | 148 | - case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */ |
148 | - if (type > 1 || !dc_isar_feature(aa64_frint, s)) { | 149 | - if (type > 1 || !dc_isar_feature(aa64_frint, s)) { |
149 | - goto do_unallocated; | 150 | - goto do_unallocated; |
150 | - } | 151 | - } |
151 | - /* fall through */ | ||
152 | - case 0x0 ... 0x3: | ||
153 | - case 0x8 ... 0xc: | ||
154 | - case 0xe ... 0xf: | ||
155 | - /* 32-to-32 and 64-to-64 ops */ | 152 | - /* 32-to-32 and 64-to-64 ops */ |
156 | - switch (type) { | 153 | - switch (type) { |
157 | - case 0: | 154 | - case 0: |
158 | - if (!fp_access_check(s)) { | 155 | - if (!fp_access_check(s)) { |
159 | - return; | 156 | - return; |
... | ... | ||
170 | - default: | 167 | - default: |
171 | - goto do_unallocated; | 168 | - goto do_unallocated; |
172 | - } | 169 | - } |
173 | - break; | 170 | - break; |
174 | - | 171 | - |
175 | - case 0x6: | ||
176 | default: | 172 | default: |
177 | do_unallocated: | 173 | do_unallocated: |
174 | case 0x0: /* FMOV */ | ||
175 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn) | ||
176 | case 0xc: /* FRINTA */ | ||
177 | case 0xe: /* FRINTX */ | ||
178 | case 0xf: /* FRINTI */ | ||
179 | + case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */ | ||
178 | unallocated_encoding(s); | 180 | unallocated_encoding(s); |
181 | break; | ||
182 | } | ||
179 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 183 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
180 | index XXXXXXX..XXXXXXX 100644 | 184 | index XXXXXXX..XXXXXXX 100644 |
181 | --- a/target/arm/tcg/a64.decode | 185 | --- a/target/arm/tcg/a64.decode |
182 | +++ b/target/arm/tcg/a64.decode | 186 | +++ b/target/arm/tcg/a64.decode |
183 | @@ -XXX,XX +XXX,XX @@ FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd | 187 | @@ -XXX,XX +XXX,XX @@ FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd |
184 | 188 | ||
185 | BFCVT_s 00011110 10 1 000110 10000 ..... ..... @rr_s | 189 | BFCVT_s 00011110 01 1 000110 10000 ..... ..... @rr_s |
186 | 190 | ||
187 | +FRINT32Z_s 00011110 0. 1 010000 10000 ..... ..... @rr_sd | 191 | +FRINT32Z_s 00011110 0. 1 010000 10000 ..... ..... @rr_sd |
188 | +FRINT32X_s 00011110 0. 1 010001 10000 ..... ..... @rr_sd | 192 | +FRINT32X_s 00011110 0. 1 010001 10000 ..... ..... @rr_sd |
189 | +FRINT64Z_s 00011110 0. 1 010010 10000 ..... ..... @rr_sd | 193 | +FRINT64Z_s 00011110 0. 1 010010 10000 ..... ..... @rr_sd |
190 | +FRINT64X_s 00011110 0. 1 010011 10000 ..... ..... @rr_sd | 194 | +FRINT64X_s 00011110 0. 1 010011 10000 ..... ..... @rr_sd |
191 | + | 195 | + |
192 | # Floating-point Immediate | 196 | # Floating-point Immediate |
193 | 197 | ||
194 | FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd | 198 | FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd |
195 | -- | 199 | -- |
196 | 2.43.0 | 200 | 2.43.0 | diff view generated by jsdifflib |
1 | Remove handle_fp_fcvt and disas_fp_1src as these were | 1 | Remove handle_fp_fcvt and disas_fp_1src as these were |
---|---|---|---|
2 | the last insns decoded by those functions. | 2 | the last insns decoded by those functions. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 159 ++++++++++++++------------------- | 7 | target/arm/tcg/translate-a64.c | 172 +++++++++++++-------------------- |
7 | target/arm/tcg/a64.decode | 7 ++ | 8 | target/arm/tcg/a64.decode | 7 ++ |
8 | 2 files changed, 74 insertions(+), 92 deletions(-) | 9 | 2 files changed, 74 insertions(+), 105 deletions(-) |
9 | 10 | ||
10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
11 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/arm/tcg/translate-a64.c | 13 | --- a/target/arm/tcg/translate-a64.c |
13 | +++ b/target/arm/tcg/translate-a64.c | 14 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
140 | + return true; | 141 | + return true; |
141 | +} | 142 | +} |
142 | 143 | ||
143 | - default: | 144 | - default: |
144 | - do_unallocated: | 145 | - do_unallocated: |
146 | - case 0x0: /* FMOV */ | ||
147 | - case 0x1: /* FABS */ | ||
148 | - case 0x2: /* FNEG */ | ||
149 | - case 0x3: /* FSQRT */ | ||
150 | - case 0x6: /* BFCVT */ | ||
151 | - case 0x8: /* FRINTN */ | ||
152 | - case 0x9: /* FRINTP */ | ||
153 | - case 0xa: /* FRINTM */ | ||
154 | - case 0xb: /* FRINTZ */ | ||
155 | - case 0xc: /* FRINTA */ | ||
156 | - case 0xe: /* FRINTX */ | ||
157 | - case 0xf: /* FRINTI */ | ||
158 | - case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */ | ||
145 | - unallocated_encoding(s); | 159 | - unallocated_encoding(s); |
146 | - break; | 160 | - break; |
147 | +static bool trans_FCVT_s_hd(DisasContext *s, arg_rr *a) | 161 | +static bool trans_FCVT_s_hd(DisasContext *s, arg_rr *a) |
148 | +{ | 162 | +{ |
149 | + if (fp_access_check(s)) { | 163 | + if (fp_access_check(s)) { |
... | ... | diff view generated by jsdifflib |
1 | This includes SCVTF, UCVTF, FCVT{N,P,M,Z,A}{S,U}. | 1 | This includes SCVTF, UCVTF, FCVT{N,P,M,Z,A}{S,U}. |
---|---|---|---|
2 | Remove disas_fp_fixed_conv as those were the last insns | 2 | Remove disas_fp_fixed_conv as those were the last insns |
3 | decoded by that function. | 3 | decoded by that function. |
4 | 4 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 7 | --- |
7 | target/arm/tcg/translate-a64.c | 391 ++++++++++++++------------------- | 8 | target/arm/tcg/translate-a64.c | 391 ++++++++++++++------------------- |
8 | target/arm/tcg/a64.decode | 40 ++++ | 9 | target/arm/tcg/a64.decode | 40 ++++ |
9 | 2 files changed, 209 insertions(+), 222 deletions(-) | 10 | 2 files changed, 209 insertions(+), 222 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 41 +++++++++++++++++----------------- | 4 | target/arm/tcg/translate-a64.c | 41 +++++++++++++++++----------------- |
4 | target/arm/tcg/a64.decode | 2 ++ | 5 | target/arm/tcg/a64.decode | 2 ++ |
5 | 2 files changed, 22 insertions(+), 21 deletions(-) | 6 | 2 files changed, 22 insertions(+), 21 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Remove disas_fp_int_conv and disas_data_proc_fp as these | 1 | Remove disas_fp_int_conv and disas_data_proc_fp as these |
---|---|---|---|
2 | were the last insns decoded by those functions. | 2 | were the last insns decoded by those functions. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 232 ++++++++++----------------------- | 7 | target/arm/tcg/translate-a64.c | 232 ++++++++++----------------------- |
7 | target/arm/tcg/a64.decode | 14 ++ | 8 | target/arm/tcg/a64.decode | 14 ++ |
8 | 2 files changed, 86 insertions(+), 160 deletions(-) | 9 | 2 files changed, 86 insertions(+), 160 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 123 +++++++++++++++++++++------------ | 4 | target/arm/tcg/translate-a64.c | 123 +++++++++++++++++++++------------ |
4 | target/arm/tcg/a64.decode | 11 +++ | 5 | target/arm/tcg/a64.decode | 11 +++ |
5 | 2 files changed, 89 insertions(+), 45 deletions(-) | 6 | 2 files changed, 89 insertions(+), 45 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 46 +++++++++++++++++++++++----------- | 4 | target/arm/tcg/translate-a64.c | 46 +++++++++++++++++++++++----------- |
4 | target/arm/tcg/a64.decode | 4 +++ | 5 | target/arm/tcg/a64.decode | 4 +++ |
5 | 2 files changed, 35 insertions(+), 15 deletions(-) | 6 | 2 files changed, 35 insertions(+), 15 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Add gvec interfaces for CLS and CLZ operations. | 1 | Add gvec interfaces for CLS and CLZ operations. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/translate.h | 5 +++++ | 6 | target/arm/tcg/translate.h | 5 +++++ |
6 | target/arm/tcg/gengvec.c | 35 +++++++++++++++++++++++++++++++++ | 7 | target/arm/tcg/gengvec.c | 35 +++++++++++++++++++++++++++++++++ |
7 | target/arm/tcg/translate-a64.c | 29 +++++++-------------------- | 8 | target/arm/tcg/translate-a64.c | 29 +++++++-------------------- |
... | ... | ||
168 | static bool trans_VCNT(DisasContext *s, arg_2misc *a) | 169 | static bool trans_VCNT(DisasContext *s, arg_2misc *a) |
169 | { | 170 | { |
170 | if (a->size != 0) { | 171 | if (a->size != 0) { |
171 | -- | 172 | -- |
172 | 2.43.0 | 173 | 2.43.0 |
174 | |||
175 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 37 ++++++++++++++++------------------ | 4 | target/arm/tcg/translate-a64.c | 37 ++++++++++++++++------------------ |
4 | target/arm/tcg/a64.decode | 2 ++ | 5 | target/arm/tcg/a64.decode | 2 ++ |
5 | 2 files changed, 19 insertions(+), 20 deletions(-) | 6 | 2 files changed, 19 insertions(+), 20 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Add gvec interfaces for CNT and RBIT operations. | 1 | Add gvec interfaces for CNT and RBIT operations. |
---|---|---|---|
2 | Use ctpop8 for CNT and revbit+bswap for RBIT. | 2 | Use ctpop8 for CNT and revbit+bswap for RBIT. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/helper.h | 4 ++-- | 7 | target/arm/helper.h | 4 ++-- |
7 | target/arm/tcg/translate.h | 4 ++++ | 8 | target/arm/tcg/translate.h | 4 ++++ |
8 | target/arm/tcg/gengvec.c | 16 ++++++++++++++++ | 9 | target/arm/tcg/gengvec.c | 16 ++++++++++++++++ |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 34 ++++++---------------------------- | 4 | target/arm/tcg/translate-a64.c | 34 ++++++---------------------------- |
4 | target/arm/tcg/a64.decode | 4 ++++ | 5 | target/arm/tcg/a64.decode | 4 ++++ |
5 | 2 files changed, 10 insertions(+), 28 deletions(-) | 6 | 2 files changed, 10 insertions(+), 28 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 94 +++++++++++----------------------- | 4 | target/arm/tcg/translate-a64.c | 94 +++++++++++----------------------- |
4 | target/arm/tcg/a64.decode | 10 ++++ | 5 | target/arm/tcg/a64.decode | 10 ++++ |
5 | 2 files changed, 40 insertions(+), 64 deletions(-) | 6 | 2 files changed, 40 insertions(+), 64 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate.h | 6 +++ | 4 | target/arm/tcg/translate.h | 6 +++ |
4 | target/arm/tcg/gengvec.c | 58 ++++++++++++++++++++++ | 5 | target/arm/tcg/gengvec.c | 58 ++++++++++++++++++++++ |
5 | target/arm/tcg/translate-neon.c | 88 +++++++-------------------------- | 6 | target/arm/tcg/translate-neon.c | 88 +++++++-------------------------- |
... | ... | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
117 | if (size == 3) { | 117 | if (size == 3) { |
118 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 118 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
119 | break; | 119 | break; |
120 | } | 120 | } |
121 | default: | 121 | default: |
122 | + case 0x0: /* REV64 */ | 122 | + case 0x0: /* REV64, REV32 */ |
123 | + case 0x1: /* REV16, REV32 */ | 123 | + case 0x1: /* REV16 */ |
124 | case 0x3: /* SUQADD, USQADD */ | 124 | case 0x3: /* SUQADD, USQADD */ |
125 | case 0x4: /* CLS, CLZ */ | 125 | case 0x4: /* CLS, CLZ */ |
126 | case 0x5: /* CNT, NOT, RBIT */ | 126 | case 0x5: /* CNT, NOT, RBIT */ |
127 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 127 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
128 | index XXXXXXX..XXXXXXX 100644 | 128 | index XXXXXXX..XXXXXXX 100644 |
... | ... | ||
140 | CMEQ0_v 0.00 1110 ..1 00000 10011 0 ..... ..... @qrr_e | 140 | CMEQ0_v 0.00 1110 ..1 00000 10011 0 ..... ..... @qrr_e |
141 | CMLE0_v 0.10 1110 ..1 00000 10011 0 ..... ..... @qrr_e | 141 | CMLE0_v 0.10 1110 ..1 00000 10011 0 ..... ..... @qrr_e |
142 | CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e | 142 | CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e |
143 | + | 143 | + |
144 | +REV16_v 0.00 1110 001 00000 00011 0 ..... ..... @qrr_b | 144 | +REV16_v 0.00 1110 001 00000 00011 0 ..... ..... @qrr_b |
145 | +REV32_v 0.10 1110 0.1 00000 00011 0 ..... ..... @qrr_bh | 145 | +REV32_v 0.10 1110 0.1 00000 00001 0 ..... ..... @qrr_bh |
146 | +REV64_v 0.00 1110 ..1 00000 00001 0 ..... ..... @qrr_e | 146 | +REV64_v 0.00 1110 ..1 00000 00001 0 ..... ..... @qrr_e |
147 | -- | 147 | -- |
148 | 2.43.0 | 148 | 2.43.0 | diff view generated by jsdifflib |
1 | Move from helper-a64.c to neon_helper.c so that these | 1 | Move from helper-a64.c to neon_helper.c so that these |
---|---|---|---|
2 | functions are available for arm32 code as well. | 2 | functions are available for arm32 code as well. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/helper.h | 2 ++ | 7 | target/arm/helper.h | 2 ++ |
7 | target/arm/tcg/helper-a64.h | 2 -- | 8 | target/arm/tcg/helper-a64.h | 2 -- |
8 | target/arm/tcg/helper-a64.c | 43 ------------------------------------ | 9 | target/arm/tcg/helper-a64.c | 43 ------------------------------------ |
... | ... | diff view generated by jsdifflib |
1 | Pairwise addition with and without accumulation. | 1 | Pairwise addition with and without accumulation. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/helper.h | 2 - | 6 | target/arm/helper.h | 2 - |
6 | target/arm/tcg/translate.h | 9 ++ | 7 | target/arm/tcg/translate.h | 9 ++ |
7 | target/arm/tcg/gengvec.c | 230 ++++++++++++++++++++++++++++++++ | 8 | target/arm/tcg/gengvec.c | 230 ++++++++++++++++++++++++++++++++ |
... | ... | diff view generated by jsdifflib |
1 | This includes SADDLP, UADDLP, SADALP, UADALP. | 1 | This includes SADDLP, UADDLP, SADALP, UADALP. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/tcg/helper-a64.h | 2 - | 6 | target/arm/tcg/helper-a64.h | 2 - |
6 | target/arm/tcg/helper-a64.c | 18 -------- | 7 | target/arm/tcg/helper-a64.c | 18 -------- |
7 | target/arm/tcg/translate-a64.c | 84 +++------------------------------- | 8 | target/arm/tcg/translate-a64.c | 84 +++------------------------------- |
... | ... | ||
157 | case 0x13: /* SHLL, SHLL2 */ | 158 | case 0x13: /* SHLL, SHLL2 */ |
158 | if (u == 0 || size == 3) { | 159 | if (u == 0 || size == 3) { |
159 | unallocated_encoding(s); | 160 | unallocated_encoding(s); |
160 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 161 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
161 | default: | 162 | default: |
162 | case 0x0: /* REV64 */ | 163 | case 0x0: /* REV64, REV32 */ |
163 | case 0x1: /* REV16, REV32 */ | 164 | case 0x1: /* REV16 */ |
164 | + case 0x2: /* SADDLP, UADDLP */ | 165 | + case 0x2: /* SADDLP, UADDLP */ |
165 | case 0x3: /* SUQADD, USQADD */ | 166 | case 0x3: /* SUQADD, USQADD */ |
166 | case 0x4: /* CLS, CLZ */ | 167 | case 0x4: /* CLS, CLZ */ |
167 | case 0x5: /* CNT, NOT, RBIT */ | 168 | case 0x5: /* CNT, NOT, RBIT */ |
168 | + case 0x6: /* SADALP, UADALP */ | 169 | + case 0x6: /* SADALP, UADALP */ |
... | ... | ||
173 | index XXXXXXX..XXXXXXX 100644 | 174 | index XXXXXXX..XXXXXXX 100644 |
174 | --- a/target/arm/tcg/a64.decode | 175 | --- a/target/arm/tcg/a64.decode |
175 | +++ b/target/arm/tcg/a64.decode | 176 | +++ b/target/arm/tcg/a64.decode |
176 | @@ -XXX,XX +XXX,XX @@ CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e | 177 | @@ -XXX,XX +XXX,XX @@ CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e |
177 | REV16_v 0.00 1110 001 00000 00011 0 ..... ..... @qrr_b | 178 | REV16_v 0.00 1110 001 00000 00011 0 ..... ..... @qrr_b |
178 | REV32_v 0.10 1110 0.1 00000 00011 0 ..... ..... @qrr_bh | 179 | REV32_v 0.10 1110 0.1 00000 00001 0 ..... ..... @qrr_bh |
179 | REV64_v 0.00 1110 ..1 00000 00001 0 ..... ..... @qrr_e | 180 | REV64_v 0.00 1110 ..1 00000 00001 0 ..... ..... @qrr_e |
180 | + | 181 | + |
181 | +SADDLP_v 0.00 1110 ..1 00000 00101 0 ..... ..... @qrr_e | 182 | +SADDLP_v 0.00 1110 ..1 00000 00101 0 ..... ..... @qrr_e |
182 | +UADDLP_v 0.10 1110 ..1 00000 00101 0 ..... ..... @qrr_e | 183 | +UADDLP_v 0.10 1110 ..1 00000 00101 0 ..... ..... @qrr_e |
183 | +SADALP_v 0.00 1110 ..1 00000 01101 0 ..... ..... @qrr_e | 184 | +SADALP_v 0.00 1110 ..1 00000 01101 0 ..... ..... @qrr_e |
184 | +UADALP_v 0.10 1110 ..1 00000 01101 0 ..... ..... @qrr_e | 185 | +UADALP_v 0.10 1110 ..1 00000 01101 0 ..... ..... @qrr_e |
185 | -- | 186 | -- |
186 | 2.43.0 | 187 | 2.43.0 | diff view generated by jsdifflib |
1 | These have generic equivalents: tcg_gen_vec_{add,sub}{16,32}_i64. | 1 | These have generic equivalents: tcg_gen_vec_{add,sub}{16,32}_i64. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/helper.h | 4 ---- | 6 | target/arm/helper.h | 4 ---- |
6 | target/arm/tcg/neon_helper.c | 36 --------------------------------- | 7 | target/arm/tcg/neon_helper.c | 36 --------------------------------- |
7 | target/arm/tcg/translate-neon.c | 22 ++++++++++---------- | 8 | target/arm/tcg/translate-neon.c | 22 ++++++++++---------- |
... | ... | diff view generated by jsdifflib |
1 | In a couple of places, clearing the entire vector before storing one | 1 | In a couple of places, clearing the entire vector before storing one |
---|---|---|---|
2 | element is the easiest solution. Wrap that into a helper function. | 2 | element is the easiest solution. Wrap that into a helper function. |
3 | 3 | ||
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 21 ++++++++++++--------- | 7 | target/arm/tcg/translate-a64.c | 21 ++++++++++++--------- |
7 | 1 file changed, 12 insertions(+), 9 deletions(-) | 8 | 1 file changed, 12 insertions(+), 9 deletions(-) |
8 | 9 | ||
... | ... | ||
66 | write_vec_element(s, t0, a->rd, 0, a->esz + 1); | 67 | write_vec_element(s, t0, a->rd, 0, a->esz + 1); |
67 | } | 68 | } |
68 | return true; | 69 | return true; |
69 | -- | 70 | -- |
70 | 2.43.0 | 71 | 2.43.0 |
72 | |||
73 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 153 ++++++++++++++++++++------------- | 4 | target/arm/tcg/translate-a64.c | 153 ++++++++++++++++++++------------- |
4 | target/arm/tcg/a64.decode | 9 ++ | 5 | target/arm/tcg/a64.decode | 9 ++ |
5 | 2 files changed, 102 insertions(+), 60 deletions(-) | 6 | 2 files changed, 102 insertions(+), 60 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 89 ++++++++++++++++++---------------- | 4 | target/arm/tcg/translate-a64.c | 89 ++++++++++++++++++---------------- |
4 | target/arm/tcg/a64.decode | 5 ++ | 5 | target/arm/tcg/a64.decode | 5 ++ |
5 | 2 files changed, 52 insertions(+), 42 deletions(-) | 6 | 2 files changed, 52 insertions(+), 42 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Remove handle_2misc_narrow as this was the last insn decoded | 1 | Remove handle_2misc_narrow as this was the last insn decoded |
---|---|---|---|
2 | by that function. | 2 | by that function. |
3 | 3 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 6 | --- |
6 | target/arm/tcg/translate-a64.c | 101 +++++++-------------------------- | 7 | target/arm/tcg/translate-a64.c | 101 +++++++-------------------------- |
7 | target/arm/tcg/a64.decode | 4 ++ | 8 | target/arm/tcg/a64.decode | 4 ++ |
8 | 2 files changed, 24 insertions(+), 81 deletions(-) | 9 | 2 files changed, 24 insertions(+), 81 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 75 +++++++++++++++++----------------- | 4 | target/arm/tcg/translate-a64.c | 75 +++++++++++++++++----------------- |
4 | target/arm/tcg/a64.decode | 2 + | 5 | target/arm/tcg/a64.decode | 2 + |
5 | 2 files changed, 40 insertions(+), 37 deletions(-) | 6 | 2 files changed, 40 insertions(+), 37 deletions(-) |
... | ... | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | Move the current implementation out of translate-neon.c, | ||
2 | and extend to handle all element sizes. | ||
1 | 3 | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate.h | 6 ++++++ | ||
7 | target/arm/tcg/gengvec.c | 14 ++++++++++++++ | ||
8 | target/arm/tcg/translate-neon.c | 20 ++------------------ | ||
9 | 3 files changed, 22 insertions(+), 18 deletions(-) | ||
10 | |||
11 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/arm/tcg/translate.h | ||
14 | +++ b/target/arm/tcg/translate.h | ||
15 | @@ -XXX,XX +XXX,XX @@ void gen_gvec_uaddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
16 | void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
17 | uint32_t opr_sz, uint32_t max_sz); | ||
18 | |||
19 | +/* These exclusively manipulate the sign bit. */ | ||
20 | +void gen_gvec_fabs(unsigned vece, uint32_t dofs, uint32_t aofs, | ||
21 | + uint32_t oprsz, uint32_t maxsz); | ||
22 | +void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs, | ||
23 | + uint32_t oprsz, uint32_t maxsz); | ||
24 | + | ||
25 | /* | ||
26 | * Forward to the isar_feature_* tests given a DisasContext pointer. | ||
27 | */ | ||
28 | diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c | ||
29 | index XXXXXXX..XXXXXXX 100644 | ||
30 | --- a/target/arm/tcg/gengvec.c | ||
31 | +++ b/target/arm/tcg/gengvec.c | ||
32 | @@ -XXX,XX +XXX,XX @@ void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
33 | assert(vece <= MO_32); | ||
34 | tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]); | ||
35 | } | ||
36 | + | ||
37 | +void gen_gvec_fabs(unsigned vece, uint32_t dofs, uint32_t aofs, | ||
38 | + uint32_t oprsz, uint32_t maxsz) | ||
39 | +{ | ||
40 | + uint64_t s_bit = 1ull << ((8 << vece) - 1); | ||
41 | + tcg_gen_gvec_andi(vece, dofs, aofs, s_bit - 1, oprsz, maxsz); | ||
42 | +} | ||
43 | + | ||
44 | +void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs, | ||
45 | + uint32_t oprsz, uint32_t maxsz) | ||
46 | +{ | ||
47 | + uint64_t s_bit = 1ull << ((8 << vece) - 1); | ||
48 | + tcg_gen_gvec_xori(vece, dofs, aofs, s_bit, oprsz, maxsz); | ||
49 | +} | ||
50 | diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c | ||
51 | index XXXXXXX..XXXXXXX 100644 | ||
52 | --- a/target/arm/tcg/translate-neon.c | ||
53 | +++ b/target/arm/tcg/translate-neon.c | ||
54 | @@ -XXX,XX +XXX,XX @@ static bool do_2misc(DisasContext *s, arg_2misc *a, NeonGenOneOpFn *fn) | ||
55 | return true; | ||
56 | } | ||
57 | |||
58 | -static void gen_VABS_F(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
59 | - uint32_t oprsz, uint32_t maxsz) | ||
60 | -{ | ||
61 | - tcg_gen_gvec_andi(vece, rd_ofs, rm_ofs, | ||
62 | - vece == MO_16 ? 0x7fff : 0x7fffffff, | ||
63 | - oprsz, maxsz); | ||
64 | -} | ||
65 | - | ||
66 | static bool trans_VABS_F(DisasContext *s, arg_2misc *a) | ||
67 | { | ||
68 | if (a->size == MO_16) { | ||
69 | @@ -XXX,XX +XXX,XX @@ static bool trans_VABS_F(DisasContext *s, arg_2misc *a) | ||
70 | } else if (a->size != MO_32) { | ||
71 | return false; | ||
72 | } | ||
73 | - return do_2misc_vec(s, a, gen_VABS_F); | ||
74 | -} | ||
75 | - | ||
76 | -static void gen_VNEG_F(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
77 | - uint32_t oprsz, uint32_t maxsz) | ||
78 | -{ | ||
79 | - tcg_gen_gvec_xori(vece, rd_ofs, rm_ofs, | ||
80 | - vece == MO_16 ? 0x8000 : 0x80000000, | ||
81 | - oprsz, maxsz); | ||
82 | + return do_2misc_vec(s, a, gen_gvec_fabs); | ||
83 | } | ||
84 | |||
85 | static bool trans_VNEG_F(DisasContext *s, arg_2misc *a) | ||
86 | @@ -XXX,XX +XXX,XX @@ static bool trans_VNEG_F(DisasContext *s, arg_2misc *a) | ||
87 | } else if (a->size != MO_32) { | ||
88 | return false; | ||
89 | } | ||
90 | - return do_2misc_vec(s, a, gen_VNEG_F); | ||
91 | + return do_2misc_vec(s, a, gen_gvec_fneg); | ||
92 | } | ||
93 | |||
94 | static bool trans_VRECPE(DisasContext *s, arg_2misc *a) | ||
95 | -- | ||
96 | 2.43.0 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 61 ++++++++++++++++++---------------- | 4 | target/arm/tcg/translate-a64.c | 54 +++++++++++++++------------------- |
4 | target/arm/tcg/a64.decode | 7 ++++ | 5 | target/arm/tcg/a64.decode | 7 +++++ |
5 | 2 files changed, 39 insertions(+), 29 deletions(-) | 6 | 2 files changed, 31 insertions(+), 30 deletions(-) |
6 | 7 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 8 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 10 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 11 | +++ b/target/arm/tcg/translate-a64.c |
11 | @@ -XXX,XX +XXX,XX @@ static bool trans_SHLL_v(DisasContext *s, arg_qrr_e *a) | 12 | @@ -XXX,XX +XXX,XX @@ static bool trans_SHLL_v(DisasContext *s, arg_qrr_e *a) |
12 | return true; | 13 | return true; |
13 | } | 14 | } |
14 | 15 | ||
15 | +static bool do_fabs_fneg_v(DisasContext *s, arg_qrr_e *a, bool neg) | 16 | +static bool do_fabs_fneg_v(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn) |
16 | +{ | 17 | +{ |
17 | + int check = fp_access_check_vector_hsd(s, a->q, a->esz); | 18 | + int check = fp_access_check_vector_hsd(s, a->q, a->esz); |
18 | + uint64_t sign; | ||
19 | + | 19 | + |
20 | + if (check <= 0) { | 20 | + if (check <= 0) { |
21 | + return check == 0; | 21 | + return check == 0; |
22 | + } | 22 | + } |
23 | + | 23 | + |
24 | + sign = 1ull << ((8 << a->esz) - 1); | 24 | + gen_gvec_fn2(s, a->q, a->rd, a->rn, fn, a->esz); |
25 | + if (neg) { | ||
26 | + gen_gvec_fn2i(s, a->q, a->rd, a->rn, sign, | ||
27 | + tcg_gen_gvec_xori, a->esz); | ||
28 | + } else { | ||
29 | + gen_gvec_fn2i(s, a->q, a->rd, a->rn, sign - 1, | ||
30 | + tcg_gen_gvec_andi, a->esz); | ||
31 | + } | ||
32 | + return true; | 25 | + return true; |
33 | +} | 26 | +} |
34 | + | 27 | + |
35 | +TRANS(FABS_v, do_fabs_fneg_v, a, false) | 28 | +TRANS(FABS_v, do_fabs_fneg_v, a, gen_gvec_fabs) |
36 | +TRANS(FNEG_v, do_fabs_fneg_v, a, true) | 29 | +TRANS(FNEG_v, do_fabs_fneg_v, a, gen_gvec_fneg) |
37 | 30 | ||
38 | /* Common vector code for handling integer to FP conversion */ | 31 | /* Common vector code for handling integer to FP conversion */ |
39 | static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, | 32 | static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, |
40 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u, | 33 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u, |
41 | * requires them. | 34 | * requires them. |
... | ... | ||
108 | case 0x7b: /* FCVTZU */ | 101 | case 0x7b: /* FCVTZU */ |
109 | rmode = FPROUNDING_ZERO; | 102 | rmode = FPROUNDING_ZERO; |
110 | break; | 103 | break; |
111 | - case 0x2f: /* FABS */ | 104 | - case 0x2f: /* FABS */ |
112 | - case 0x6f: /* FNEG */ | 105 | - case 0x6f: /* FNEG */ |
106 | - only_in_vector = true; | ||
113 | - need_fpst = false; | 107 | - need_fpst = false; |
114 | - break; | 108 | - break; |
115 | case 0x7d: /* FRSQRTE */ | 109 | case 0x7d: /* FRSQRTE */ |
116 | case 0x7f: /* FSQRT (vector) */ | 110 | case 0x7f: /* FSQRT (vector) */ |
117 | break; | 111 | break; |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 67 +++++++++++++++++++++++++--------- | 4 | target/arm/tcg/translate-a64.c | 67 +++++++++++++++++++++++++--------- |
4 | target/arm/tcg/a64.decode | 3 ++ | 5 | target/arm/tcg/a64.decode | 3 ++ |
5 | 2 files changed, 53 insertions(+), 17 deletions(-) | 6 | 2 files changed, 53 insertions(+), 17 deletions(-) |
6 | 7 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 8 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 10 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 11 | +++ b/target/arm/tcg/translate-a64.c |
11 | @@ -XXX,XX +XXX,XX @@ static bool do_fabs_fneg_v(DisasContext *s, arg_qrr_e *a, bool neg) | 12 | @@ -XXX,XX +XXX,XX @@ static bool do_fabs_fneg_v(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn) |
12 | TRANS(FABS_v, do_fabs_fneg_v, a, false) | 13 | TRANS(FABS_v, do_fabs_fneg_v, a, gen_gvec_fabs) |
13 | TRANS(FNEG_v, do_fabs_fneg_v, a, true) | 14 | TRANS(FNEG_v, do_fabs_fneg_v, a, gen_gvec_fneg) |
14 | 15 | ||
15 | +static bool do_fp1_vector(DisasContext *s, arg_qrr_e *a, | 16 | +static bool do_fp1_vector(DisasContext *s, arg_qrr_e *a, |
16 | + const FPScalar1 *f, int rmode) | 17 | + const FPScalar1 *f, int rmode) |
17 | +{ | 18 | +{ |
18 | + TCGv_i32 tcg_rmode = NULL; | 19 | + TCGv_i32 tcg_rmode = NULL; |
... | ... | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 176 ++++++++++++--------------------- | 4 | target/arm/tcg/translate-a64.c | 176 ++++++++++++--------------------- |
4 | target/arm/tcg/a64.decode | 26 +++++ | 5 | target/arm/tcg/a64.decode | 26 +++++ |
5 | 2 files changed, 88 insertions(+), 114 deletions(-) | 6 | 2 files changed, 88 insertions(+), 114 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Arm silliness with naming, the scalar insns described | 1 | Arm silliness with naming, the scalar insns described |
---|---|---|---|
2 | as part of the vector instructions, as separate from | 2 | as part of the vector instructions, as separate from |
3 | the "regular" scalar insns which output to general registers. | 3 | the "regular" scalar insns which output to general registers. |
4 | 4 | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 6 | --- |
7 | target/arm/tcg/translate-a64.c | 135 ++++++++++++++------------------- | 7 | target/arm/tcg/translate-a64.c | 133 ++++++++++++++------------------- |
8 | target/arm/tcg/a64.decode | 30 ++++++++ | 8 | target/arm/tcg/a64.decode | 30 ++++++++ |
9 | 2 files changed, 87 insertions(+), 78 deletions(-) | 9 | 2 files changed, 86 insertions(+), 77 deletions(-) |
10 | 10 | ||
11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
12 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/target/arm/tcg/translate-a64.c | 13 | --- a/target/arm/tcg/translate-a64.c |
14 | +++ b/target/arm/tcg/translate-a64.c | 14 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
175 | gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus); | 175 | gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus); |
176 | break; | 176 | break; |
177 | case 0x3f: /* FRECPX */ | 177 | case 0x3f: /* FRECPX */ |
178 | gen_helper_frecpx_f16(tcg_res, tcg_op, tcg_fpstatus); | 178 | gen_helper_frecpx_f16(tcg_res, tcg_op, tcg_fpstatus); |
179 | break; | 179 | break; |
180 | - case 0x5a: /* FCVTNU */ | 180 | + case 0x7d: /* FRSQRTE */ |
181 | - case 0x5b: /* FCVTMU */ | 181 | + gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); |
182 | - case 0x5c: /* FCVTAU */ | 182 | + break; |
183 | - case 0x7a: /* FCVTPU */ | 183 | + default: |
184 | - case 0x7b: /* FCVTZU */ | ||
185 | - gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus); | ||
186 | - break; | ||
187 | case 0x7d: /* FRSQRTE */ | ||
188 | gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); | ||
189 | break; | ||
190 | default: | ||
191 | case 0x6f: /* FNEG */ | ||
192 | + case 0x1a: /* FCVTNS */ | 184 | + case 0x1a: /* FCVTNS */ |
193 | + case 0x1b: /* FCVTMS */ | 185 | + case 0x1b: /* FCVTMS */ |
194 | + case 0x1c: /* FCVTAS */ | 186 | + case 0x1c: /* FCVTAS */ |
195 | + case 0x3a: /* FCVTPS */ | 187 | + case 0x3a: /* FCVTPS */ |
196 | + case 0x3b: /* FCVTZS */ | 188 | + case 0x3b: /* FCVTZS */ |
197 | + case 0x5a: /* FCVTNU */ | 189 | case 0x5a: /* FCVTNU */ |
198 | + case 0x5b: /* FCVTMU */ | 190 | case 0x5b: /* FCVTMU */ |
199 | + case 0x5c: /* FCVTAU */ | 191 | case 0x5c: /* FCVTAU */ |
200 | + case 0x7a: /* FCVTPU */ | 192 | case 0x7a: /* FCVTPU */ |
201 | + case 0x7b: /* FCVTZU */ | 193 | case 0x7b: /* FCVTZU */ |
194 | - gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus); | ||
195 | - break; | ||
196 | - case 0x7d: /* FRSQRTE */ | ||
197 | - gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); | ||
198 | - break; | ||
199 | - default: | ||
202 | g_assert_not_reached(); | 200 | g_assert_not_reached(); |
203 | } | 201 | } |
204 | 202 | ||
205 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 203 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
206 | index XXXXXXX..XXXXXXX 100644 | 204 | index XXXXXXX..XXXXXXX 100644 |
... | ... | diff view generated by jsdifflib |
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
---|---|---|---|
2 | --- | 2 | --- |
3 | target/arm/tcg/translate-a64.c | 4 +--- | 3 | target/arm/tcg/translate-a64.c | 4 +--- |
4 | target/arm/tcg/a64.decode | 19 +++++++++++++++++++ | 4 | target/arm/tcg/a64.decode | 19 +++++++++++++++++++ |
5 | 2 files changed, 20 insertions(+), 3 deletions(-) | 5 | 2 files changed, 20 insertions(+), 3 deletions(-) |
6 | 6 | ||
7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 7 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
8 | index XXXXXXX..XXXXXXX 100644 | 8 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/arm/tcg/translate-a64.c | 9 | --- a/target/arm/tcg/translate-a64.c |
10 | +++ b/target/arm/tcg/translate-a64.c | 10 | +++ b/target/arm/tcg/translate-a64.c |
11 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) | 11 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) |
12 | handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb, | 12 | handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb, |
13 | opcode, rn, rd); | 13 | opcode, rn, rd); |
14 | break; | 14 | break; |
15 | - case 0x1f: /* FCVTZS, FCVTZU */ | 15 | - case 0x1f: /* FCVTZS, FCVTZU */ |
16 | - handle_simd_shift_fpint_conv(s, true, false, is_u, immh, immb, rn, rd); | 16 | - handle_simd_shift_fpint_conv(s, true, false, is_u, immh, immb, rn, rd); |
17 | - break; | 17 | - break; |
18 | default: | 18 | default: |
19 | case 0x00: /* SSHR / USHR */ | 19 | case 0x00: /* SSHR / USHR */ |
20 | case 0x02: /* SSRA / USRA */ | 20 | case 0x02: /* SSRA / USRA */ |
21 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) | 21 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) |
22 | case 0x11: /* SQRSHRUN */ | 22 | case 0x11: /* SQRSHRUN */ |
23 | case 0x12: /* SQSHRN, UQSHRN */ | 23 | case 0x12: /* SQSHRN, UQSHRN */ |
24 | case 0x13: /* SQRSHRN, UQRSHRN */ | 24 | case 0x13: /* SQRSHRN, UQRSHRN */ |
25 | + case 0x1f: /* FCVTZS, FCVTZU */ | 25 | + case 0x1f: /* FCVTZS, FCVTZU */ |
26 | unallocated_encoding(s); | 26 | unallocated_encoding(s); |
27 | break; | 27 | break; |
28 | } | 28 | } |
29 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 29 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
30 | index XXXXXXX..XXXXXXX 100644 | 30 | index XXXXXXX..XXXXXXX 100644 |
31 | --- a/target/arm/tcg/a64.decode | 31 | --- a/target/arm/tcg/a64.decode |
32 | +++ b/target/arm/tcg/a64.decode | 32 | +++ b/target/arm/tcg/a64.decode |
33 | @@ -XXX,XX +XXX,XX @@ FCVTAS_f 0101 1110 0.1 00001 11001 0 ..... ..... @icvt_sd | 33 | @@ -XXX,XX +XXX,XX @@ FCVTAS_f 0101 1110 0.1 00001 11001 0 ..... ..... @icvt_sd |
34 | FCVTAU_f 0111 1110 011 11001 11001 0 ..... ..... @icvt_h | 34 | FCVTAU_f 0111 1110 011 11001 11001 0 ..... ..... @icvt_h |
35 | FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd | 35 | FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd |
36 | 36 | ||
37 | +%fcvt_f_sh_h 16:4 !function=rsub_16 | 37 | +%fcvt_f_sh_h 16:4 !function=rsub_16 |
38 | +%fcvt_f_sh_s 16:5 !function=rsub_32 | 38 | +%fcvt_f_sh_s 16:5 !function=rsub_32 |
39 | +%fcvt_f_sh_d 16:6 !function=rsub_64 | 39 | +%fcvt_f_sh_d 16:6 !function=rsub_64 |
40 | + | 40 | + |
41 | +@fcvt_fixed_h .... .... . 001 .... ...... rn:5 rd:5 \ | 41 | +@fcvt_fixed_h .... .... . 001 .... ...... rn:5 rd:5 \ |
42 | + &fcvt sf=0 esz=1 shift=%fcvt_f_sh_h | 42 | + &fcvt sf=0 esz=1 shift=%fcvt_f_sh_h |
43 | +@fcvt_fixed_s .... .... . 01 ..... ...... rn:5 rd:5 \ | 43 | +@fcvt_fixed_s .... .... . 01 ..... ...... rn:5 rd:5 \ |
44 | + &fcvt sf=0 esz=2 shift=%fcvt_f_sh_s | 44 | + &fcvt sf=0 esz=2 shift=%fcvt_f_sh_s |
45 | +@fcvt_fixed_d .... .... . 1 ...... ...... rn:5 rd:5 \ | 45 | +@fcvt_fixed_d .... .... . 1 ...... ...... rn:5 rd:5 \ |
46 | + &fcvt sf=0 esz=3 shift=%fcvt_f_sh_d | 46 | + &fcvt sf=0 esz=3 shift=%fcvt_f_sh_d |
47 | + | 47 | + |
48 | +FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h | 48 | +FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h |
49 | +FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s | 49 | +FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s |
50 | +FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d | 50 | +FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d |
51 | + | 51 | + |
52 | +FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h | 52 | +FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h |
53 | +FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s | 53 | +FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s |
54 | +FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d | 54 | +FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d |
55 | + | 55 | + |
56 | # Advanced SIMD two-register miscellaneous | 56 | # Advanced SIMD two-register miscellaneous |
57 | 57 | ||
58 | SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e | 58 | SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e |
59 | -- | 59 | -- |
60 | 2.43.0 | 60 | 2.43.0 | diff view generated by jsdifflib |
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
---|---|---|---|
1 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
2 | --- | 3 | --- |
3 | target/arm/tcg/translate-a64.c | 35 ++++++++++++++++++++++++---------- | 4 | target/arm/tcg/translate-a64.c | 35 ++++++++++++++++++++++++---------- |
4 | target/arm/tcg/a64.decode | 6 ++++++ | 5 | target/arm/tcg/a64.decode | 6 ++++++ |
5 | 2 files changed, 31 insertions(+), 10 deletions(-) | 6 | 2 files changed, 31 insertions(+), 10 deletions(-) |
... | ... | diff view generated by jsdifflib |
1 | Remove disas_simd_scalar_shift_imm as these were the | 1 | Remove disas_simd_scalar_shift_imm as these were the |
---|---|---|---|
2 | last insns decoded by that function. | 2 | last insns decoded by that function. |
3 | 3 | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 5 | --- |
6 | target/arm/tcg/translate-a64.c | 47 ---------------------------------- | 6 | target/arm/tcg/translate-a64.c | 47 ---------------------------------- |
7 | target/arm/tcg/a64.decode | 8 ++++++ | 7 | target/arm/tcg/a64.decode | 8 ++++++ |
8 | 2 files changed, 8 insertions(+), 47 deletions(-) | 8 | 2 files changed, 8 insertions(+), 47 deletions(-) |
9 | 9 | ||
10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/arm/tcg/translate-a64.c | 12 | --- a/target/arm/tcg/translate-a64.c |
13 | +++ b/target/arm/tcg/translate-a64.c | 13 | +++ b/target/arm/tcg/translate-a64.c |
14 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, | 14 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, |
15 | gen_restore_rmode(tcg_rmode, tcg_fpstatus); | 15 | gen_restore_rmode(tcg_rmode, tcg_fpstatus); |
16 | } | 16 | } |
17 | 17 | ||
18 | -/* AdvSIMD scalar shift by immediate | 18 | -/* AdvSIMD scalar shift by immediate |
19 | - * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0 | 19 | - * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0 |
20 | - * +-----+---+-------------+------+------+--------+---+------+------+ | 20 | - * +-----+---+-------------+------+------+--------+---+------+------+ |
21 | - * | 0 1 | U | 1 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd | | 21 | - * | 0 1 | U | 1 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd | |
22 | - * +-----+---+-------------+------+------+--------+---+------+------+ | 22 | - * +-----+---+-------------+------+------+--------+---+------+------+ |
23 | - * | 23 | - * |
24 | - * This is the scalar version so it works on a fixed sized registers | 24 | - * This is the scalar version so it works on a fixed sized registers |
25 | - */ | 25 | - */ |
26 | -static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) | 26 | -static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn) |
27 | -{ | 27 | -{ |
28 | - int rd = extract32(insn, 0, 5); | 28 | - int rd = extract32(insn, 0, 5); |
29 | - int rn = extract32(insn, 5, 5); | 29 | - int rn = extract32(insn, 5, 5); |
30 | - int opcode = extract32(insn, 11, 5); | 30 | - int opcode = extract32(insn, 11, 5); |
31 | - int immb = extract32(insn, 16, 3); | 31 | - int immb = extract32(insn, 16, 3); |
32 | - int immh = extract32(insn, 19, 4); | 32 | - int immh = extract32(insn, 19, 4); |
33 | - bool is_u = extract32(insn, 29, 1); | 33 | - bool is_u = extract32(insn, 29, 1); |
34 | - | 34 | - |
35 | - if (immh == 0) { | 35 | - if (immh == 0) { |
36 | - unallocated_encoding(s); | 36 | - unallocated_encoding(s); |
37 | - return; | 37 | - return; |
38 | - } | 38 | - } |
39 | - | 39 | - |
40 | - switch (opcode) { | 40 | - switch (opcode) { |
41 | - case 0x1c: /* SCVTF, UCVTF */ | 41 | - case 0x1c: /* SCVTF, UCVTF */ |
42 | - handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb, | 42 | - handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb, |
43 | - opcode, rn, rd); | 43 | - opcode, rn, rd); |
44 | - break; | 44 | - break; |
45 | - default: | 45 | - default: |
46 | - case 0x00: /* SSHR / USHR */ | 46 | - case 0x00: /* SSHR / USHR */ |
47 | - case 0x02: /* SSRA / USRA */ | 47 | - case 0x02: /* SSRA / USRA */ |
48 | - case 0x04: /* SRSHR / URSHR */ | 48 | - case 0x04: /* SRSHR / URSHR */ |
49 | - case 0x06: /* SRSRA / URSRA */ | 49 | - case 0x06: /* SRSRA / URSRA */ |
50 | - case 0x08: /* SRI */ | 50 | - case 0x08: /* SRI */ |
51 | - case 0x0a: /* SHL / SLI */ | 51 | - case 0x0a: /* SHL / SLI */ |
52 | - case 0x0c: /* SQSHLU */ | 52 | - case 0x0c: /* SQSHLU */ |
53 | - case 0x0e: /* SQSHL, UQSHL */ | 53 | - case 0x0e: /* SQSHL, UQSHL */ |
54 | - case 0x10: /* SQSHRUN */ | 54 | - case 0x10: /* SQSHRUN */ |
55 | - case 0x11: /* SQRSHRUN */ | 55 | - case 0x11: /* SQRSHRUN */ |
56 | - case 0x12: /* SQSHRN, UQSHRN */ | 56 | - case 0x12: /* SQSHRN, UQSHRN */ |
57 | - case 0x13: /* SQRSHRN, UQRSHRN */ | 57 | - case 0x13: /* SQRSHRN, UQRSHRN */ |
58 | - case 0x1f: /* FCVTZS, FCVTZU */ | 58 | - case 0x1f: /* FCVTZS, FCVTZU */ |
59 | - unallocated_encoding(s); | 59 | - unallocated_encoding(s); |
60 | - break; | 60 | - break; |
61 | - } | 61 | - } |
62 | -} | 62 | -} |
63 | - | 63 | - |
64 | static void handle_2misc_64(DisasContext *s, int opcode, bool u, | 64 | static void handle_2misc_64(DisasContext *s, int opcode, bool u, |
65 | TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, | 65 | TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, |
66 | TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus) | 66 | TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus) |
67 | @@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = { | 67 | @@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = { |
68 | { 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc }, | 68 | { 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc }, |
69 | { 0x0f000400, 0x9f800400, disas_simd_shift_imm }, | 69 | { 0x0f000400, 0x9f800400, disas_simd_shift_imm }, |
70 | { 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc }, | 70 | { 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc }, |
71 | - { 0x5f000400, 0xdf800400, disas_simd_scalar_shift_imm }, | 71 | - { 0x5f000400, 0xdf800400, disas_simd_scalar_shift_imm }, |
72 | { 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 }, | 72 | { 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 }, |
73 | { 0x00000000, 0x00000000, NULL } | 73 | { 0x00000000, 0x00000000, NULL } |
74 | }; | 74 | }; |
75 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 75 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
76 | index XXXXXXX..XXXXXXX 100644 | 76 | index XXXXXXX..XXXXXXX 100644 |
77 | --- a/target/arm/tcg/a64.decode | 77 | --- a/target/arm/tcg/a64.decode |
78 | +++ b/target/arm/tcg/a64.decode | 78 | +++ b/target/arm/tcg/a64.decode |
79 | @@ -XXX,XX +XXX,XX @@ FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd | 79 | @@ -XXX,XX +XXX,XX @@ FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd |
80 | @fcvt_fixed_d .... .... . 1 ...... ...... rn:5 rd:5 \ | 80 | @fcvt_fixed_d .... .... . 1 ...... ...... rn:5 rd:5 \ |
81 | &fcvt sf=0 esz=3 shift=%fcvt_f_sh_d | 81 | &fcvt sf=0 esz=3 shift=%fcvt_f_sh_d |
82 | 82 | ||
83 | +SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_h | 83 | +SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_h |
84 | +SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_s | 84 | +SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_s |
85 | +SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_d | 85 | +SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_d |
86 | + | 86 | + |
87 | +UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_h | 87 | +UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_h |
88 | +UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_s | 88 | +UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_s |
89 | +UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_d | 89 | +UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_d |
90 | + | 90 | + |
91 | FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h | 91 | FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h |
92 | FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s | 92 | FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s |
93 | FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d | 93 | FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d |
94 | -- | 94 | -- |
95 | 2.43.0 | 95 | 2.43.0 | diff view generated by jsdifflib |
1 | Emphasize that these functions use round-to-zero mode. | 1 | Emphasize that these functions use round-to-zero mode. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/helper.h | 8 ++++---- | 6 | target/arm/helper.h | 8 ++++---- |
6 | target/arm/tcg/translate-neon.c | 8 ++++---- | 7 | target/arm/tcg/translate-neon.c | 8 ++++---- |
7 | target/arm/tcg/vec_helper.c | 8 ++++---- | 8 | target/arm/tcg/vec_helper.c | 8 ++++---- |
... | ... | diff view generated by jsdifflib |
1 | Remove handle_simd_intfp_conv and handle_simd_shift_intfp_conv | 1 | Remove handle_simd_intfp_conv and handle_simd_shift_intfp_conv |
---|---|---|---|
2 | as these were the last insns decoded by those functions. | 2 | as these were the last insns decoded by those functions. |
3 | 3 | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 5 | --- |
6 | target/arm/helper.h | 3 + | 6 | target/arm/helper.h | 3 + |
7 | target/arm/tcg/translate-a64.c | 201 ++++++--------------------------- | 7 | target/arm/tcg/translate-a64.c | 201 ++++++--------------------------- |
8 | target/arm/tcg/vec_helper.c | 7 +- | 8 | target/arm/tcg/vec_helper.c | 7 +- |
9 | target/arm/tcg/a64.decode | 22 ++++ | 9 | target/arm/tcg/a64.decode | 22 ++++ |
10 | 4 files changed, 66 insertions(+), 167 deletions(-) | 10 | 4 files changed, 66 insertions(+), 167 deletions(-) |
11 | 11 | ||
12 | diff --git a/target/arm/helper.h b/target/arm/helper.h | 12 | diff --git a/target/arm/helper.h b/target/arm/helper.h |
13 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/target/arm/helper.h | 14 | --- a/target/arm/helper.h |
15 | +++ b/target/arm/helper.h | 15 | +++ b/target/arm/helper.h |
16 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_uh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 16 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_uh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
17 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 17 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
18 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 18 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
19 | 19 | ||
20 | +DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 20 | +DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
21 | +DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 21 | +DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
22 | + | 22 | + |
23 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 23 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
24 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 24 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
25 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 25 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
26 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 26 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
27 | index XXXXXXX..XXXXXXX 100644 | 27 | index XXXXXXX..XXXXXXX 100644 |
28 | --- a/target/arm/tcg/translate-a64.c | 28 | --- a/target/arm/tcg/translate-a64.c |
29 | +++ b/target/arm/tcg/translate-a64.c | 29 | +++ b/target/arm/tcg/translate-a64.c |
30 | @@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINT64Z_v, aa64_frint, do_fp1_vector, a, | 30 | @@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINT64Z_v, aa64_frint, do_fp1_vector, a, |
31 | &f_scalar_frint64, FPROUNDING_ZERO) | 31 | &f_scalar_frint64, FPROUNDING_ZERO) |
32 | TRANS_FEAT(FRINT64X_v, aa64_frint, do_fp1_vector, a, &f_scalar_frint64, -1) | 32 | TRANS_FEAT(FRINT64X_v, aa64_frint, do_fp1_vector, a, &f_scalar_frint64, -1) |
33 | 33 | ||
34 | -/* Common vector code for handling integer to FP conversion */ | 34 | -/* Common vector code for handling integer to FP conversion */ |
35 | -static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, | 35 | -static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, |
36 | - int elements, int is_signed, | 36 | - int elements, int is_signed, |
37 | - int fracbits, int size) | 37 | - int fracbits, int size) |
38 | +static bool do_gvec_op2_fpst(DisasContext *s, MemOp esz, bool is_q, | 38 | +static bool do_gvec_op2_fpst(DisasContext *s, MemOp esz, bool is_q, |
39 | + int rd, int rn, int data, | 39 | + int rd, int rn, int data, |
40 | + gen_helper_gvec_2_ptr * const fns[3]) | 40 | + gen_helper_gvec_2_ptr * const fns[3]) |
41 | { | 41 | { |
42 | - TCGv_ptr tcg_fpst = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); | 42 | - TCGv_ptr tcg_fpst = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); |
43 | - TCGv_i32 tcg_shift = NULL; | 43 | - TCGv_i32 tcg_shift = NULL; |
44 | + int check = fp_access_check_vector_hsd(s, is_q, esz); | 44 | + int check = fp_access_check_vector_hsd(s, is_q, esz); |
45 | + TCGv_ptr fpst; | 45 | + TCGv_ptr fpst; |
46 | 46 | ||
47 | - MemOp mop = size | (is_signed ? MO_SIGN : 0); | 47 | - MemOp mop = size | (is_signed ? MO_SIGN : 0); |
48 | - int pass; | 48 | - int pass; |
49 | - | 49 | - |
50 | - if (fracbits || size == MO_64) { | 50 | - if (fracbits || size == MO_64) { |
51 | - tcg_shift = tcg_constant_i32(fracbits); | 51 | - tcg_shift = tcg_constant_i32(fracbits); |
52 | + if (check <= 0) { | 52 | + if (check <= 0) { |
53 | + return check == 0; | 53 | + return check == 0; |
54 | } | 54 | } |
55 | 55 | ||
56 | - if (size == MO_64) { | 56 | - if (size == MO_64) { |
57 | - TCGv_i64 tcg_int64 = tcg_temp_new_i64(); | 57 | - TCGv_i64 tcg_int64 = tcg_temp_new_i64(); |
58 | - TCGv_i64 tcg_double = tcg_temp_new_i64(); | 58 | - TCGv_i64 tcg_double = tcg_temp_new_i64(); |
59 | - | 59 | - |
60 | - for (pass = 0; pass < elements; pass++) { | 60 | - for (pass = 0; pass < elements; pass++) { |
61 | - read_vec_element(s, tcg_int64, rn, pass, mop); | 61 | - read_vec_element(s, tcg_int64, rn, pass, mop); |
62 | - | 62 | - |
63 | - if (is_signed) { | 63 | - if (is_signed) { |
64 | - gen_helper_vfp_sqtod(tcg_double, tcg_int64, | 64 | - gen_helper_vfp_sqtod(tcg_double, tcg_int64, |
65 | - tcg_shift, tcg_fpst); | 65 | - tcg_shift, tcg_fpst); |
66 | - } else { | 66 | - } else { |
67 | - gen_helper_vfp_uqtod(tcg_double, tcg_int64, | 67 | - gen_helper_vfp_uqtod(tcg_double, tcg_int64, |
68 | - tcg_shift, tcg_fpst); | 68 | - tcg_shift, tcg_fpst); |
69 | - } | 69 | - } |
70 | - if (elements == 1) { | 70 | - if (elements == 1) { |
71 | - write_fp_dreg(s, rd, tcg_double); | 71 | - write_fp_dreg(s, rd, tcg_double); |
72 | - } else { | 72 | - } else { |
73 | - write_vec_element(s, tcg_double, rd, pass, MO_64); | 73 | - write_vec_element(s, tcg_double, rd, pass, MO_64); |
74 | - } | 74 | - } |
75 | - } | 75 | - } |
76 | - } else { | 76 | - } else { |
77 | - TCGv_i32 tcg_int32 = tcg_temp_new_i32(); | 77 | - TCGv_i32 tcg_int32 = tcg_temp_new_i32(); |
78 | - TCGv_i32 tcg_float = tcg_temp_new_i32(); | 78 | - TCGv_i32 tcg_float = tcg_temp_new_i32(); |
79 | - | 79 | - |
80 | - for (pass = 0; pass < elements; pass++) { | 80 | - for (pass = 0; pass < elements; pass++) { |
81 | - read_vec_element_i32(s, tcg_int32, rn, pass, mop); | 81 | - read_vec_element_i32(s, tcg_int32, rn, pass, mop); |
82 | - | 82 | - |
83 | - switch (size) { | 83 | - switch (size) { |
84 | - case MO_32: | 84 | - case MO_32: |
85 | - if (fracbits) { | 85 | - if (fracbits) { |
86 | - if (is_signed) { | 86 | - if (is_signed) { |
87 | - gen_helper_vfp_sltos(tcg_float, tcg_int32, | 87 | - gen_helper_vfp_sltos(tcg_float, tcg_int32, |
88 | - tcg_shift, tcg_fpst); | 88 | - tcg_shift, tcg_fpst); |
89 | - } else { | 89 | - } else { |
90 | - gen_helper_vfp_ultos(tcg_float, tcg_int32, | 90 | - gen_helper_vfp_ultos(tcg_float, tcg_int32, |
91 | - tcg_shift, tcg_fpst); | 91 | - tcg_shift, tcg_fpst); |
92 | - } | 92 | - } |
93 | - } else { | 93 | - } else { |
94 | - if (is_signed) { | 94 | - if (is_signed) { |
95 | - gen_helper_vfp_sitos(tcg_float, tcg_int32, tcg_fpst); | 95 | - gen_helper_vfp_sitos(tcg_float, tcg_int32, tcg_fpst); |
96 | - } else { | 96 | - } else { |
97 | - gen_helper_vfp_uitos(tcg_float, tcg_int32, tcg_fpst); | 97 | - gen_helper_vfp_uitos(tcg_float, tcg_int32, tcg_fpst); |
98 | - } | 98 | - } |
99 | - } | 99 | - } |
100 | - break; | 100 | - break; |
101 | - case MO_16: | 101 | - case MO_16: |
102 | - if (fracbits) { | 102 | - if (fracbits) { |
103 | - if (is_signed) { | 103 | - if (is_signed) { |
104 | - gen_helper_vfp_sltoh(tcg_float, tcg_int32, | 104 | - gen_helper_vfp_sltoh(tcg_float, tcg_int32, |
105 | - tcg_shift, tcg_fpst); | 105 | - tcg_shift, tcg_fpst); |
106 | - } else { | 106 | - } else { |
107 | - gen_helper_vfp_ultoh(tcg_float, tcg_int32, | 107 | - gen_helper_vfp_ultoh(tcg_float, tcg_int32, |
108 | - tcg_shift, tcg_fpst); | 108 | - tcg_shift, tcg_fpst); |
109 | - } | 109 | - } |
110 | - } else { | 110 | - } else { |
111 | - if (is_signed) { | 111 | - if (is_signed) { |
112 | - gen_helper_vfp_sitoh(tcg_float, tcg_int32, tcg_fpst); | 112 | - gen_helper_vfp_sitoh(tcg_float, tcg_int32, tcg_fpst); |
113 | - } else { | 113 | - } else { |
114 | - gen_helper_vfp_uitoh(tcg_float, tcg_int32, tcg_fpst); | 114 | - gen_helper_vfp_uitoh(tcg_float, tcg_int32, tcg_fpst); |
115 | - } | 115 | - } |
116 | - } | 116 | - } |
117 | - break; | 117 | - break; |
118 | - default: | 118 | - default: |
119 | - g_assert_not_reached(); | 119 | - g_assert_not_reached(); |
120 | - } | 120 | - } |
121 | - | 121 | - |
122 | - if (elements == 1) { | 122 | - if (elements == 1) { |
123 | - write_fp_sreg(s, rd, tcg_float); | 123 | - write_fp_sreg(s, rd, tcg_float); |
124 | - } else { | 124 | - } else { |
125 | - write_vec_element_i32(s, tcg_float, rd, pass, size); | 125 | - write_vec_element_i32(s, tcg_float, rd, pass, size); |
126 | - } | 126 | - } |
127 | - } | 127 | - } |
128 | - } | 128 | - } |
129 | - | 129 | - |
130 | - clear_vec_high(s, elements << size == 16, rd); | 130 | - clear_vec_high(s, elements << size == 16, rd); |
131 | + fpst = fpstatus_ptr(esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); | 131 | + fpst = fpstatus_ptr(esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); |
132 | + tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd), | 132 | + tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd), |
133 | + vec_full_reg_offset(s, rn), fpst, | 133 | + vec_full_reg_offset(s, rn), fpst, |
134 | + is_q ? 16 : 8, vec_full_reg_size(s), | 134 | + is_q ? 16 : 8, vec_full_reg_size(s), |
135 | + data, fns[esz - 1]); | 135 | + data, fns[esz - 1]); |
136 | + return true; | 136 | + return true; |
137 | } | 137 | } |
138 | 138 | ||
139 | -/* UCVTF/SCVTF - Integer to FP conversion */ | 139 | -/* UCVTF/SCVTF - Integer to FP conversion */ |
140 | -static void handle_simd_shift_intfp_conv(DisasContext *s, bool is_scalar, | 140 | -static void handle_simd_shift_intfp_conv(DisasContext *s, bool is_scalar, |
141 | - bool is_q, bool is_u, | 141 | - bool is_q, bool is_u, |
142 | - int immh, int immb, int opcode, | 142 | - int immh, int immb, int opcode, |
143 | - int rn, int rd) | 143 | - int rn, int rd) |
144 | -{ | 144 | -{ |
145 | - int size, elements, fracbits; | 145 | - int size, elements, fracbits; |
146 | - int immhb = immh << 3 | immb; | 146 | - int immhb = immh << 3 | immb; |
147 | +static gen_helper_gvec_2_ptr * const f_scvtf_v[] = { | 147 | +static gen_helper_gvec_2_ptr * const f_scvtf_v[] = { |
148 | + gen_helper_gvec_vcvt_sh, | 148 | + gen_helper_gvec_vcvt_sh, |
149 | + gen_helper_gvec_vcvt_sf, | 149 | + gen_helper_gvec_vcvt_sf, |
150 | + gen_helper_gvec_vcvt_sd, | 150 | + gen_helper_gvec_vcvt_sd, |
151 | +}; | 151 | +}; |
152 | +TRANS(SCVTF_vi, do_gvec_op2_fpst, | 152 | +TRANS(SCVTF_vi, do_gvec_op2_fpst, |
153 | + a->esz, a->q, a->rd, a->rn, 0, f_scvtf_v) | 153 | + a->esz, a->q, a->rd, a->rn, 0, f_scvtf_v) |
154 | +TRANS(SCVTF_vf, do_gvec_op2_fpst, | 154 | +TRANS(SCVTF_vf, do_gvec_op2_fpst, |
155 | + a->esz, a->q, a->rd, a->rn, a->shift, f_scvtf_v) | 155 | + a->esz, a->q, a->rd, a->rn, a->shift, f_scvtf_v) |
156 | 156 | ||
157 | - if (immh & 8) { | 157 | - if (immh & 8) { |
158 | - size = MO_64; | 158 | - size = MO_64; |
159 | - if (!is_scalar && !is_q) { | 159 | - if (!is_scalar && !is_q) { |
160 | - unallocated_encoding(s); | 160 | - unallocated_encoding(s); |
161 | - return; | 161 | - return; |
162 | - } | 162 | - } |
163 | - } else if (immh & 4) { | 163 | - } else if (immh & 4) { |
164 | - size = MO_32; | 164 | - size = MO_32; |
165 | - } else if (immh & 2) { | 165 | - } else if (immh & 2) { |
166 | - size = MO_16; | 166 | - size = MO_16; |
167 | - if (!dc_isar_feature(aa64_fp16, s)) { | 167 | - if (!dc_isar_feature(aa64_fp16, s)) { |
168 | - unallocated_encoding(s); | 168 | - unallocated_encoding(s); |
169 | - return; | 169 | - return; |
170 | - } | 170 | - } |
171 | - } else { | 171 | - } else { |
172 | - /* immh == 0 would be a failure of the decode logic */ | 172 | - /* immh == 0 would be a failure of the decode logic */ |
173 | - g_assert(immh == 1); | 173 | - g_assert(immh == 1); |
174 | - unallocated_encoding(s); | 174 | - unallocated_encoding(s); |
175 | - return; | 175 | - return; |
176 | - } | 176 | - } |
177 | - | 177 | - |
178 | - if (is_scalar) { | 178 | - if (is_scalar) { |
179 | - elements = 1; | 179 | - elements = 1; |
180 | - } else { | 180 | - } else { |
181 | - elements = (8 << is_q) >> size; | 181 | - elements = (8 << is_q) >> size; |
182 | - } | 182 | - } |
183 | - fracbits = (16 << size) - immhb; | 183 | - fracbits = (16 << size) - immhb; |
184 | - | 184 | - |
185 | - if (!fp_access_check(s)) { | 185 | - if (!fp_access_check(s)) { |
186 | - return; | 186 | - return; |
187 | - } | 187 | - } |
188 | - | 188 | - |
189 | - handle_simd_intfp_conv(s, rd, rn, elements, !is_u, fracbits, size); | 189 | - handle_simd_intfp_conv(s, rd, rn, elements, !is_u, fracbits, size); |
190 | -} | 190 | -} |
191 | +static gen_helper_gvec_2_ptr * const f_ucvtf_v[] = { | 191 | +static gen_helper_gvec_2_ptr * const f_ucvtf_v[] = { |
192 | + gen_helper_gvec_vcvt_uh, | 192 | + gen_helper_gvec_vcvt_uh, |
193 | + gen_helper_gvec_vcvt_uf, | 193 | + gen_helper_gvec_vcvt_uf, |
194 | + gen_helper_gvec_vcvt_ud, | 194 | + gen_helper_gvec_vcvt_ud, |
195 | +}; | 195 | +}; |
196 | +TRANS(UCVTF_vi, do_gvec_op2_fpst, | 196 | +TRANS(UCVTF_vi, do_gvec_op2_fpst, |
197 | + a->esz, a->q, a->rd, a->rn, 0, f_ucvtf_v) | 197 | + a->esz, a->q, a->rd, a->rn, 0, f_ucvtf_v) |
198 | +TRANS(UCVTF_vf, do_gvec_op2_fpst, | 198 | +TRANS(UCVTF_vf, do_gvec_op2_fpst, |
199 | + a->esz, a->q, a->rd, a->rn, a->shift, f_ucvtf_v) | 199 | + a->esz, a->q, a->rd, a->rn, a->shift, f_ucvtf_v) |
200 | 200 | ||
201 | /* FCVTZS, FVCVTZU - FP to fixedpoint conversion */ | 201 | /* FCVTZS, FVCVTZU - FP to fixedpoint conversion */ |
202 | static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, | 202 | static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, |
203 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) | 203 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) |
204 | } | 204 | } |
205 | 205 | ||
206 | switch (opcode) { | 206 | switch (opcode) { |
207 | - case 0x1c: /* SCVTF / UCVTF */ | 207 | - case 0x1c: /* SCVTF / UCVTF */ |
208 | - handle_simd_shift_intfp_conv(s, false, is_q, is_u, immh, immb, | 208 | - handle_simd_shift_intfp_conv(s, false, is_q, is_u, immh, immb, |
209 | - opcode, rn, rd); | 209 | - opcode, rn, rd); |
210 | - break; | 210 | - break; |
211 | case 0x1f: /* FCVTZS/ FCVTZU */ | 211 | case 0x1f: /* FCVTZS/ FCVTZU */ |
212 | handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd); | 212 | handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd); |
213 | return; | 213 | return; |
214 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) | 214 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) |
215 | case 0x12: /* SQSHRN / UQSHRN */ | 215 | case 0x12: /* SQSHRN / UQSHRN */ |
216 | case 0x13: /* SQRSHRN / UQRSHRN */ | 216 | case 0x13: /* SQRSHRN / UQRSHRN */ |
217 | case 0x14: /* SSHLL / USHLL */ | 217 | case 0x14: /* SSHLL / USHLL */ |
218 | + case 0x1c: /* SCVTF / UCVTF */ | 218 | + case 0x1c: /* SCVTF / UCVTF */ |
219 | unallocated_encoding(s); | 219 | unallocated_encoding(s); |
220 | return; | 220 | return; |
221 | } | 221 | } |
222 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 222 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
223 | opcode |= (extract32(size, 1, 1) << 5) | (u << 6); | 223 | opcode |= (extract32(size, 1, 1) << 5) | (u << 6); |
224 | size = is_double ? 3 : 2; | 224 | size = is_double ? 3 : 2; |
225 | switch (opcode) { | 225 | switch (opcode) { |
226 | - case 0x1d: /* SCVTF */ | 226 | - case 0x1d: /* SCVTF */ |
227 | - case 0x5d: /* UCVTF */ | 227 | - case 0x5d: /* UCVTF */ |
228 | - { | 228 | - { |
229 | - bool is_signed = (opcode == 0x1d) ? true : false; | 229 | - bool is_signed = (opcode == 0x1d) ? true : false; |
230 | - int elements = is_double ? 2 : is_q ? 4 : 2; | 230 | - int elements = is_double ? 2 : is_q ? 4 : 2; |
231 | - if (is_double && !is_q) { | 231 | - if (is_double && !is_q) { |
232 | - unallocated_encoding(s); | 232 | - unallocated_encoding(s); |
233 | - return; | 233 | - return; |
234 | - } | 234 | - } |
235 | - if (!fp_access_check(s)) { | 235 | - if (!fp_access_check(s)) { |
236 | - return; | 236 | - return; |
237 | - } | 237 | - } |
238 | - handle_simd_intfp_conv(s, rd, rn, elements, is_signed, 0, size); | 238 | - handle_simd_intfp_conv(s, rd, rn, elements, is_signed, 0, size); |
239 | - return; | 239 | - return; |
240 | - } | 240 | - } |
241 | case 0x2c: /* FCMGT (zero) */ | 241 | case 0x2c: /* FCMGT (zero) */ |
242 | case 0x2d: /* FCMEQ (zero) */ | 242 | case 0x2d: /* FCMEQ (zero) */ |
243 | case 0x2e: /* FCMLT (zero) */ | 243 | case 0x2e: /* FCMLT (zero) */ |
244 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 244 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
245 | case 0x1f: /* FRINT64Z */ | 245 | case 0x1f: /* FRINT64Z */ |
246 | case 0x5e: /* FRINT32X */ | 246 | case 0x5e: /* FRINT32X */ |
247 | case 0x5f: /* FRINT64X */ | 247 | case 0x5f: /* FRINT64X */ |
248 | + case 0x1d: /* SCVTF */ | 248 | + case 0x1d: /* SCVTF */ |
249 | + case 0x5d: /* UCVTF */ | 249 | + case 0x5d: /* UCVTF */ |
250 | unallocated_encoding(s); | 250 | unallocated_encoding(s); |
251 | return; | 251 | return; |
252 | } | 252 | } |
253 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 253 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
254 | fpop = deposit32(fpop, 6, 1, u); | 254 | fpop = deposit32(fpop, 6, 1, u); |
255 | 255 | ||
256 | switch (fpop) { | 256 | switch (fpop) { |
257 | - case 0x1d: /* SCVTF */ | 257 | - case 0x1d: /* SCVTF */ |
258 | - case 0x5d: /* UCVTF */ | 258 | - case 0x5d: /* UCVTF */ |
259 | - { | 259 | - { |
260 | - int elements; | 260 | - int elements; |
261 | - | 261 | - |
262 | - if (is_scalar) { | 262 | - if (is_scalar) { |
263 | - elements = 1; | 263 | - elements = 1; |
264 | - } else { | 264 | - } else { |
265 | - elements = (is_q ? 8 : 4); | 265 | - elements = (is_q ? 8 : 4); |
266 | - } | 266 | - } |
267 | - | 267 | - |
268 | - if (!fp_access_check(s)) { | 268 | - if (!fp_access_check(s)) { |
269 | - return; | 269 | - return; |
270 | - } | 270 | - } |
271 | - handle_simd_intfp_conv(s, rd, rn, elements, !u, 0, MO_16); | 271 | - handle_simd_intfp_conv(s, rd, rn, elements, !u, 0, MO_16); |
272 | - return; | 272 | - return; |
273 | - } | 273 | - } |
274 | - break; | 274 | - break; |
275 | case 0x2c: /* FCMGT (zero) */ | 275 | case 0x2c: /* FCMGT (zero) */ |
276 | case 0x2d: /* FCMEQ (zero) */ | 276 | case 0x2d: /* FCMEQ (zero) */ |
277 | case 0x2e: /* FCMLT (zero) */ | 277 | case 0x2e: /* FCMLT (zero) */ |
278 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 278 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
279 | case 0x58: /* FRINTA */ | 279 | case 0x58: /* FRINTA */ |
280 | case 0x59: /* FRINTX */ | 280 | case 0x59: /* FRINTX */ |
281 | case 0x79: /* FRINTI */ | 281 | case 0x79: /* FRINTI */ |
282 | + case 0x1d: /* SCVTF */ | 282 | + case 0x1d: /* SCVTF */ |
283 | + case 0x5d: /* UCVTF */ | 283 | + case 0x5d: /* UCVTF */ |
284 | unallocated_encoding(s); | 284 | unallocated_encoding(s); |
285 | return; | 285 | return; |
286 | } | 286 | } |
287 | diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c | 287 | diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c |
288 | index XXXXXXX..XXXXXXX 100644 | 288 | index XXXXXXX..XXXXXXX 100644 |
289 | --- a/target/arm/tcg/vec_helper.c | 289 | --- a/target/arm/tcg/vec_helper.c |
290 | +++ b/target/arm/tcg/vec_helper.c | 290 | +++ b/target/arm/tcg/vec_helper.c |
291 | @@ -XXX,XX +XXX,XX @@ DO_3OP_PAIR(gvec_uminp_s, MIN, uint32_t, H4) | 291 | @@ -XXX,XX +XXX,XX @@ DO_3OP_PAIR(gvec_uminp_s, MIN, uint32_t, H4) |
292 | clear_tail(d, oprsz, simd_maxsz(desc)); \ | 292 | clear_tail(d, oprsz, simd_maxsz(desc)); \ |
293 | } | 293 | } |
294 | 294 | ||
295 | +DO_VCVT_FIXED(gvec_vcvt_sd, helper_vfp_sqtod, uint64_t) | 295 | +DO_VCVT_FIXED(gvec_vcvt_sd, helper_vfp_sqtod, uint64_t) |
296 | +DO_VCVT_FIXED(gvec_vcvt_ud, helper_vfp_uqtod, uint64_t) | 296 | +DO_VCVT_FIXED(gvec_vcvt_ud, helper_vfp_uqtod, uint64_t) |
297 | DO_VCVT_FIXED(gvec_vcvt_sf, helper_vfp_sltos, uint32_t) | 297 | DO_VCVT_FIXED(gvec_vcvt_sf, helper_vfp_sltos, uint32_t) |
298 | DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t) | 298 | DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t) |
299 | -DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t) | 299 | -DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t) |
300 | -DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t) | 300 | -DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t) |
301 | DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t) | 301 | DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t) |
302 | DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t) | 302 | DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t) |
303 | + | 303 | + |
304 | +DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t) | 304 | +DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t) |
305 | +DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t) | 305 | +DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t) |
306 | DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t) | 306 | DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t) |
307 | DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t) | 307 | DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t) |
308 | 308 | ||
309 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 309 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
310 | index XXXXXXX..XXXXXXX 100644 | 310 | index XXXXXXX..XXXXXXX 100644 |
311 | --- a/target/arm/tcg/a64.decode | 311 | --- a/target/arm/tcg/a64.decode |
312 | +++ b/target/arm/tcg/a64.decode | 312 | +++ b/target/arm/tcg/a64.decode |
313 | @@ -XXX,XX +XXX,XX @@ FRINT32Z_v 0.00 1110 0.1 00001 11101 0 ..... ..... @qrr_sd | 313 | @@ -XXX,XX +XXX,XX @@ FRINT32Z_v 0.00 1110 0.1 00001 11101 0 ..... ..... @qrr_sd |
314 | FRINT32X_v 0.10 1110 0.1 00001 11101 0 ..... ..... @qrr_sd | 314 | FRINT32X_v 0.10 1110 0.1 00001 11101 0 ..... ..... @qrr_sd |
315 | FRINT64Z_v 0.00 1110 0.1 00001 11111 0 ..... ..... @qrr_sd | 315 | FRINT64Z_v 0.00 1110 0.1 00001 11111 0 ..... ..... @qrr_sd |
316 | FRINT64X_v 0.10 1110 0.1 00001 11111 0 ..... ..... @qrr_sd | 316 | FRINT64X_v 0.10 1110 0.1 00001 11111 0 ..... ..... @qrr_sd |
317 | + | 317 | + |
318 | +SCVTF_vi 0.00 1110 011 11001 11011 0 ..... ..... @qrr_h | 318 | +SCVTF_vi 0.00 1110 011 11001 11011 0 ..... ..... @qrr_h |
319 | +SCVTF_vi 0.00 1110 0.1 00001 11011 0 ..... ..... @qrr_sd | 319 | +SCVTF_vi 0.00 1110 0.1 00001 11011 0 ..... ..... @qrr_sd |
320 | + | 320 | + |
321 | +UCVTF_vi 0.10 1110 011 11001 11011 0 ..... ..... @qrr_h | 321 | +UCVTF_vi 0.10 1110 011 11001 11011 0 ..... ..... @qrr_h |
322 | +UCVTF_vi 0.10 1110 0.1 00001 11011 0 ..... ..... @qrr_sd | 322 | +UCVTF_vi 0.10 1110 0.1 00001 11011 0 ..... ..... @qrr_sd |
323 | + | 323 | + |
324 | +&fcvt_q rd rn esz q shift | 324 | +&fcvt_q rd rn esz q shift |
325 | +@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \ | 325 | +@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \ |
326 | + &fcvt_q esz=1 shift=%fcvt_f_sh_h | 326 | + &fcvt_q esz=1 shift=%fcvt_f_sh_h |
327 | +@fcvtq_s . q:1 . ...... 01 ..... ...... rn:5 rd:5 \ | 327 | +@fcvtq_s . q:1 . ...... 01 ..... ...... rn:5 rd:5 \ |
328 | + &fcvt_q esz=2 shift=%fcvt_f_sh_s | 328 | + &fcvt_q esz=2 shift=%fcvt_f_sh_s |
329 | +@fcvtq_d . q:1 . ...... 1 ...... ...... rn:5 rd:5 \ | 329 | +@fcvtq_d . q:1 . ...... 1 ...... ...... rn:5 rd:5 \ |
330 | + &fcvt_q esz=3 shift=%fcvt_f_sh_d | 330 | + &fcvt_q esz=3 shift=%fcvt_f_sh_d |
331 | + | 331 | + |
332 | +SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_h | 332 | +SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_h |
333 | +SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_s | 333 | +SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_s |
334 | +SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_d | 334 | +SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_d |
335 | + | 335 | + |
336 | +UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_h | 336 | +UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_h |
337 | +UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_s | 337 | +UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_s |
338 | +UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_d | 338 | +UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_d |
339 | -- | 339 | -- |
340 | 2.43.0 | 340 | 2.43.0 | diff view generated by jsdifflib |
1 | Remove handle_simd_shift_fpint_conv and disas_simd_shift_imm | 1 | Remove handle_simd_shift_fpint_conv and disas_simd_shift_imm |
---|---|---|---|
2 | as these were the last insns decoded by those functions. | 2 | as these were the last insns decoded by those functions. |
3 | 3 | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 5 | --- |
6 | target/arm/helper.h | 4 + | 6 | target/arm/helper.h | 4 + |
7 | target/arm/tcg/translate-a64.c | 160 +++------------------------------ | 7 | target/arm/tcg/translate-a64.c | 160 +++------------------------------ |
8 | target/arm/tcg/vec_helper.c | 2 + | 8 | target/arm/tcg/vec_helper.c | 2 + |
9 | target/arm/vfp_helper.c | 4 + | 9 | target/arm/vfp_helper.c | 4 + |
10 | target/arm/tcg/a64.decode | 8 ++ | 10 | target/arm/tcg/a64.decode | 8 ++ |
11 | 5 files changed, 32 insertions(+), 146 deletions(-) | 11 | 5 files changed, 32 insertions(+), 146 deletions(-) |
12 | 12 | ||
13 | diff --git a/target/arm/helper.h b/target/arm/helper.h | 13 | diff --git a/target/arm/helper.h b/target/arm/helper.h |
14 | index XXXXXXX..XXXXXXX 100644 | 14 | index XXXXXXX..XXXXXXX 100644 |
15 | --- a/target/arm/helper.h | 15 | --- a/target/arm/helper.h |
16 | +++ b/target/arm/helper.h | 16 | +++ b/target/arm/helper.h |
17 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, ptr) | 17 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, ptr) |
18 | DEF_HELPER_3(vfp_touls_round_to_zero, i32, f32, i32, ptr) | 18 | DEF_HELPER_3(vfp_touls_round_to_zero, i32, f32, i32, ptr) |
19 | DEF_HELPER_3(vfp_toshd_round_to_zero, i64, f64, i32, ptr) | 19 | DEF_HELPER_3(vfp_toshd_round_to_zero, i64, f64, i32, ptr) |
20 | DEF_HELPER_3(vfp_tosld_round_to_zero, i64, f64, i32, ptr) | 20 | DEF_HELPER_3(vfp_tosld_round_to_zero, i64, f64, i32, ptr) |
21 | +DEF_HELPER_3(vfp_tosqd_round_to_zero, i64, f64, i32, ptr) | 21 | +DEF_HELPER_3(vfp_tosqd_round_to_zero, i64, f64, i32, ptr) |
22 | DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr) | 22 | DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr) |
23 | DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr) | 23 | DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr) |
24 | +DEF_HELPER_3(vfp_touqd_round_to_zero, i64, f64, i32, ptr) | 24 | +DEF_HELPER_3(vfp_touqd_round_to_zero, i64, f64, i32, ptr) |
25 | DEF_HELPER_3(vfp_touhh, i32, f16, i32, ptr) | 25 | DEF_HELPER_3(vfp_touhh, i32, f16, i32, ptr) |
26 | DEF_HELPER_3(vfp_toshh, i32, f16, i32, ptr) | 26 | DEF_HELPER_3(vfp_toshh, i32, f16, i32, ptr) |
27 | DEF_HELPER_3(vfp_toulh, i32, f16, i32, ptr) | 27 | DEF_HELPER_3(vfp_toulh, i32, f16, i32, ptr) |
28 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 28 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
29 | 29 | ||
30 | DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 30 | DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
31 | DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 31 | DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
32 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 32 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
33 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 33 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
34 | 34 | ||
35 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 35 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
36 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 36 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
37 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 37 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
38 | index XXXXXXX..XXXXXXX 100644 | 38 | index XXXXXXX..XXXXXXX 100644 |
39 | --- a/target/arm/tcg/translate-a64.c | 39 | --- a/target/arm/tcg/translate-a64.c |
40 | +++ b/target/arm/tcg/translate-a64.c | 40 | +++ b/target/arm/tcg/translate-a64.c |
41 | @@ -XXX,XX +XXX,XX @@ TRANS(UCVTF_vi, do_gvec_op2_fpst, | 41 | @@ -XXX,XX +XXX,XX @@ TRANS(UCVTF_vi, do_gvec_op2_fpst, |
42 | TRANS(UCVTF_vf, do_gvec_op2_fpst, | 42 | TRANS(UCVTF_vf, do_gvec_op2_fpst, |
43 | a->esz, a->q, a->rd, a->rn, a->shift, f_ucvtf_v) | 43 | a->esz, a->q, a->rd, a->rn, a->shift, f_ucvtf_v) |
44 | 44 | ||
45 | -/* FCVTZS, FVCVTZU - FP to fixedpoint conversion */ | 45 | -/* FCVTZS, FVCVTZU - FP to fixedpoint conversion */ |
46 | -static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, | 46 | -static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, |
47 | - bool is_q, bool is_u, | 47 | - bool is_q, bool is_u, |
48 | - int immh, int immb, int rn, int rd) | 48 | - int immh, int immb, int rn, int rd) |
49 | -{ | 49 | -{ |
50 | - int immhb = immh << 3 | immb; | 50 | - int immhb = immh << 3 | immb; |
51 | - int pass, size, fracbits; | 51 | - int pass, size, fracbits; |
52 | - TCGv_ptr tcg_fpstatus; | 52 | - TCGv_ptr tcg_fpstatus; |
53 | - TCGv_i32 tcg_rmode, tcg_shift; | 53 | - TCGv_i32 tcg_rmode, tcg_shift; |
54 | +static gen_helper_gvec_2_ptr * const f_fcvtzs_vf[] = { | 54 | +static gen_helper_gvec_2_ptr * const f_fcvtzs_vf[] = { |
55 | + gen_helper_gvec_vcvt_rz_hs, | 55 | + gen_helper_gvec_vcvt_rz_hs, |
56 | + gen_helper_gvec_vcvt_rz_fs, | 56 | + gen_helper_gvec_vcvt_rz_fs, |
57 | + gen_helper_gvec_vcvt_rz_ds, | 57 | + gen_helper_gvec_vcvt_rz_ds, |
58 | +}; | 58 | +}; |
59 | +TRANS(FCVTZS_vf, do_gvec_op2_fpst, | 59 | +TRANS(FCVTZS_vf, do_gvec_op2_fpst, |
60 | + a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzs_vf) | 60 | + a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzs_vf) |
61 | 61 | ||
62 | - if (immh & 0x8) { | 62 | - if (immh & 0x8) { |
63 | - size = MO_64; | 63 | - size = MO_64; |
64 | - if (!is_scalar && !is_q) { | 64 | - if (!is_scalar && !is_q) { |
65 | - unallocated_encoding(s); | 65 | - unallocated_encoding(s); |
66 | - return; | 66 | - return; |
67 | - } | 67 | - } |
68 | - } else if (immh & 0x4) { | 68 | - } else if (immh & 0x4) { |
69 | - size = MO_32; | 69 | - size = MO_32; |
70 | - } else if (immh & 0x2) { | 70 | - } else if (immh & 0x2) { |
71 | - size = MO_16; | 71 | - size = MO_16; |
72 | - if (!dc_isar_feature(aa64_fp16, s)) { | 72 | - if (!dc_isar_feature(aa64_fp16, s)) { |
73 | - unallocated_encoding(s); | 73 | - unallocated_encoding(s); |
74 | - return; | 74 | - return; |
75 | - } | 75 | - } |
76 | - } else { | 76 | - } else { |
77 | - /* Should have split out AdvSIMD modified immediate earlier. */ | 77 | - /* Should have split out AdvSIMD modified immediate earlier. */ |
78 | - assert(immh == 1); | 78 | - assert(immh == 1); |
79 | - unallocated_encoding(s); | 79 | - unallocated_encoding(s); |
80 | - return; | 80 | - return; |
81 | - } | 81 | - } |
82 | - | 82 | - |
83 | - if (!fp_access_check(s)) { | 83 | - if (!fp_access_check(s)) { |
84 | - return; | 84 | - return; |
85 | - } | 85 | - } |
86 | - | 86 | - |
87 | - assert(!(is_scalar && is_q)); | 87 | - assert(!(is_scalar && is_q)); |
88 | - | 88 | - |
89 | - tcg_fpstatus = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); | 89 | - tcg_fpstatus = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); |
90 | - tcg_rmode = gen_set_rmode(FPROUNDING_ZERO, tcg_fpstatus); | 90 | - tcg_rmode = gen_set_rmode(FPROUNDING_ZERO, tcg_fpstatus); |
91 | - fracbits = (16 << size) - immhb; | 91 | - fracbits = (16 << size) - immhb; |
92 | - tcg_shift = tcg_constant_i32(fracbits); | 92 | - tcg_shift = tcg_constant_i32(fracbits); |
93 | - | 93 | - |
94 | - if (size == MO_64) { | 94 | - if (size == MO_64) { |
95 | - int maxpass = is_scalar ? 1 : 2; | 95 | - int maxpass = is_scalar ? 1 : 2; |
96 | - | 96 | - |
97 | - for (pass = 0; pass < maxpass; pass++) { | 97 | - for (pass = 0; pass < maxpass; pass++) { |
98 | - TCGv_i64 tcg_op = tcg_temp_new_i64(); | 98 | - TCGv_i64 tcg_op = tcg_temp_new_i64(); |
99 | - | 99 | - |
100 | - read_vec_element(s, tcg_op, rn, pass, MO_64); | 100 | - read_vec_element(s, tcg_op, rn, pass, MO_64); |
101 | - if (is_u) { | 101 | - if (is_u) { |
102 | - gen_helper_vfp_touqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); | 102 | - gen_helper_vfp_touqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); |
103 | - } else { | 103 | - } else { |
104 | - gen_helper_vfp_tosqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); | 104 | - gen_helper_vfp_tosqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); |
105 | - } | 105 | - } |
106 | - write_vec_element(s, tcg_op, rd, pass, MO_64); | 106 | - write_vec_element(s, tcg_op, rd, pass, MO_64); |
107 | - } | 107 | - } |
108 | - clear_vec_high(s, is_q, rd); | 108 | - clear_vec_high(s, is_q, rd); |
109 | - } else { | 109 | - } else { |
110 | - void (*fn)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr); | 110 | - void (*fn)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr); |
111 | - int maxpass = is_scalar ? 1 : ((8 << is_q) >> size); | 111 | - int maxpass = is_scalar ? 1 : ((8 << is_q) >> size); |
112 | - | 112 | - |
113 | - switch (size) { | 113 | - switch (size) { |
114 | - case MO_16: | 114 | - case MO_16: |
115 | - if (is_u) { | 115 | - if (is_u) { |
116 | - fn = gen_helper_vfp_touhh; | 116 | - fn = gen_helper_vfp_touhh; |
117 | - } else { | 117 | - } else { |
118 | - fn = gen_helper_vfp_toshh; | 118 | - fn = gen_helper_vfp_toshh; |
119 | - } | 119 | - } |
120 | - break; | 120 | - break; |
121 | - case MO_32: | 121 | - case MO_32: |
122 | - if (is_u) { | 122 | - if (is_u) { |
123 | - fn = gen_helper_vfp_touls; | 123 | - fn = gen_helper_vfp_touls; |
124 | - } else { | 124 | - } else { |
125 | - fn = gen_helper_vfp_tosls; | 125 | - fn = gen_helper_vfp_tosls; |
126 | - } | 126 | - } |
127 | - break; | 127 | - break; |
128 | - default: | 128 | - default: |
129 | - g_assert_not_reached(); | 129 | - g_assert_not_reached(); |
130 | - } | 130 | - } |
131 | - | 131 | - |
132 | - for (pass = 0; pass < maxpass; pass++) { | 132 | - for (pass = 0; pass < maxpass; pass++) { |
133 | - TCGv_i32 tcg_op = tcg_temp_new_i32(); | 133 | - TCGv_i32 tcg_op = tcg_temp_new_i32(); |
134 | - | 134 | - |
135 | - read_vec_element_i32(s, tcg_op, rn, pass, size); | 135 | - read_vec_element_i32(s, tcg_op, rn, pass, size); |
136 | - fn(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); | 136 | - fn(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); |
137 | - if (is_scalar) { | 137 | - if (is_scalar) { |
138 | - if (size == MO_16 && !is_u) { | 138 | - if (size == MO_16 && !is_u) { |
139 | - tcg_gen_ext16u_i32(tcg_op, tcg_op); | 139 | - tcg_gen_ext16u_i32(tcg_op, tcg_op); |
140 | - } | 140 | - } |
141 | - write_fp_sreg(s, rd, tcg_op); | 141 | - write_fp_sreg(s, rd, tcg_op); |
142 | - } else { | 142 | - } else { |
143 | - write_vec_element_i32(s, tcg_op, rd, pass, size); | 143 | - write_vec_element_i32(s, tcg_op, rd, pass, size); |
144 | - } | 144 | - } |
145 | - } | 145 | - } |
146 | - if (!is_scalar) { | 146 | - if (!is_scalar) { |
147 | - clear_vec_high(s, is_q, rd); | 147 | - clear_vec_high(s, is_q, rd); |
148 | - } | 148 | - } |
149 | - } | 149 | - } |
150 | - | 150 | - |
151 | - gen_restore_rmode(tcg_rmode, tcg_fpstatus); | 151 | - gen_restore_rmode(tcg_rmode, tcg_fpstatus); |
152 | -} | 152 | -} |
153 | +static gen_helper_gvec_2_ptr * const f_fcvtzu_vf[] = { | 153 | +static gen_helper_gvec_2_ptr * const f_fcvtzu_vf[] = { |
154 | + gen_helper_gvec_vcvt_rz_hu, | 154 | + gen_helper_gvec_vcvt_rz_hu, |
155 | + gen_helper_gvec_vcvt_rz_fu, | 155 | + gen_helper_gvec_vcvt_rz_fu, |
156 | + gen_helper_gvec_vcvt_rz_du, | 156 | + gen_helper_gvec_vcvt_rz_du, |
157 | +}; | 157 | +}; |
158 | +TRANS(FCVTZU_vf, do_gvec_op2_fpst, | 158 | +TRANS(FCVTZU_vf, do_gvec_op2_fpst, |
159 | + a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzu_vf) | 159 | + a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzu_vf) |
160 | 160 | ||
161 | static void handle_2misc_64(DisasContext *s, int opcode, bool u, | 161 | static void handle_2misc_64(DisasContext *s, int opcode, bool u, |
162 | TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, | 162 | TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, |
163 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn) | 163 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn) |
164 | g_assert_not_reached(); | 164 | g_assert_not_reached(); |
165 | } | 165 | } |
166 | 166 | ||
167 | -/* AdvSIMD shift by immediate | 167 | -/* AdvSIMD shift by immediate |
168 | - * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0 | 168 | - * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0 |
169 | - * +---+---+---+-------------+------+------+--------+---+------+------+ | 169 | - * +---+---+---+-------------+------+------+--------+---+------+------+ |
170 | - * | 0 | Q | U | 0 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd | | 170 | - * | 0 | Q | U | 0 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd | |
171 | - * +---+---+---+-------------+------+------+--------+---+------+------+ | 171 | - * +---+---+---+-------------+------+------+--------+---+------+------+ |
172 | - */ | 172 | - */ |
173 | -static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) | 173 | -static void disas_simd_shift_imm(DisasContext *s, uint32_t insn) |
174 | -{ | 174 | -{ |
175 | - int rd = extract32(insn, 0, 5); | 175 | - int rd = extract32(insn, 0, 5); |
176 | - int rn = extract32(insn, 5, 5); | 176 | - int rn = extract32(insn, 5, 5); |
177 | - int opcode = extract32(insn, 11, 5); | 177 | - int opcode = extract32(insn, 11, 5); |
178 | - int immb = extract32(insn, 16, 3); | 178 | - int immb = extract32(insn, 16, 3); |
179 | - int immh = extract32(insn, 19, 4); | 179 | - int immh = extract32(insn, 19, 4); |
180 | - bool is_u = extract32(insn, 29, 1); | 180 | - bool is_u = extract32(insn, 29, 1); |
181 | - bool is_q = extract32(insn, 30, 1); | 181 | - bool is_q = extract32(insn, 30, 1); |
182 | - | 182 | - |
183 | - if (immh == 0) { | 183 | - if (immh == 0) { |
184 | - unallocated_encoding(s); | 184 | - unallocated_encoding(s); |
185 | - return; | 185 | - return; |
186 | - } | 186 | - } |
187 | - | 187 | - |
188 | - switch (opcode) { | 188 | - switch (opcode) { |
189 | - case 0x1f: /* FCVTZS/ FCVTZU */ | 189 | - case 0x1f: /* FCVTZS/ FCVTZU */ |
190 | - handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd); | 190 | - handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd); |
191 | - return; | 191 | - return; |
192 | - default: | 192 | - default: |
193 | - case 0x00: /* SSHR / USHR */ | 193 | - case 0x00: /* SSHR / USHR */ |
194 | - case 0x02: /* SSRA / USRA (accumulate) */ | 194 | - case 0x02: /* SSRA / USRA (accumulate) */ |
195 | - case 0x04: /* SRSHR / URSHR (rounding) */ | 195 | - case 0x04: /* SRSHR / URSHR (rounding) */ |
196 | - case 0x06: /* SRSRA / URSRA (accum + rounding) */ | 196 | - case 0x06: /* SRSRA / URSRA (accum + rounding) */ |
197 | - case 0x08: /* SRI */ | 197 | - case 0x08: /* SRI */ |
198 | - case 0x0a: /* SHL / SLI */ | 198 | - case 0x0a: /* SHL / SLI */ |
199 | - case 0x0c: /* SQSHLU */ | 199 | - case 0x0c: /* SQSHLU */ |
200 | - case 0x0e: /* SQSHL, UQSHL */ | 200 | - case 0x0e: /* SQSHL, UQSHL */ |
201 | - case 0x10: /* SHRN / SQSHRUN */ | 201 | - case 0x10: /* SHRN / SQSHRUN */ |
202 | - case 0x11: /* RSHRN / SQRSHRUN */ | 202 | - case 0x11: /* RSHRN / SQRSHRUN */ |
203 | - case 0x12: /* SQSHRN / UQSHRN */ | 203 | - case 0x12: /* SQSHRN / UQSHRN */ |
204 | - case 0x13: /* SQRSHRN / UQRSHRN */ | 204 | - case 0x13: /* SQRSHRN / UQRSHRN */ |
205 | - case 0x14: /* SSHLL / USHLL */ | 205 | - case 0x14: /* SSHLL / USHLL */ |
206 | - case 0x1c: /* SCVTF / UCVTF */ | 206 | - case 0x1c: /* SCVTF / UCVTF */ |
207 | - unallocated_encoding(s); | 207 | - unallocated_encoding(s); |
208 | - return; | 208 | - return; |
209 | - } | 209 | - } |
210 | -} | 210 | -} |
211 | - | 211 | - |
212 | static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, | 212 | static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, |
213 | int size, int rn, int rd) | 213 | int size, int rn, int rd) |
214 | { | 214 | { |
215 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 215 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
216 | static const AArch64DecodeTable data_proc_simd[] = { | 216 | static const AArch64DecodeTable data_proc_simd[] = { |
217 | /* pattern , mask , fn */ | 217 | /* pattern , mask , fn */ |
218 | { 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc }, | 218 | { 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc }, |
219 | - { 0x0f000400, 0x9f800400, disas_simd_shift_imm }, | 219 | - { 0x0f000400, 0x9f800400, disas_simd_shift_imm }, |
220 | { 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc }, | 220 | { 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc }, |
221 | { 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 }, | 221 | { 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 }, |
222 | { 0x00000000, 0x00000000, NULL } | 222 | { 0x00000000, 0x00000000, NULL } |
223 | diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c | 223 | diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c |
224 | index XXXXXXX..XXXXXXX 100644 | 224 | index XXXXXXX..XXXXXXX 100644 |
225 | --- a/target/arm/tcg/vec_helper.c | 225 | --- a/target/arm/tcg/vec_helper.c |
226 | +++ b/target/arm/tcg/vec_helper.c | 226 | +++ b/target/arm/tcg/vec_helper.c |
227 | @@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t) | 227 | @@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t) |
228 | DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t) | 228 | DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t) |
229 | DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t) | 229 | DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t) |
230 | 230 | ||
231 | +DO_VCVT_FIXED(gvec_vcvt_rz_ds, helper_vfp_tosqd_round_to_zero, uint64_t) | 231 | +DO_VCVT_FIXED(gvec_vcvt_rz_ds, helper_vfp_tosqd_round_to_zero, uint64_t) |
232 | +DO_VCVT_FIXED(gvec_vcvt_rz_du, helper_vfp_touqd_round_to_zero, uint64_t) | 232 | +DO_VCVT_FIXED(gvec_vcvt_rz_du, helper_vfp_touqd_round_to_zero, uint64_t) |
233 | DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t) | 233 | DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t) |
234 | DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t) | 234 | DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t) |
235 | DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t) | 235 | DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t) |
236 | diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c | 236 | diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c |
237 | index XXXXXXX..XXXXXXX 100644 | 237 | index XXXXXXX..XXXXXXX 100644 |
238 | --- a/target/arm/vfp_helper.c | 238 | --- a/target/arm/vfp_helper.c |
239 | +++ b/target/arm/vfp_helper.c | 239 | +++ b/target/arm/vfp_helper.c |
240 | @@ -XXX,XX +XXX,XX @@ VFP_CONV_FIX_A64(sq, h, 16, dh_ctype_f16, 64, int64) | 240 | @@ -XXX,XX +XXX,XX @@ VFP_CONV_FIX_A64(sq, h, 16, dh_ctype_f16, 64, int64) |
241 | VFP_CONV_FIX(uh, h, 16, dh_ctype_f16, 32, uint16) | 241 | VFP_CONV_FIX(uh, h, 16, dh_ctype_f16, 32, uint16) |
242 | VFP_CONV_FIX(ul, h, 16, dh_ctype_f16, 32, uint32) | 242 | VFP_CONV_FIX(ul, h, 16, dh_ctype_f16, 32, uint32) |
243 | VFP_CONV_FIX_A64(uq, h, 16, dh_ctype_f16, 64, uint64) | 243 | VFP_CONV_FIX_A64(uq, h, 16, dh_ctype_f16, 64, uint64) |
244 | +VFP_CONV_FLOAT_FIX_ROUND(sq, d, 64, float64, 64, int64, | 244 | +VFP_CONV_FLOAT_FIX_ROUND(sq, d, 64, float64, 64, int64, |
245 | + float_round_to_zero, _round_to_zero) | 245 | + float_round_to_zero, _round_to_zero) |
246 | +VFP_CONV_FLOAT_FIX_ROUND(uq, d, 64, float64, 64, uint64, | 246 | +VFP_CONV_FLOAT_FIX_ROUND(uq, d, 64, float64, 64, uint64, |
247 | + float_round_to_zero, _round_to_zero) | 247 | + float_round_to_zero, _round_to_zero) |
248 | 248 | ||
249 | #undef VFP_CONV_FIX | 249 | #undef VFP_CONV_FIX |
250 | #undef VFP_CONV_FIX_FLOAT | 250 | #undef VFP_CONV_FIX_FLOAT |
251 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 251 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
252 | index XXXXXXX..XXXXXXX 100644 | 252 | index XXXXXXX..XXXXXXX 100644 |
253 | --- a/target/arm/tcg/a64.decode | 253 | --- a/target/arm/tcg/a64.decode |
254 | +++ b/target/arm/tcg/a64.decode | 254 | +++ b/target/arm/tcg/a64.decode |
255 | @@ -XXX,XX +XXX,XX @@ SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_d | 255 | @@ -XXX,XX +XXX,XX @@ SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_d |
256 | UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_h | 256 | UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_h |
257 | UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_s | 257 | UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_s |
258 | UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_d | 258 | UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_d |
259 | + | 259 | + |
260 | +FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_h | 260 | +FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_h |
261 | +FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_s | 261 | +FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_s |
262 | +FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_d | 262 | +FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_d |
263 | + | 263 | + |
264 | +FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_h | 264 | +FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_h |
265 | +FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_s | 265 | +FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_s |
266 | +FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_d | 266 | +FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_d |
267 | -- | 267 | -- |
268 | 2.43.0 | 268 | 2.43.0 | diff view generated by jsdifflib |
1 | Remove handle_2misc_64 as these were the last insns decoded | 1 | Remove handle_2misc_64 as these were the last insns decoded |
---|---|---|---|
2 | by that function. Remove helper_advsimd_f16to[su]inth as unused; | 2 | by that function. Remove helper_advsimd_f16to[su]inth as unused; |
3 | we now always go through helper_vfp_to[su]hh or a specialized | 3 | we now always go through helper_vfp_to[su]hh or a specialized |
4 | vector function instead. | 4 | vector function instead. |
5 | 5 | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
7 | --- | 7 | --- |
8 | target/arm/helper.h | 2 + | 8 | target/arm/helper.h | 2 + |
9 | target/arm/tcg/helper-a64.h | 2 - | 9 | target/arm/tcg/helper-a64.h | 2 - |
10 | target/arm/tcg/helper-a64.c | 32 ----- | 10 | target/arm/tcg/helper-a64.c | 32 ----- |
11 | target/arm/tcg/translate-a64.c | 227 +++++++++++---------------------- | 11 | target/arm/tcg/translate-a64.c | 227 +++++++++++---------------------- |
12 | target/arm/tcg/vec_helper.c | 2 + | 12 | target/arm/tcg/vec_helper.c | 2 + |
13 | target/arm/tcg/a64.decode | 25 ++++ | 13 | target/arm/tcg/a64.decode | 25 ++++ |
14 | 6 files changed, 102 insertions(+), 188 deletions(-) | 14 | 6 files changed, 102 insertions(+), 188 deletions(-) |
15 | 15 | ||
16 | diff --git a/target/arm/helper.h b/target/arm/helper.h | 16 | diff --git a/target/arm/helper.h b/target/arm/helper.h |
17 | index XXXXXXX..XXXXXXX 100644 | 17 | index XXXXXXX..XXXXXXX 100644 |
18 | --- a/target/arm/helper.h | 18 | --- a/target/arm/helper.h |
19 | +++ b/target/arm/helper.h | 19 | +++ b/target/arm/helper.h |
20 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 20 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
21 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 21 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
22 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 22 | DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
23 | 23 | ||
24 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 24 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
25 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 25 | +DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
26 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 26 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
27 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 27 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
28 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) | 28 | DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32) |
29 | diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h | 29 | diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h |
30 | index XXXXXXX..XXXXXXX 100644 | 30 | index XXXXXXX..XXXXXXX 100644 |
31 | --- a/target/arm/tcg/helper-a64.h | 31 | --- a/target/arm/tcg/helper-a64.h |
32 | +++ b/target/arm/tcg/helper-a64.h | 32 | +++ b/target/arm/tcg/helper-a64.h |
33 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(advsimd_mulx2h, i32, i32, i32, ptr) | 33 | @@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(advsimd_mulx2h, i32, i32, i32, ptr) |
34 | DEF_HELPER_4(advsimd_muladd2h, i32, i32, i32, i32, ptr) | 34 | DEF_HELPER_4(advsimd_muladd2h, i32, i32, i32, i32, ptr) |
35 | DEF_HELPER_2(advsimd_rinth_exact, f16, f16, ptr) | 35 | DEF_HELPER_2(advsimd_rinth_exact, f16, f16, ptr) |
36 | DEF_HELPER_2(advsimd_rinth, f16, f16, ptr) | 36 | DEF_HELPER_2(advsimd_rinth, f16, f16, ptr) |
37 | -DEF_HELPER_2(advsimd_f16tosinth, i32, f16, ptr) | 37 | -DEF_HELPER_2(advsimd_f16tosinth, i32, f16, ptr) |
38 | -DEF_HELPER_2(advsimd_f16touinth, i32, f16, ptr) | 38 | -DEF_HELPER_2(advsimd_f16touinth, i32, f16, ptr) |
39 | 39 | ||
40 | DEF_HELPER_2(exception_return, void, env, i64) | 40 | DEF_HELPER_2(exception_return, void, env, i64) |
41 | DEF_HELPER_FLAGS_2(dc_zva, TCG_CALL_NO_WG, void, env, i64) | 41 | DEF_HELPER_FLAGS_2(dc_zva, TCG_CALL_NO_WG, void, env, i64) |
42 | diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c | 42 | diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c |
43 | index XXXXXXX..XXXXXXX 100644 | 43 | index XXXXXXX..XXXXXXX 100644 |
44 | --- a/target/arm/tcg/helper-a64.c | 44 | --- a/target/arm/tcg/helper-a64.c |
45 | +++ b/target/arm/tcg/helper-a64.c | 45 | +++ b/target/arm/tcg/helper-a64.c |
46 | @@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status) | 46 | @@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status) |
47 | return ret; | 47 | return ret; |
48 | } | 48 | } |
49 | 49 | ||
50 | -/* | 50 | -/* |
51 | - * Half-precision floating point conversion functions | 51 | - * Half-precision floating point conversion functions |
52 | - * | 52 | - * |
53 | - * There are a multitude of conversion functions with various | 53 | - * There are a multitude of conversion functions with various |
54 | - * different rounding modes. This is dealt with by the calling code | 54 | - * different rounding modes. This is dealt with by the calling code |
55 | - * setting the mode appropriately before calling the helper. | 55 | - * setting the mode appropriately before calling the helper. |
56 | - */ | 56 | - */ |
57 | - | 57 | - |
58 | -uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp) | 58 | -uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp) |
59 | -{ | 59 | -{ |
60 | - float_status *fpst = fpstp; | 60 | - float_status *fpst = fpstp; |
61 | - | 61 | - |
62 | - /* Invalid if we are passed a NaN */ | 62 | - /* Invalid if we are passed a NaN */ |
63 | - if (float16_is_any_nan(a)) { | 63 | - if (float16_is_any_nan(a)) { |
64 | - float_raise(float_flag_invalid, fpst); | 64 | - float_raise(float_flag_invalid, fpst); |
65 | - return 0; | 65 | - return 0; |
66 | - } | 66 | - } |
67 | - return float16_to_int16(a, fpst); | 67 | - return float16_to_int16(a, fpst); |
68 | -} | 68 | -} |
69 | - | 69 | - |
70 | -uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp) | 70 | -uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp) |
71 | -{ | 71 | -{ |
72 | - float_status *fpst = fpstp; | 72 | - float_status *fpst = fpstp; |
73 | - | 73 | - |
74 | - /* Invalid if we are passed a NaN */ | 74 | - /* Invalid if we are passed a NaN */ |
75 | - if (float16_is_any_nan(a)) { | 75 | - if (float16_is_any_nan(a)) { |
76 | - float_raise(float_flag_invalid, fpst); | 76 | - float_raise(float_flag_invalid, fpst); |
77 | - return 0; | 77 | - return 0; |
78 | - } | 78 | - } |
79 | - return float16_to_uint16(a, fpst); | 79 | - return float16_to_uint16(a, fpst); |
80 | -} | 80 | -} |
81 | - | 81 | - |
82 | static int el_from_spsr(uint32_t spsr) | 82 | static int el_from_spsr(uint32_t spsr) |
83 | { | 83 | { |
84 | /* Return the exception level that this SPSR is requesting a return to, | 84 | /* Return the exception level that this SPSR is requesting a return to, |
85 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 85 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
86 | index XXXXXXX..XXXXXXX 100644 | 86 | index XXXXXXX..XXXXXXX 100644 |
87 | --- a/target/arm/tcg/translate-a64.c | 87 | --- a/target/arm/tcg/translate-a64.c |
88 | +++ b/target/arm/tcg/translate-a64.c | 88 | +++ b/target/arm/tcg/translate-a64.c |
89 | @@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_fcvtzu_vf[] = { | 89 | @@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_fcvtzu_vf[] = { |
90 | TRANS(FCVTZU_vf, do_gvec_op2_fpst, | 90 | TRANS(FCVTZU_vf, do_gvec_op2_fpst, |
91 | a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzu_vf) | 91 | a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzu_vf) |
92 | 92 | ||
93 | -static void handle_2misc_64(DisasContext *s, int opcode, bool u, | 93 | -static void handle_2misc_64(DisasContext *s, int opcode, bool u, |
94 | - TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, | 94 | - TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, |
95 | - TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus) | 95 | - TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus) |
96 | -{ | 96 | -{ |
97 | - /* Handle 64->64 opcodes which are shared between the scalar and | 97 | - /* Handle 64->64 opcodes which are shared between the scalar and |
98 | - * vector 2-reg-misc groups. We cover every integer opcode where size == 3 | 98 | - * vector 2-reg-misc groups. We cover every integer opcode where size == 3 |
99 | - * is valid in either group and also the double-precision fp ops. | 99 | - * is valid in either group and also the double-precision fp ops. |
100 | - * The caller only need provide tcg_rmode and tcg_fpstatus if the op | 100 | - * The caller only need provide tcg_rmode and tcg_fpstatus if the op |
101 | - * requires them. | 101 | - * requires them. |
102 | - */ | 102 | - */ |
103 | - switch (opcode) { | 103 | - switch (opcode) { |
104 | - case 0x1a: /* FCVTNS */ | 104 | - case 0x1a: /* FCVTNS */ |
105 | - case 0x1b: /* FCVTMS */ | 105 | - case 0x1b: /* FCVTMS */ |
106 | - case 0x1c: /* FCVTAS */ | 106 | - case 0x1c: /* FCVTAS */ |
107 | - case 0x3a: /* FCVTPS */ | 107 | - case 0x3a: /* FCVTPS */ |
108 | - case 0x3b: /* FCVTZS */ | 108 | - case 0x3b: /* FCVTZS */ |
109 | - gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus); | 109 | - gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus); |
110 | - break; | 110 | - break; |
111 | - case 0x5a: /* FCVTNU */ | 111 | - case 0x5a: /* FCVTNU */ |
112 | - case 0x5b: /* FCVTMU */ | 112 | - case 0x5b: /* FCVTMU */ |
113 | - case 0x5c: /* FCVTAU */ | 113 | - case 0x5c: /* FCVTAU */ |
114 | - case 0x7a: /* FCVTPU */ | 114 | - case 0x7a: /* FCVTPU */ |
115 | - case 0x7b: /* FCVTZU */ | 115 | - case 0x7b: /* FCVTZU */ |
116 | - gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus); | 116 | - gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus); |
117 | - break; | 117 | - break; |
118 | - default: | 118 | - default: |
119 | - case 0x4: /* CLS, CLZ */ | 119 | - case 0x4: /* CLS, CLZ */ |
120 | - case 0x5: /* NOT */ | 120 | - case 0x5: /* NOT */ |
121 | - case 0x7: /* SQABS, SQNEG */ | 121 | - case 0x7: /* SQABS, SQNEG */ |
122 | - case 0x8: /* CMGT, CMGE */ | 122 | - case 0x8: /* CMGT, CMGE */ |
123 | - case 0x9: /* CMEQ, CMLE */ | 123 | - case 0x9: /* CMEQ, CMLE */ |
124 | - case 0xa: /* CMLT */ | 124 | - case 0xa: /* CMLT */ |
125 | - case 0xb: /* ABS, NEG */ | 125 | - case 0xb: /* ABS, NEG */ |
126 | - case 0x2f: /* FABS */ | 126 | - case 0x2f: /* FABS */ |
127 | - case 0x6f: /* FNEG */ | 127 | - case 0x6f: /* FNEG */ |
128 | - case 0x7f: /* FSQRT */ | 128 | - case 0x7f: /* FSQRT */ |
129 | - case 0x18: /* FRINTN */ | 129 | - case 0x18: /* FRINTN */ |
130 | - case 0x19: /* FRINTM */ | 130 | - case 0x19: /* FRINTM */ |
131 | - case 0x38: /* FRINTP */ | 131 | - case 0x38: /* FRINTP */ |
132 | - case 0x39: /* FRINTZ */ | 132 | - case 0x39: /* FRINTZ */ |
133 | - case 0x58: /* FRINTA */ | 133 | - case 0x58: /* FRINTA */ |
134 | - case 0x79: /* FRINTI */ | 134 | - case 0x79: /* FRINTI */ |
135 | - case 0x59: /* FRINTX */ | 135 | - case 0x59: /* FRINTX */ |
136 | - case 0x1e: /* FRINT32Z */ | 136 | - case 0x1e: /* FRINT32Z */ |
137 | - case 0x5e: /* FRINT32X */ | 137 | - case 0x5e: /* FRINT32X */ |
138 | - case 0x1f: /* FRINT64Z */ | 138 | - case 0x1f: /* FRINT64Z */ |
139 | - case 0x5f: /* FRINT64X */ | 139 | - case 0x5f: /* FRINT64X */ |
140 | - g_assert_not_reached(); | 140 | - g_assert_not_reached(); |
141 | - } | 141 | - } |
142 | -} | 142 | -} |
143 | +static gen_helper_gvec_2_ptr * const f_fcvt_s_vi[] = { | 143 | +static gen_helper_gvec_2_ptr * const f_fcvt_s_vi[] = { |
144 | + gen_helper_gvec_vcvt_rm_sh, | 144 | + gen_helper_gvec_vcvt_rm_sh, |
145 | + gen_helper_gvec_vcvt_rm_ss, | 145 | + gen_helper_gvec_vcvt_rm_ss, |
146 | + gen_helper_gvec_vcvt_rm_sd, | 146 | + gen_helper_gvec_vcvt_rm_sd, |
147 | +}; | 147 | +}; |
148 | + | 148 | + |
149 | +static gen_helper_gvec_2_ptr * const f_fcvt_u_vi[] = { | 149 | +static gen_helper_gvec_2_ptr * const f_fcvt_u_vi[] = { |
150 | + gen_helper_gvec_vcvt_rm_uh, | 150 | + gen_helper_gvec_vcvt_rm_uh, |
151 | + gen_helper_gvec_vcvt_rm_us, | 151 | + gen_helper_gvec_vcvt_rm_us, |
152 | + gen_helper_gvec_vcvt_rm_ud, | 152 | + gen_helper_gvec_vcvt_rm_ud, |
153 | +}; | 153 | +}; |
154 | + | 154 | + |
155 | +TRANS(FCVTNS_vi, do_gvec_op2_fpst, | 155 | +TRANS(FCVTNS_vi, do_gvec_op2_fpst, |
156 | + a->esz, a->q, a->rd, a->rn, float_round_nearest_even, f_fcvt_s_vi) | 156 | + a->esz, a->q, a->rd, a->rn, float_round_nearest_even, f_fcvt_s_vi) |
157 | +TRANS(FCVTNU_vi, do_gvec_op2_fpst, | 157 | +TRANS(FCVTNU_vi, do_gvec_op2_fpst, |
158 | + a->esz, a->q, a->rd, a->rn, float_round_nearest_even, f_fcvt_u_vi) | 158 | + a->esz, a->q, a->rd, a->rn, float_round_nearest_even, f_fcvt_u_vi) |
159 | +TRANS(FCVTPS_vi, do_gvec_op2_fpst, | 159 | +TRANS(FCVTPS_vi, do_gvec_op2_fpst, |
160 | + a->esz, a->q, a->rd, a->rn, float_round_up, f_fcvt_s_vi) | 160 | + a->esz, a->q, a->rd, a->rn, float_round_up, f_fcvt_s_vi) |
161 | +TRANS(FCVTPU_vi, do_gvec_op2_fpst, | 161 | +TRANS(FCVTPU_vi, do_gvec_op2_fpst, |
162 | + a->esz, a->q, a->rd, a->rn, float_round_up, f_fcvt_u_vi) | 162 | + a->esz, a->q, a->rd, a->rn, float_round_up, f_fcvt_u_vi) |
163 | +TRANS(FCVTMS_vi, do_gvec_op2_fpst, | 163 | +TRANS(FCVTMS_vi, do_gvec_op2_fpst, |
164 | + a->esz, a->q, a->rd, a->rn, float_round_down, f_fcvt_s_vi) | 164 | + a->esz, a->q, a->rd, a->rn, float_round_down, f_fcvt_s_vi) |
165 | +TRANS(FCVTMU_vi, do_gvec_op2_fpst, | 165 | +TRANS(FCVTMU_vi, do_gvec_op2_fpst, |
166 | + a->esz, a->q, a->rd, a->rn, float_round_down, f_fcvt_u_vi) | 166 | + a->esz, a->q, a->rd, a->rn, float_round_down, f_fcvt_u_vi) |
167 | +TRANS(FCVTZS_vi, do_gvec_op2_fpst, | 167 | +TRANS(FCVTZS_vi, do_gvec_op2_fpst, |
168 | + a->esz, a->q, a->rd, a->rn, float_round_to_zero, f_fcvt_s_vi) | 168 | + a->esz, a->q, a->rd, a->rn, float_round_to_zero, f_fcvt_s_vi) |
169 | +TRANS(FCVTZU_vi, do_gvec_op2_fpst, | 169 | +TRANS(FCVTZU_vi, do_gvec_op2_fpst, |
170 | + a->esz, a->q, a->rd, a->rn, float_round_to_zero, f_fcvt_u_vi) | 170 | + a->esz, a->q, a->rd, a->rn, float_round_to_zero, f_fcvt_u_vi) |
171 | +TRANS(FCVTAS_vi, do_gvec_op2_fpst, | 171 | +TRANS(FCVTAS_vi, do_gvec_op2_fpst, |
172 | + a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_s_vi) | 172 | + a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_s_vi) |
173 | +TRANS(FCVTAU_vi, do_gvec_op2_fpst, | 173 | +TRANS(FCVTAU_vi, do_gvec_op2_fpst, |
174 | + a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_u_vi) | 174 | + a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_u_vi) |
175 | 175 | ||
176 | static void handle_2misc_fcmp_zero(DisasContext *s, int opcode, | 176 | static void handle_2misc_fcmp_zero(DisasContext *s, int opcode, |
177 | bool is_scalar, bool is_u, bool is_q, | 177 | bool is_scalar, bool is_u, bool is_q, |
178 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 178 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
179 | } | 179 | } |
180 | handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd); | 180 | handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd); |
181 | return; | 181 | return; |
182 | - case 0x1a: /* FCVTNS */ | 182 | - case 0x1a: /* FCVTNS */ |
183 | - case 0x1b: /* FCVTMS */ | 183 | - case 0x1b: /* FCVTMS */ |
184 | - case 0x3a: /* FCVTPS */ | 184 | - case 0x3a: /* FCVTPS */ |
185 | - case 0x3b: /* FCVTZS */ | 185 | - case 0x3b: /* FCVTZS */ |
186 | - case 0x5a: /* FCVTNU */ | 186 | - case 0x5a: /* FCVTNU */ |
187 | - case 0x5b: /* FCVTMU */ | 187 | - case 0x5b: /* FCVTMU */ |
188 | - case 0x7a: /* FCVTPU */ | 188 | - case 0x7a: /* FCVTPU */ |
189 | - case 0x7b: /* FCVTZU */ | 189 | - case 0x7b: /* FCVTZU */ |
190 | - need_fpstatus = true; | 190 | - need_fpstatus = true; |
191 | - rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1); | 191 | - rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1); |
192 | - if (size == 3 && !is_q) { | 192 | - if (size == 3 && !is_q) { |
193 | - unallocated_encoding(s); | 193 | - unallocated_encoding(s); |
194 | - return; | 194 | - return; |
195 | - } | 195 | - } |
196 | - break; | 196 | - break; |
197 | - case 0x5c: /* FCVTAU */ | 197 | - case 0x5c: /* FCVTAU */ |
198 | - case 0x1c: /* FCVTAS */ | 198 | - case 0x1c: /* FCVTAS */ |
199 | - need_fpstatus = true; | 199 | - need_fpstatus = true; |
200 | - rmode = FPROUNDING_TIEAWAY; | 200 | - rmode = FPROUNDING_TIEAWAY; |
201 | - if (size == 3 && !is_q) { | 201 | - if (size == 3 && !is_q) { |
202 | - unallocated_encoding(s); | 202 | - unallocated_encoding(s); |
203 | - return; | 203 | - return; |
204 | - } | 204 | - } |
205 | - break; | 205 | - break; |
206 | case 0x3c: /* URECPE */ | 206 | case 0x3c: /* URECPE */ |
207 | if (size == 3) { | 207 | if (size == 3) { |
208 | unallocated_encoding(s); | 208 | unallocated_encoding(s); |
209 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 209 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
210 | case 0x5f: /* FRINT64X */ | 210 | case 0x5f: /* FRINT64X */ |
211 | case 0x1d: /* SCVTF */ | 211 | case 0x1d: /* SCVTF */ |
212 | case 0x5d: /* UCVTF */ | 212 | case 0x5d: /* UCVTF */ |
213 | + case 0x1a: /* FCVTNS */ | 213 | + case 0x1a: /* FCVTNS */ |
214 | + case 0x1b: /* FCVTMS */ | 214 | + case 0x1b: /* FCVTMS */ |
215 | + case 0x3a: /* FCVTPS */ | 215 | + case 0x3a: /* FCVTPS */ |
216 | + case 0x3b: /* FCVTZS */ | 216 | + case 0x3b: /* FCVTZS */ |
217 | + case 0x5a: /* FCVTNU */ | 217 | + case 0x5a: /* FCVTNU */ |
218 | + case 0x5b: /* FCVTMU */ | 218 | + case 0x5b: /* FCVTMU */ |
219 | + case 0x7a: /* FCVTPU */ | 219 | + case 0x7a: /* FCVTPU */ |
220 | + case 0x7b: /* FCVTZU */ | 220 | + case 0x7b: /* FCVTZU */ |
221 | + case 0x5c: /* FCVTAU */ | 221 | + case 0x5c: /* FCVTAU */ |
222 | + case 0x1c: /* FCVTAS */ | 222 | + case 0x1c: /* FCVTAS */ |
223 | unallocated_encoding(s); | 223 | unallocated_encoding(s); |
224 | return; | 224 | return; |
225 | } | 225 | } |
226 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 226 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
227 | tcg_rmode = NULL; | 227 | tcg_rmode = NULL; |
228 | } | 228 | } |
229 | 229 | ||
230 | - if (size == 3) { | 230 | - if (size == 3) { |
231 | - /* All 64-bit element operations can be shared with scalar 2misc */ | 231 | - /* All 64-bit element operations can be shared with scalar 2misc */ |
232 | - int pass; | 232 | - int pass; |
233 | - | 233 | - |
234 | - /* Coverity claims (size == 3 && !is_q) has been eliminated | 234 | - /* Coverity claims (size == 3 && !is_q) has been eliminated |
235 | - * from all paths leading to here. | 235 | - * from all paths leading to here. |
236 | - */ | 236 | - */ |
237 | - tcg_debug_assert(is_q); | 237 | - tcg_debug_assert(is_q); |
238 | - for (pass = 0; pass < 2; pass++) { | 238 | - for (pass = 0; pass < 2; pass++) { |
239 | - TCGv_i64 tcg_op = tcg_temp_new_i64(); | 239 | - TCGv_i64 tcg_op = tcg_temp_new_i64(); |
240 | - TCGv_i64 tcg_res = tcg_temp_new_i64(); | 240 | - TCGv_i64 tcg_res = tcg_temp_new_i64(); |
241 | - | 241 | - |
242 | - read_vec_element(s, tcg_op, rn, pass, MO_64); | 242 | - read_vec_element(s, tcg_op, rn, pass, MO_64); |
243 | - | 243 | - |
244 | - handle_2misc_64(s, opcode, u, tcg_res, tcg_op, | 244 | - handle_2misc_64(s, opcode, u, tcg_res, tcg_op, |
245 | - tcg_rmode, tcg_fpstatus); | 245 | - tcg_rmode, tcg_fpstatus); |
246 | - | 246 | - |
247 | - write_vec_element(s, tcg_res, rd, pass, MO_64); | 247 | - write_vec_element(s, tcg_res, rd, pass, MO_64); |
248 | - } | 248 | - } |
249 | - } else { | 249 | - } else { |
250 | + { | 250 | + { |
251 | int pass; | 251 | int pass; |
252 | 252 | ||
253 | assert(size == 2); | 253 | assert(size == 2); |
254 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 254 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
255 | { | 255 | { |
256 | /* Special cases for 32 bit elements */ | 256 | /* Special cases for 32 bit elements */ |
257 | switch (opcode) { | 257 | switch (opcode) { |
258 | - case 0x1a: /* FCVTNS */ | 258 | - case 0x1a: /* FCVTNS */ |
259 | - case 0x1b: /* FCVTMS */ | 259 | - case 0x1b: /* FCVTMS */ |
260 | - case 0x1c: /* FCVTAS */ | 260 | - case 0x1c: /* FCVTAS */ |
261 | - case 0x3a: /* FCVTPS */ | 261 | - case 0x3a: /* FCVTPS */ |
262 | - case 0x3b: /* FCVTZS */ | 262 | - case 0x3b: /* FCVTZS */ |
263 | - gen_helper_vfp_tosls(tcg_res, tcg_op, | 263 | - gen_helper_vfp_tosls(tcg_res, tcg_op, |
264 | - tcg_constant_i32(0), tcg_fpstatus); | 264 | - tcg_constant_i32(0), tcg_fpstatus); |
265 | - break; | 265 | - break; |
266 | - case 0x5a: /* FCVTNU */ | 266 | - case 0x5a: /* FCVTNU */ |
267 | - case 0x5b: /* FCVTMU */ | 267 | - case 0x5b: /* FCVTMU */ |
268 | - case 0x5c: /* FCVTAU */ | 268 | - case 0x5c: /* FCVTAU */ |
269 | - case 0x7a: /* FCVTPU */ | 269 | - case 0x7a: /* FCVTPU */ |
270 | - case 0x7b: /* FCVTZU */ | 270 | - case 0x7b: /* FCVTZU */ |
271 | - gen_helper_vfp_touls(tcg_res, tcg_op, | 271 | - gen_helper_vfp_touls(tcg_res, tcg_op, |
272 | - tcg_constant_i32(0), tcg_fpstatus); | 272 | - tcg_constant_i32(0), tcg_fpstatus); |
273 | - break; | 273 | - break; |
274 | case 0x7c: /* URSQRTE */ | 274 | case 0x7c: /* URSQRTE */ |
275 | gen_helper_rsqrte_u32(tcg_res, tcg_op); | 275 | gen_helper_rsqrte_u32(tcg_res, tcg_op); |
276 | break; | 276 | break; |
277 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 277 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
278 | case 0x5e: /* FRINT32X */ | 278 | case 0x5e: /* FRINT32X */ |
279 | case 0x1f: /* FRINT64Z */ | 279 | case 0x1f: /* FRINT64Z */ |
280 | case 0x5f: /* FRINT64X */ | 280 | case 0x5f: /* FRINT64X */ |
281 | + case 0x1a: /* FCVTNS */ | 281 | + case 0x1a: /* FCVTNS */ |
282 | + case 0x1b: /* FCVTMS */ | 282 | + case 0x1b: /* FCVTMS */ |
283 | + case 0x1c: /* FCVTAS */ | 283 | + case 0x1c: /* FCVTAS */ |
284 | + case 0x3a: /* FCVTPS */ | 284 | + case 0x3a: /* FCVTPS */ |
285 | + case 0x3b: /* FCVTZS */ | 285 | + case 0x3b: /* FCVTZS */ |
286 | + case 0x5a: /* FCVTNU */ | 286 | + case 0x5a: /* FCVTNU */ |
287 | + case 0x5b: /* FCVTMU */ | 287 | + case 0x5b: /* FCVTMU */ |
288 | + case 0x5c: /* FCVTAU */ | 288 | + case 0x5c: /* FCVTAU */ |
289 | + case 0x7a: /* FCVTPU */ | 289 | + case 0x7a: /* FCVTPU */ |
290 | + case 0x7b: /* FCVTZU */ | 290 | + case 0x7b: /* FCVTZU */ |
291 | g_assert_not_reached(); | 291 | g_assert_not_reached(); |
292 | } | 292 | } |
293 | } | 293 | } |
294 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 294 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
295 | case 0x3d: /* FRECPE */ | 295 | case 0x3d: /* FRECPE */ |
296 | case 0x3f: /* FRECPX */ | 296 | case 0x3f: /* FRECPX */ |
297 | break; | 297 | break; |
298 | - case 0x1a: /* FCVTNS */ | 298 | - case 0x1a: /* FCVTNS */ |
299 | - rmode = FPROUNDING_TIEEVEN; | 299 | - rmode = FPROUNDING_TIEEVEN; |
300 | - break; | 300 | - break; |
301 | - case 0x1b: /* FCVTMS */ | 301 | - case 0x1b: /* FCVTMS */ |
302 | - rmode = FPROUNDING_NEGINF; | 302 | - rmode = FPROUNDING_NEGINF; |
303 | - break; | 303 | - break; |
304 | - case 0x1c: /* FCVTAS */ | 304 | - case 0x1c: /* FCVTAS */ |
305 | - rmode = FPROUNDING_TIEAWAY; | 305 | - rmode = FPROUNDING_TIEAWAY; |
306 | - break; | 306 | - break; |
307 | - case 0x3a: /* FCVTPS */ | 307 | - case 0x3a: /* FCVTPS */ |
308 | - rmode = FPROUNDING_POSINF; | 308 | - rmode = FPROUNDING_POSINF; |
309 | - break; | 309 | - break; |
310 | - case 0x3b: /* FCVTZS */ | 310 | - case 0x3b: /* FCVTZS */ |
311 | - rmode = FPROUNDING_ZERO; | 311 | - rmode = FPROUNDING_ZERO; |
312 | - break; | 312 | - break; |
313 | - case 0x5a: /* FCVTNU */ | 313 | - case 0x5a: /* FCVTNU */ |
314 | - rmode = FPROUNDING_TIEEVEN; | 314 | - rmode = FPROUNDING_TIEEVEN; |
315 | - break; | 315 | - break; |
316 | - case 0x5b: /* FCVTMU */ | 316 | - case 0x5b: /* FCVTMU */ |
317 | - rmode = FPROUNDING_NEGINF; | 317 | - rmode = FPROUNDING_NEGINF; |
318 | - break; | 318 | - break; |
319 | - case 0x5c: /* FCVTAU */ | 319 | - case 0x5c: /* FCVTAU */ |
320 | - rmode = FPROUNDING_TIEAWAY; | 320 | - rmode = FPROUNDING_TIEAWAY; |
321 | - break; | 321 | - break; |
322 | - case 0x7a: /* FCVTPU */ | 322 | - case 0x7a: /* FCVTPU */ |
323 | - rmode = FPROUNDING_POSINF; | 323 | - rmode = FPROUNDING_POSINF; |
324 | - break; | 324 | - break; |
325 | - case 0x7b: /* FCVTZU */ | 325 | - case 0x7b: /* FCVTZU */ |
326 | - rmode = FPROUNDING_ZERO; | 326 | - rmode = FPROUNDING_ZERO; |
327 | - break; | 327 | - break; |
328 | case 0x7d: /* FRSQRTE */ | 328 | case 0x7d: /* FRSQRTE */ |
329 | break; | 329 | break; |
330 | default: | 330 | default: |
331 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 331 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
332 | case 0x79: /* FRINTI */ | 332 | case 0x79: /* FRINTI */ |
333 | case 0x1d: /* SCVTF */ | 333 | case 0x1d: /* SCVTF */ |
334 | case 0x5d: /* UCVTF */ | 334 | case 0x5d: /* UCVTF */ |
335 | + case 0x1a: /* FCVTNS */ | 335 | + case 0x1a: /* FCVTNS */ |
336 | + case 0x1b: /* FCVTMS */ | 336 | + case 0x1b: /* FCVTMS */ |
337 | + case 0x1c: /* FCVTAS */ | 337 | + case 0x1c: /* FCVTAS */ |
338 | + case 0x3a: /* FCVTPS */ | 338 | + case 0x3a: /* FCVTPS */ |
339 | + case 0x3b: /* FCVTZS */ | 339 | + case 0x3b: /* FCVTZS */ |
340 | + case 0x5a: /* FCVTNU */ | 340 | + case 0x5a: /* FCVTNU */ |
341 | + case 0x5b: /* FCVTMU */ | 341 | + case 0x5b: /* FCVTMU */ |
342 | + case 0x5c: /* FCVTAU */ | 342 | + case 0x5c: /* FCVTAU */ |
343 | + case 0x7a: /* FCVTPU */ | 343 | + case 0x7a: /* FCVTPU */ |
344 | + case 0x7b: /* FCVTZU */ | 344 | + case 0x7b: /* FCVTZU */ |
345 | unallocated_encoding(s); | 345 | unallocated_encoding(s); |
346 | return; | 346 | return; |
347 | } | 347 | } |
348 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 348 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
349 | read_vec_element_i32(s, tcg_op, rn, pass, MO_16); | 349 | read_vec_element_i32(s, tcg_op, rn, pass, MO_16); |
350 | 350 | ||
351 | switch (fpop) { | 351 | switch (fpop) { |
352 | - case 0x1a: /* FCVTNS */ | 352 | - case 0x1a: /* FCVTNS */ |
353 | - case 0x1b: /* FCVTMS */ | 353 | - case 0x1b: /* FCVTMS */ |
354 | - case 0x1c: /* FCVTAS */ | 354 | - case 0x1c: /* FCVTAS */ |
355 | - case 0x3a: /* FCVTPS */ | 355 | - case 0x3a: /* FCVTPS */ |
356 | - case 0x3b: /* FCVTZS */ | 356 | - case 0x3b: /* FCVTZS */ |
357 | - gen_helper_advsimd_f16tosinth(tcg_res, tcg_op, tcg_fpstatus); | 357 | - gen_helper_advsimd_f16tosinth(tcg_res, tcg_op, tcg_fpstatus); |
358 | - break; | 358 | - break; |
359 | case 0x3d: /* FRECPE */ | 359 | case 0x3d: /* FRECPE */ |
360 | gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus); | 360 | gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus); |
361 | break; | 361 | break; |
362 | - case 0x5a: /* FCVTNU */ | 362 | - case 0x5a: /* FCVTNU */ |
363 | - case 0x5b: /* FCVTMU */ | 363 | - case 0x5b: /* FCVTMU */ |
364 | - case 0x5c: /* FCVTAU */ | 364 | - case 0x5c: /* FCVTAU */ |
365 | - case 0x7a: /* FCVTPU */ | 365 | - case 0x7a: /* FCVTPU */ |
366 | - case 0x7b: /* FCVTZU */ | 366 | - case 0x7b: /* FCVTZU */ |
367 | - gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus); | 367 | - gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus); |
368 | - break; | 368 | - break; |
369 | case 0x7d: /* FRSQRTE */ | 369 | case 0x7d: /* FRSQRTE */ |
370 | gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); | 370 | gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); |
371 | break; | 371 | break; |
372 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | 372 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) |
373 | case 0x58: /* FRINTA */ | 373 | case 0x58: /* FRINTA */ |
374 | case 0x79: /* FRINTI */ | 374 | case 0x79: /* FRINTI */ |
375 | case 0x59: /* FRINTX */ | 375 | case 0x59: /* FRINTX */ |
376 | + case 0x1a: /* FCVTNS */ | 376 | + case 0x1a: /* FCVTNS */ |
377 | + case 0x1b: /* FCVTMS */ | 377 | + case 0x1b: /* FCVTMS */ |
378 | + case 0x1c: /* FCVTAS */ | 378 | + case 0x1c: /* FCVTAS */ |
379 | + case 0x3a: /* FCVTPS */ | 379 | + case 0x3a: /* FCVTPS */ |
380 | + case 0x3b: /* FCVTZS */ | 380 | + case 0x3b: /* FCVTZS */ |
381 | + case 0x5a: /* FCVTNU */ | 381 | + case 0x5a: /* FCVTNU */ |
382 | + case 0x5b: /* FCVTMU */ | 382 | + case 0x5b: /* FCVTMU */ |
383 | + case 0x5c: /* FCVTAU */ | 383 | + case 0x5c: /* FCVTAU */ |
384 | + case 0x7a: /* FCVTPU */ | 384 | + case 0x7a: /* FCVTPU */ |
385 | + case 0x7b: /* FCVTZU */ | 385 | + case 0x7b: /* FCVTZU */ |
386 | g_assert_not_reached(); | 386 | g_assert_not_reached(); |
387 | } | 387 | } |
388 | 388 | ||
389 | diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c | 389 | diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c |
390 | index XXXXXXX..XXXXXXX 100644 | 390 | index XXXXXXX..XXXXXXX 100644 |
391 | --- a/target/arm/tcg/vec_helper.c | 391 | --- a/target/arm/tcg/vec_helper.c |
392 | +++ b/target/arm/tcg/vec_helper.c | 392 | +++ b/target/arm/tcg/vec_helper.c |
393 | @@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t) | 393 | @@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t) |
394 | clear_tail(d, oprsz, simd_maxsz(desc)); \ | 394 | clear_tail(d, oprsz, simd_maxsz(desc)); \ |
395 | } | 395 | } |
396 | 396 | ||
397 | +DO_VCVT_RMODE(gvec_vcvt_rm_sd, helper_vfp_tosqd, uint64_t) | 397 | +DO_VCVT_RMODE(gvec_vcvt_rm_sd, helper_vfp_tosqd, uint64_t) |
398 | +DO_VCVT_RMODE(gvec_vcvt_rm_ud, helper_vfp_touqd, uint64_t) | 398 | +DO_VCVT_RMODE(gvec_vcvt_rm_ud, helper_vfp_touqd, uint64_t) |
399 | DO_VCVT_RMODE(gvec_vcvt_rm_ss, helper_vfp_tosls, uint32_t) | 399 | DO_VCVT_RMODE(gvec_vcvt_rm_ss, helper_vfp_tosls, uint32_t) |
400 | DO_VCVT_RMODE(gvec_vcvt_rm_us, helper_vfp_touls, uint32_t) | 400 | DO_VCVT_RMODE(gvec_vcvt_rm_us, helper_vfp_touls, uint32_t) |
401 | DO_VCVT_RMODE(gvec_vcvt_rm_sh, helper_vfp_toshh, uint16_t) | 401 | DO_VCVT_RMODE(gvec_vcvt_rm_sh, helper_vfp_toshh, uint16_t) |
402 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 402 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
403 | index XXXXXXX..XXXXXXX 100644 | 403 | index XXXXXXX..XXXXXXX 100644 |
404 | --- a/target/arm/tcg/a64.decode | 404 | --- a/target/arm/tcg/a64.decode |
405 | +++ b/target/arm/tcg/a64.decode | 405 | +++ b/target/arm/tcg/a64.decode |
406 | @@ -XXX,XX +XXX,XX @@ SCVTF_vi 0.00 1110 0.1 00001 11011 0 ..... ..... @qrr_sd | 406 | @@ -XXX,XX +XXX,XX @@ SCVTF_vi 0.00 1110 0.1 00001 11011 0 ..... ..... @qrr_sd |
407 | UCVTF_vi 0.10 1110 011 11001 11011 0 ..... ..... @qrr_h | 407 | UCVTF_vi 0.10 1110 011 11001 11011 0 ..... ..... @qrr_h |
408 | UCVTF_vi 0.10 1110 0.1 00001 11011 0 ..... ..... @qrr_sd | 408 | UCVTF_vi 0.10 1110 0.1 00001 11011 0 ..... ..... @qrr_sd |
409 | 409 | ||
410 | +FCVTNS_vi 0.00 1110 011 11001 10101 0 ..... ..... @qrr_h | 410 | +FCVTNS_vi 0.00 1110 011 11001 10101 0 ..... ..... @qrr_h |
411 | +FCVTNS_vi 0.00 1110 0.1 00001 10101 0 ..... ..... @qrr_sd | 411 | +FCVTNS_vi 0.00 1110 0.1 00001 10101 0 ..... ..... @qrr_sd |
412 | +FCVTNU_vi 0.10 1110 011 11001 10101 0 ..... ..... @qrr_h | 412 | +FCVTNU_vi 0.10 1110 011 11001 10101 0 ..... ..... @qrr_h |
413 | +FCVTNU_vi 0.10 1110 0.1 00001 10101 0 ..... ..... @qrr_sd | 413 | +FCVTNU_vi 0.10 1110 0.1 00001 10101 0 ..... ..... @qrr_sd |
414 | + | 414 | + |
415 | +FCVTPS_vi 0.00 1110 111 11001 10101 0 ..... ..... @qrr_h | 415 | +FCVTPS_vi 0.00 1110 111 11001 10101 0 ..... ..... @qrr_h |
416 | +FCVTPS_vi 0.00 1110 1.1 00001 10101 0 ..... ..... @qrr_sd | 416 | +FCVTPS_vi 0.00 1110 1.1 00001 10101 0 ..... ..... @qrr_sd |
417 | +FCVTPU_vi 0.10 1110 111 11001 10101 0 ..... ..... @qrr_h | 417 | +FCVTPU_vi 0.10 1110 111 11001 10101 0 ..... ..... @qrr_h |
418 | +FCVTPU_vi 0.10 1110 1.1 00001 10101 0 ..... ..... @qrr_sd | 418 | +FCVTPU_vi 0.10 1110 1.1 00001 10101 0 ..... ..... @qrr_sd |
419 | + | 419 | + |
420 | +FCVTMS_vi 0.00 1110 011 11001 10111 0 ..... ..... @qrr_h | 420 | +FCVTMS_vi 0.00 1110 011 11001 10111 0 ..... ..... @qrr_h |
421 | +FCVTMS_vi 0.00 1110 0.1 00001 10111 0 ..... ..... @qrr_sd | 421 | +FCVTMS_vi 0.00 1110 0.1 00001 10111 0 ..... ..... @qrr_sd |
422 | +FCVTMU_vi 0.10 1110 011 11001 10111 0 ..... ..... @qrr_h | 422 | +FCVTMU_vi 0.10 1110 011 11001 10111 0 ..... ..... @qrr_h |
423 | +FCVTMU_vi 0.10 1110 0.1 00001 10111 0 ..... ..... @qrr_sd | 423 | +FCVTMU_vi 0.10 1110 0.1 00001 10111 0 ..... ..... @qrr_sd |
424 | + | 424 | + |
425 | +FCVTZS_vi 0.00 1110 111 11001 10111 0 ..... ..... @qrr_h | 425 | +FCVTZS_vi 0.00 1110 111 11001 10111 0 ..... ..... @qrr_h |
426 | +FCVTZS_vi 0.00 1110 1.1 00001 10111 0 ..... ..... @qrr_sd | 426 | +FCVTZS_vi 0.00 1110 1.1 00001 10111 0 ..... ..... @qrr_sd |
427 | +FCVTZU_vi 0.10 1110 111 11001 10111 0 ..... ..... @qrr_h | 427 | +FCVTZU_vi 0.10 1110 111 11001 10111 0 ..... ..... @qrr_h |
428 | +FCVTZU_vi 0.10 1110 1.1 00001 10111 0 ..... ..... @qrr_sd | 428 | +FCVTZU_vi 0.10 1110 1.1 00001 10111 0 ..... ..... @qrr_sd |
429 | + | 429 | + |
430 | +FCVTAS_vi 0.00 1110 011 11001 11001 0 ..... ..... @qrr_h | 430 | +FCVTAS_vi 0.00 1110 011 11001 11001 0 ..... ..... @qrr_h |
431 | +FCVTAS_vi 0.00 1110 0.1 00001 11001 0 ..... ..... @qrr_sd | 431 | +FCVTAS_vi 0.00 1110 0.1 00001 11001 0 ..... ..... @qrr_sd |
432 | +FCVTAU_vi 0.10 1110 011 11001 11001 0 ..... ..... @qrr_h | 432 | +FCVTAU_vi 0.10 1110 011 11001 11001 0 ..... ..... @qrr_h |
433 | +FCVTAU_vi 0.10 1110 0.1 00001 11001 0 ..... ..... @qrr_sd | 433 | +FCVTAU_vi 0.10 1110 0.1 00001 11001 0 ..... ..... @qrr_sd |
434 | + | 434 | + |
435 | &fcvt_q rd rn esz q shift | 435 | &fcvt_q rd rn esz q shift |
436 | @fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \ | 436 | @fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \ |
437 | &fcvt_q esz=1 shift=%fcvt_f_sh_h | 437 | &fcvt_q esz=1 shift=%fcvt_f_sh_h |
438 | -- | 438 | -- |
439 | 2.43.0 | 439 | 2.43.0 | diff view generated by jsdifflib |
1 | This includes FCMEQ, FCMGT, FCMGE, FCMLT, FCMLE. | 1 | This includes FCMEQ, FCMGT, FCMGE, FCMLT, FCMLE. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
4 | --- | 5 | --- |
5 | target/arm/helper.h | 5 + | 6 | target/arm/helper.h | 5 + |
6 | target/arm/tcg/translate-a64.c | 249 +++++++++++++-------------------- | 7 | target/arm/tcg/translate-a64.c | 249 +++++++++++++-------------------- |
7 | target/arm/tcg/vec_helper.c | 4 +- | 8 | target/arm/tcg/vec_helper.c | 4 +- |
... | ... | diff view generated by jsdifflib |
1 | Remove disas_simd_scalar_two_reg_misc and | 1 | Remove disas_simd_scalar_two_reg_misc and |
---|---|---|---|
2 | disas_simd_two_reg_misc_fp16 as these were the | 2 | disas_simd_two_reg_misc_fp16 as these were the |
3 | last insns decoded by those functions. | 3 | last insns decoded by those functions. |
4 | 4 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 7 | --- |
7 | target/arm/tcg/translate-a64.c | 330 ++++----------------------------- | 8 | target/arm/tcg/translate-a64.c | 329 ++++----------------------------- |
8 | target/arm/tcg/a64.decode | 15 ++ | 9 | target/arm/tcg/a64.decode | 15 ++ |
9 | 2 files changed, 53 insertions(+), 292 deletions(-) | 10 | 2 files changed, 53 insertions(+), 291 deletions(-) |
10 | 11 | ||
11 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 12 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
12 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/target/arm/tcg/translate-a64.c | 14 | --- a/target/arm/tcg/translate-a64.c |
14 | +++ b/target/arm/tcg/translate-a64.c | 15 | +++ b/target/arm/tcg/translate-a64.c |
... | ... | ||
327 | - break; | 328 | - break; |
328 | - case 0x7d: /* FRSQRTE */ | 329 | - case 0x7d: /* FRSQRTE */ |
329 | - gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); | 330 | - gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus); |
330 | - break; | 331 | - break; |
331 | - default: | 332 | - default: |
332 | - case 0x6f: /* FNEG */ | ||
333 | - case 0x1a: /* FCVTNS */ | 333 | - case 0x1a: /* FCVTNS */ |
334 | - case 0x1b: /* FCVTMS */ | 334 | - case 0x1b: /* FCVTMS */ |
335 | - case 0x1c: /* FCVTAS */ | 335 | - case 0x1c: /* FCVTAS */ |
336 | - case 0x3a: /* FCVTPS */ | 336 | - case 0x3a: /* FCVTPS */ |
337 | - case 0x3b: /* FCVTZS */ | 337 | - case 0x3b: /* FCVTZS */ |
... | ... | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
23 | #include "tcg/helper-sve.h" | 23 | #include "tcg/helper-sve.h" |
24 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h | 24 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h |
25 | index XXXXXXX..XXXXXXX 100644 | 25 | index XXXXXXX..XXXXXXX 100644 |
26 | --- a/target/arm/tcg/translate.h | 26 | --- a/target/arm/tcg/translate.h |
27 | +++ b/target/arm/tcg/translate.h | 27 | +++ b/target/arm/tcg/translate.h |
28 | @@ -XXX,XX +XXX,XX @@ void gen_gvec_uaddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | 28 | @@ -XXX,XX +XXX,XX @@ void gen_gvec_fabs(unsigned vece, uint32_t dofs, uint32_t aofs, |
29 | void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | 29 | void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs, |
30 | uint32_t opr_sz, uint32_t max_sz); | 30 | uint32_t oprsz, uint32_t maxsz); |
31 | 31 | ||
32 | +void gen_gvec_urecpe(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | 32 | +void gen_gvec_urecpe(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, |
33 | + uint32_t opr_sz, uint32_t max_sz); | 33 | + uint32_t opr_sz, uint32_t max_sz); |
34 | +void gen_gvec_ursqrte(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | 34 | +void gen_gvec_ursqrte(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, |
35 | + uint32_t opr_sz, uint32_t max_sz); | 35 | + uint32_t opr_sz, uint32_t max_sz); |
... | ... | ||
39 | */ | 39 | */ |
40 | diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c | 40 | diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c |
41 | index XXXXXXX..XXXXXXX 100644 | 41 | index XXXXXXX..XXXXXXX 100644 |
42 | --- a/target/arm/tcg/gengvec.c | 42 | --- a/target/arm/tcg/gengvec.c |
43 | +++ b/target/arm/tcg/gengvec.c | 43 | +++ b/target/arm/tcg/gengvec.c |
44 | @@ -XXX,XX +XXX,XX @@ void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | 44 | @@ -XXX,XX +XXX,XX @@ void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs, |
45 | assert(vece <= MO_32); | 45 | uint64_t s_bit = 1ull << ((8 << vece) - 1); |
46 | tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]); | 46 | tcg_gen_gvec_xori(vece, dofs, aofs, s_bit, oprsz, maxsz); |
47 | } | 47 | } |
48 | + | 48 | + |
49 | +void gen_gvec_urecpe(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | 49 | +void gen_gvec_urecpe(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, |
50 | + uint32_t opr_sz, uint32_t max_sz) | 50 | + uint32_t opr_sz, uint32_t max_sz) |
51 | +{ | 51 | +{ |
... | ... | diff view generated by jsdifflib |
1 | Remove handle_2misc_reciprocal as these were the last | 1 | Remove handle_2misc_reciprocal as these were the last |
---|---|---|---|
2 | insns decoded by that function. | 2 | insns decoded by that function. |
3 | 3 | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 5 | --- |
6 | target/arm/tcg/translate-a64.c | 139 ++------------------------------- | 6 | target/arm/tcg/translate-a64.c | 139 ++------------------------------- |
7 | target/arm/tcg/a64.decode | 3 + | 7 | target/arm/tcg/a64.decode | 3 + |
8 | 2 files changed, 8 insertions(+), 134 deletions(-) | 8 | 2 files changed, 8 insertions(+), 134 deletions(-) |
9 | 9 | ||
10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 10 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/arm/tcg/translate-a64.c | 12 | --- a/target/arm/tcg/translate-a64.c |
13 | +++ b/target/arm/tcg/translate-a64.c | 13 | +++ b/target/arm/tcg/translate-a64.c |
14 | @@ -XXX,XX +XXX,XX @@ TRANS(CMLE0_v, do_gvec_fn2, a, gen_gvec_cle0) | 14 | @@ -XXX,XX +XXX,XX @@ TRANS(CMLE0_v, do_gvec_fn2, a, gen_gvec_cle0) |
15 | TRANS(CMEQ0_v, do_gvec_fn2, a, gen_gvec_ceq0) | 15 | TRANS(CMEQ0_v, do_gvec_fn2, a, gen_gvec_ceq0) |
16 | TRANS(REV16_v, do_gvec_fn2, a, gen_gvec_rev16) | 16 | TRANS(REV16_v, do_gvec_fn2, a, gen_gvec_rev16) |
17 | TRANS(REV32_v, do_gvec_fn2, a, gen_gvec_rev32) | 17 | TRANS(REV32_v, do_gvec_fn2, a, gen_gvec_rev32) |
18 | +TRANS(URECPE_v, do_gvec_fn2, a, gen_gvec_urecpe) | 18 | +TRANS(URECPE_v, do_gvec_fn2, a, gen_gvec_urecpe) |
19 | +TRANS(URSQRTE_v, do_gvec_fn2, a, gen_gvec_ursqrte) | 19 | +TRANS(URSQRTE_v, do_gvec_fn2, a, gen_gvec_ursqrte) |
20 | 20 | ||
21 | static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn) | 21 | static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn) |
22 | { | 22 | { |
23 | @@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_frsqrte[] = { | 23 | @@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_frsqrte[] = { |
24 | }; | 24 | }; |
25 | TRANS(FRSQRTE_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_frsqrte) | 25 | TRANS(FRSQRTE_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_frsqrte) |
26 | 26 | ||
27 | -static void handle_2misc_reciprocal(DisasContext *s, int opcode, | 27 | -static void handle_2misc_reciprocal(DisasContext *s, int opcode, |
28 | - bool is_scalar, bool is_u, bool is_q, | 28 | - bool is_scalar, bool is_u, bool is_q, |
29 | - int size, int rn, int rd) | 29 | - int size, int rn, int rd) |
30 | -{ | 30 | -{ |
31 | - bool is_double = (size == 3); | 31 | - bool is_double = (size == 3); |
32 | - | 32 | - |
33 | - if (is_double) { | 33 | - if (is_double) { |
34 | - g_assert_not_reached(); | 34 | - g_assert_not_reached(); |
35 | - } else { | 35 | - } else { |
36 | - TCGv_i32 tcg_op = tcg_temp_new_i32(); | 36 | - TCGv_i32 tcg_op = tcg_temp_new_i32(); |
37 | - TCGv_i32 tcg_res = tcg_temp_new_i32(); | 37 | - TCGv_i32 tcg_res = tcg_temp_new_i32(); |
38 | - int pass, maxpasses; | 38 | - int pass, maxpasses; |
39 | - | 39 | - |
40 | - if (is_scalar) { | 40 | - if (is_scalar) { |
41 | - maxpasses = 1; | 41 | - maxpasses = 1; |
42 | - } else { | 42 | - } else { |
43 | - maxpasses = is_q ? 4 : 2; | 43 | - maxpasses = is_q ? 4 : 2; |
44 | - } | 44 | - } |
45 | - | 45 | - |
46 | - for (pass = 0; pass < maxpasses; pass++) { | 46 | - for (pass = 0; pass < maxpasses; pass++) { |
47 | - read_vec_element_i32(s, tcg_op, rn, pass, MO_32); | 47 | - read_vec_element_i32(s, tcg_op, rn, pass, MO_32); |
48 | - | 48 | - |
49 | - switch (opcode) { | 49 | - switch (opcode) { |
50 | - case 0x3c: /* URECPE */ | 50 | - case 0x3c: /* URECPE */ |
51 | - gen_helper_recpe_u32(tcg_res, tcg_op); | 51 | - gen_helper_recpe_u32(tcg_res, tcg_op); |
52 | - break; | 52 | - break; |
53 | - case 0x3d: /* FRECPE */ | 53 | - case 0x3d: /* FRECPE */ |
54 | - case 0x3f: /* FRECPX */ | 54 | - case 0x3f: /* FRECPX */ |
55 | - case 0x7d: /* FRSQRTE */ | 55 | - case 0x7d: /* FRSQRTE */ |
56 | - default: | 56 | - default: |
57 | - g_assert_not_reached(); | 57 | - g_assert_not_reached(); |
58 | - } | 58 | - } |
59 | - | 59 | - |
60 | - if (is_scalar) { | 60 | - if (is_scalar) { |
61 | - write_fp_sreg(s, rd, tcg_res); | 61 | - write_fp_sreg(s, rd, tcg_res); |
62 | - } else { | 62 | - } else { |
63 | - write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | 63 | - write_vec_element_i32(s, tcg_res, rd, pass, MO_32); |
64 | - } | 64 | - } |
65 | - } | 65 | - } |
66 | - if (!is_scalar) { | 66 | - if (!is_scalar) { |
67 | - clear_vec_high(s, is_q, rd); | 67 | - clear_vec_high(s, is_q, rd); |
68 | - } | 68 | - } |
69 | - } | 69 | - } |
70 | -} | 70 | -} |
71 | - | 71 | - |
72 | static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, | 72 | static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, |
73 | int size, int rn, int rd) | 73 | int size, int rn, int rd) |
74 | { | 74 | { |
75 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 75 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
76 | bool is_q = extract32(insn, 30, 1); | 76 | bool is_q = extract32(insn, 30, 1); |
77 | int rn = extract32(insn, 5, 5); | 77 | int rn = extract32(insn, 5, 5); |
78 | int rd = extract32(insn, 0, 5); | 78 | int rd = extract32(insn, 0, 5); |
79 | - bool need_fpstatus = false; | 79 | - bool need_fpstatus = false; |
80 | - int rmode = -1; | 80 | - int rmode = -1; |
81 | - TCGv_i32 tcg_rmode; | 81 | - TCGv_i32 tcg_rmode; |
82 | - TCGv_ptr tcg_fpstatus; | 82 | - TCGv_ptr tcg_fpstatus; |
83 | 83 | ||
84 | switch (opcode) { | 84 | switch (opcode) { |
85 | case 0xc ... 0xf: | 85 | case 0xc ... 0xf: |
86 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 86 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
87 | opcode |= (extract32(size, 1, 1) << 5) | (u << 6); | 87 | opcode |= (extract32(size, 1, 1) << 5) | (u << 6); |
88 | size = is_double ? 3 : 2; | 88 | size = is_double ? 3 : 2; |
89 | switch (opcode) { | 89 | switch (opcode) { |
90 | - case 0x3c: /* URECPE */ | 90 | - case 0x3c: /* URECPE */ |
91 | - if (size == 3) { | 91 | - if (size == 3) { |
92 | - unallocated_encoding(s); | 92 | - unallocated_encoding(s); |
93 | - return; | 93 | - return; |
94 | - } | 94 | - } |
95 | - if (!fp_access_check(s)) { | 95 | - if (!fp_access_check(s)) { |
96 | - return; | 96 | - return; |
97 | - } | 97 | - } |
98 | - handle_2misc_reciprocal(s, opcode, false, u, is_q, size, rn, rd); | 98 | - handle_2misc_reciprocal(s, opcode, false, u, is_q, size, rn, rd); |
99 | - return; | 99 | - return; |
100 | case 0x17: /* FCVTL, FCVTL2 */ | 100 | case 0x17: /* FCVTL, FCVTL2 */ |
101 | if (!fp_access_check(s)) { | 101 | if (!fp_access_check(s)) { |
102 | return; | 102 | return; |
103 | } | 103 | } |
104 | handle_2misc_widening(s, opcode, is_q, size, rn, rd); | 104 | handle_2misc_widening(s, opcode, is_q, size, rn, rd); |
105 | return; | 105 | return; |
106 | - case 0x7c: /* URSQRTE */ | 106 | - case 0x7c: /* URSQRTE */ |
107 | - if (size == 3) { | 107 | - if (size == 3) { |
108 | - unallocated_encoding(s); | 108 | - unallocated_encoding(s); |
109 | - return; | 109 | - return; |
110 | - } | 110 | - } |
111 | - break; | 111 | - break; |
112 | default: | 112 | default: |
113 | case 0x16: /* FCVTN, FCVTN2 */ | 113 | case 0x16: /* FCVTN, FCVTN2 */ |
114 | case 0x36: /* BFCVTN, BFCVTN2 */ | 114 | case 0x36: /* BFCVTN, BFCVTN2 */ |
115 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 115 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
116 | case 0x6d: /* FCMLE (zero) */ | 116 | case 0x6d: /* FCMLE (zero) */ |
117 | case 0x3d: /* FRECPE */ | 117 | case 0x3d: /* FRECPE */ |
118 | case 0x7d: /* FRSQRTE */ | 118 | case 0x7d: /* FRSQRTE */ |
119 | + case 0x3c: /* URECPE */ | 119 | + case 0x3c: /* URECPE */ |
120 | + case 0x7c: /* URSQRTE */ | 120 | + case 0x7c: /* URSQRTE */ |
121 | unallocated_encoding(s); | 121 | unallocated_encoding(s); |
122 | return; | 122 | return; |
123 | } | 123 | } |
124 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | 124 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) |
125 | unallocated_encoding(s); | 125 | unallocated_encoding(s); |
126 | return; | 126 | return; |
127 | } | 127 | } |
128 | - | 128 | - |
129 | - if (!fp_access_check(s)) { | 129 | - if (!fp_access_check(s)) { |
130 | - return; | 130 | - return; |
131 | - } | 131 | - } |
132 | - | 132 | - |
133 | - if (need_fpstatus || rmode >= 0) { | 133 | - if (need_fpstatus || rmode >= 0) { |
134 | - tcg_fpstatus = fpstatus_ptr(FPST_FPCR); | 134 | - tcg_fpstatus = fpstatus_ptr(FPST_FPCR); |
135 | - } else { | 135 | - } else { |
136 | - tcg_fpstatus = NULL; | 136 | - tcg_fpstatus = NULL; |
137 | - } | 137 | - } |
138 | - if (rmode >= 0) { | 138 | - if (rmode >= 0) { |
139 | - tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus); | 139 | - tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus); |
140 | - } else { | 140 | - } else { |
141 | - tcg_rmode = NULL; | 141 | - tcg_rmode = NULL; |
142 | - } | 142 | - } |
143 | - | 143 | - |
144 | - { | 144 | - { |
145 | - int pass; | 145 | - int pass; |
146 | - | 146 | - |
147 | - assert(size == 2); | 147 | - assert(size == 2); |
148 | - for (pass = 0; pass < (is_q ? 4 : 2); pass++) { | 148 | - for (pass = 0; pass < (is_q ? 4 : 2); pass++) { |
149 | - TCGv_i32 tcg_op = tcg_temp_new_i32(); | 149 | - TCGv_i32 tcg_op = tcg_temp_new_i32(); |
150 | - TCGv_i32 tcg_res = tcg_temp_new_i32(); | 150 | - TCGv_i32 tcg_res = tcg_temp_new_i32(); |
151 | - | 151 | - |
152 | - read_vec_element_i32(s, tcg_op, rn, pass, MO_32); | 152 | - read_vec_element_i32(s, tcg_op, rn, pass, MO_32); |
153 | - | 153 | - |
154 | - { | 154 | - { |
155 | - /* Special cases for 32 bit elements */ | 155 | - /* Special cases for 32 bit elements */ |
156 | - switch (opcode) { | 156 | - switch (opcode) { |
157 | - case 0x7c: /* URSQRTE */ | 157 | - case 0x7c: /* URSQRTE */ |
158 | - gen_helper_rsqrte_u32(tcg_res, tcg_op); | 158 | - gen_helper_rsqrte_u32(tcg_res, tcg_op); |
159 | - break; | 159 | - break; |
160 | - default: | 160 | - default: |
161 | - case 0x7: /* SQABS, SQNEG */ | 161 | - case 0x7: /* SQABS, SQNEG */ |
162 | - case 0x2f: /* FABS */ | 162 | - case 0x2f: /* FABS */ |
163 | - case 0x6f: /* FNEG */ | 163 | - case 0x6f: /* FNEG */ |
164 | - case 0x7f: /* FSQRT */ | 164 | - case 0x7f: /* FSQRT */ |
165 | - case 0x18: /* FRINTN */ | 165 | - case 0x18: /* FRINTN */ |
166 | - case 0x19: /* FRINTM */ | 166 | - case 0x19: /* FRINTM */ |
167 | - case 0x38: /* FRINTP */ | 167 | - case 0x38: /* FRINTP */ |
168 | - case 0x39: /* FRINTZ */ | 168 | - case 0x39: /* FRINTZ */ |
169 | - case 0x58: /* FRINTA */ | 169 | - case 0x58: /* FRINTA */ |
170 | - case 0x79: /* FRINTI */ | 170 | - case 0x79: /* FRINTI */ |
171 | - case 0x59: /* FRINTX */ | 171 | - case 0x59: /* FRINTX */ |
172 | - case 0x1e: /* FRINT32Z */ | 172 | - case 0x1e: /* FRINT32Z */ |
173 | - case 0x5e: /* FRINT32X */ | 173 | - case 0x5e: /* FRINT32X */ |
174 | - case 0x1f: /* FRINT64Z */ | 174 | - case 0x1f: /* FRINT64Z */ |
175 | - case 0x5f: /* FRINT64X */ | 175 | - case 0x5f: /* FRINT64X */ |
176 | - case 0x1a: /* FCVTNS */ | 176 | - case 0x1a: /* FCVTNS */ |
177 | - case 0x1b: /* FCVTMS */ | 177 | - case 0x1b: /* FCVTMS */ |
178 | - case 0x1c: /* FCVTAS */ | 178 | - case 0x1c: /* FCVTAS */ |
179 | - case 0x3a: /* FCVTPS */ | 179 | - case 0x3a: /* FCVTPS */ |
180 | - case 0x3b: /* FCVTZS */ | 180 | - case 0x3b: /* FCVTZS */ |
181 | - case 0x5a: /* FCVTNU */ | 181 | - case 0x5a: /* FCVTNU */ |
182 | - case 0x5b: /* FCVTMU */ | 182 | - case 0x5b: /* FCVTMU */ |
183 | - case 0x5c: /* FCVTAU */ | 183 | - case 0x5c: /* FCVTAU */ |
184 | - case 0x7a: /* FCVTPU */ | 184 | - case 0x7a: /* FCVTPU */ |
185 | - case 0x7b: /* FCVTZU */ | 185 | - case 0x7b: /* FCVTZU */ |
186 | - g_assert_not_reached(); | 186 | - g_assert_not_reached(); |
187 | - } | 187 | - } |
188 | - } | 188 | - } |
189 | - write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | 189 | - write_vec_element_i32(s, tcg_res, rd, pass, MO_32); |
190 | - } | 190 | - } |
191 | - } | 191 | - } |
192 | - clear_vec_high(s, is_q, rd); | 192 | - clear_vec_high(s, is_q, rd); |
193 | - | 193 | - |
194 | - if (tcg_rmode) { | 194 | - if (tcg_rmode) { |
195 | - gen_restore_rmode(tcg_rmode, tcg_fpstatus); | 195 | - gen_restore_rmode(tcg_rmode, tcg_fpstatus); |
196 | - } | 196 | - } |
197 | + g_assert_not_reached(); | 197 | + g_assert_not_reached(); |
198 | } | 198 | } |
199 | 199 | ||
200 | /* C3.6 Data processing - SIMD, inc Crypto | 200 | /* C3.6 Data processing - SIMD, inc Crypto |
201 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode | 201 | diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode |
202 | index XXXXXXX..XXXXXXX 100644 | 202 | index XXXXXXX..XXXXXXX 100644 |
203 | --- a/target/arm/tcg/a64.decode | 203 | --- a/target/arm/tcg/a64.decode |
204 | +++ b/target/arm/tcg/a64.decode | 204 | +++ b/target/arm/tcg/a64.decode |
205 | @@ -XXX,XX +XXX,XX @@ FRECPE_v 0.00 1110 1.1 00001 11011 0 ..... ..... @qrr_sd | 205 | @@ -XXX,XX +XXX,XX @@ FRECPE_v 0.00 1110 1.1 00001 11011 0 ..... ..... @qrr_sd |
206 | FRSQRTE_v 0.10 1110 111 11001 11011 0 ..... ..... @qrr_h | 206 | FRSQRTE_v 0.10 1110 111 11001 11011 0 ..... ..... @qrr_h |
207 | FRSQRTE_v 0.10 1110 1.1 00001 11011 0 ..... ..... @qrr_sd | 207 | FRSQRTE_v 0.10 1110 1.1 00001 11011 0 ..... ..... @qrr_sd |
208 | 208 | ||
209 | +URECPE_v 0.00 1110 101 00001 11001 0 ..... ..... @qrr_s | 209 | +URECPE_v 0.00 1110 101 00001 11001 0 ..... ..... @qrr_s |
210 | +URSQRTE_v 0.10 1110 101 00001 11001 0 ..... ..... @qrr_s | 210 | +URSQRTE_v 0.10 1110 101 00001 11001 0 ..... ..... @qrr_s |
211 | + | 211 | + |
212 | &fcvt_q rd rn esz q shift | 212 | &fcvt_q rd rn esz q shift |
213 | @fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \ | 213 | @fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \ |
214 | &fcvt_q esz=1 shift=%fcvt_f_sh_h | 214 | &fcvt_q esz=1 shift=%fcvt_f_sh_h |
215 | -- | 215 | -- |
216 | 2.43.0 | 216 | 2.43.0 | diff view generated by jsdifflib |
1 | Remove lookup_disas_fn, handle_2misc_widening, | 1 | Remove lookup_disas_fn, handle_2misc_widening, |
---|---|---|---|
2 | disas_simd_two_reg_misc, disas_data_proc_simd, | 2 | disas_simd_two_reg_misc, disas_data_proc_simd, |
3 | disas_data_proc_simd_fp, disas_a64_legacy, as | 3 | disas_data_proc_simd_fp, disas_a64_legacy, as |
4 | this is the final insn to be converted. | 4 | this is the final insn to be converted. |
5 | 5 | ||
6 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
7 | --- | 8 | --- |
8 | target/arm/tcg/translate-a64.c | 202 +++------------------------------ | 9 | target/arm/tcg/translate-a64.c | 202 +++------------------------------ |
9 | target/arm/tcg/a64.decode | 2 + | 10 | target/arm/tcg/a64.decode | 2 + |
10 | 2 files changed, 18 insertions(+), 186 deletions(-) | 11 | 2 files changed, 18 insertions(+), 186 deletions(-) |
... | ... | ||
181 | - return; | 182 | - return; |
182 | - } | 183 | - } |
183 | - break; | 184 | - break; |
184 | - } | 185 | - } |
185 | - default: | 186 | - default: |
186 | - case 0x0: /* REV64 */ | 187 | - case 0x0: /* REV64, REV32 */ |
187 | - case 0x1: /* REV16, REV32 */ | 188 | - case 0x1: /* REV16 */ |
188 | - case 0x2: /* SADDLP, UADDLP */ | 189 | - case 0x2: /* SADDLP, UADDLP */ |
189 | - case 0x3: /* SUQADD, USQADD */ | 190 | - case 0x3: /* SUQADD, USQADD */ |
190 | - case 0x4: /* CLS, CLZ */ | 191 | - case 0x4: /* CLS, CLZ */ |
191 | - case 0x5: /* CNT, NOT, RBIT */ | 192 | - case 0x5: /* CNT, NOT, RBIT */ |
192 | - case 0x6: /* SADALP, UADALP */ | 193 | - case 0x6: /* SADALP, UADALP */ |
... | ... | diff view generated by jsdifflib |