Re: [PULL 17/21] target/hexagon: prepare input for the idef-parser

2022-12-31 Thread Alessandro Di Federico via
On Thu, 29 Dec 2022 11:41:22 +0100
Thomas Huth  wrote:

> I'm now seeing changes to scripts/meson-buildoptions.sh after
> rebuilding QEMU ... looks like you likely forgot to update that file
> with the automatic update after changing meson_options.txt ?

Ah, there seems to be another couple of unrelated missing updates to
scripts/meson-buildoptions.sh.

`Makefile` seems to rely on modification dates of files in the source
tree, but git does not track those.

git clone ...
mkdir build
./configure ...
make update-buildoptions # Does nothing
touch ../meson_options.txt
make update-buildoptions # Actually makes changes

Also, AFAIU the `update-buildoptions` target is not available in ninja.
However maybe this is not a bug since the doc says to use make.

Anyway, patch coming soon!

-- 
Alessandro Di Federico
rev.ng Labs



Re: [PULL 17/21] target/hexagon: prepare input for the idef-parser

2022-12-29 Thread Thomas Huth

On 16/12/2022 21.48, Taylor Simpson wrote:

From: Alessandro Di Federico 

Introduce infrastructure necessary to produce a file suitable for being
parsed by the idef-parser. A build option is also added to fully disable
the output of idef-parser, which is useful for debugging.

Signed-off-by: Alessandro Di Federico 
Signed-off-by: Anton Johansson 
Signed-off-by: Taylor Simpson 
Reviewed-by: Taylor Simpson 
Message-Id: <20220923173831.227551-8-a...@rev.ng>
---
  meson_options.txt   |   3 +
  target/hexagon/gen_idef_parser_funcs.py | 130 ++
  target/hexagon/idef-parser/macros.inc   | 140 
  target/hexagon/idef-parser/prepare  |  24 
  target/hexagon/meson.build  |  20 
  5 files changed, 317 insertions(+)
  create mode 100644 target/hexagon/gen_idef_parser_funcs.py
  create mode 100644 target/hexagon/idef-parser/macros.inc
  create mode 100755 target/hexagon/idef-parser/prepare

diff --git a/meson_options.txt b/meson_options.txt
index 4b749ca549..559a571b6b 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -321,3 +321,6 @@ option('profiler', type: 'boolean', value: false,
 description: 'profiler support')
  option('slirp_smbd', type : 'feature', value : 'auto',
 description: 'use smbd (at path --smbd=*) in slirp networking')
+
+option('hexagon_idef_parser', type : 'boolean', value : true,
+   description: 'use idef-parser to automatically generate TCG code for 
the Hexagon frontend')



I'm now seeing changes to scripts/meson-buildoptions.sh after rebuilding 
QEMU ... looks like you likely forgot to update that file with the automatic 
update after changing meson_options.txt ?


 Thomas




[PULL 17/21] target/hexagon: prepare input for the idef-parser

2022-12-16 Thread Taylor Simpson
From: Alessandro Di Federico 

Introduce infrastructure necessary to produce a file suitable for being
parsed by the idef-parser. A build option is also added to fully disable
the output of idef-parser, which is useful for debugging.

Signed-off-by: Alessandro Di Federico 
Signed-off-by: Anton Johansson 
Signed-off-by: Taylor Simpson 
Reviewed-by: Taylor Simpson 
Message-Id: <20220923173831.227551-8-a...@rev.ng>
---
 meson_options.txt   |   3 +
 target/hexagon/gen_idef_parser_funcs.py | 130 ++
 target/hexagon/idef-parser/macros.inc   | 140 
 target/hexagon/idef-parser/prepare  |  24 
 target/hexagon/meson.build  |  20 
 5 files changed, 317 insertions(+)
 create mode 100644 target/hexagon/gen_idef_parser_funcs.py
 create mode 100644 target/hexagon/idef-parser/macros.inc
 create mode 100755 target/hexagon/idef-parser/prepare

diff --git a/meson_options.txt b/meson_options.txt
index 4b749ca549..559a571b6b 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -321,3 +321,6 @@ option('profiler', type: 'boolean', value: false,
description: 'profiler support')
 option('slirp_smbd', type : 'feature', value : 'auto',
description: 'use smbd (at path --smbd=*) in slirp networking')
+
+option('hexagon_idef_parser', type : 'boolean', value : true,
+   description: 'use idef-parser to automatically generate TCG code for 
the Hexagon frontend')
diff --git a/target/hexagon/gen_idef_parser_funcs.py 
b/target/hexagon/gen_idef_parser_funcs.py
new file mode 100644
index 00..917753d6d8
--- /dev/null
+++ b/target/hexagon/gen_idef_parser_funcs.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+
+##
+##  Copyright(c) 2019-2022 rev.ng Labs Srl. All Rights Reserved.
+##
+##  This program is free software; you can redistribute it and/or modify
+##  it under the terms of the GNU General Public License as published by
+##  the Free Software Foundation; either version 2 of the License, or
+##  (at your option) any later version.
+##
+##  This program is distributed in the hope that it will be useful,
+##  but WITHOUT ANY WARRANTY; without even the implied warranty of
+##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##  GNU General Public License for more details.
+##
+##  You should have received a copy of the GNU General Public License
+##  along with this program; if not, see .
+##
+
+import sys
+import re
+import string
+from io import StringIO
+
+import hex_common
+
+##
+## Generate code to be fed to the idef_parser
+##
+## Consider A2_add:
+##
+## Rd32=add(Rs32,Rt32), { RdV=RsV+RtV;}
+##
+## We produce:
+##
+## A2_add(RdV, in RsV, in RtV) {
+##   { RdV=RsV+RtV;}
+## }
+##
+## A2_add represents the instruction tag. Then we have a list of TCGv
+## that the code generated by the parser can expect in input. Some of
+## them are inputs ("in" prefix), while some others are outputs.
+##
+def main():
+hex_common.read_semantics_file(sys.argv[1])
+hex_common.read_attribs_file(sys.argv[2])
+hex_common.calculate_attribs()
+tagregs = hex_common.get_tagregs()
+tagimms = hex_common.get_tagimms()
+
+with open(sys.argv[3], 'w') as f:
+f.write('#include "macros.inc"\n\n')
+
+for tag in hex_common.tags:
+## Skip the priv instructions
+if ( "A_PRIV" in hex_common.attribdict[tag] ) :
+continue
+## Skip the guest instructions
+if ( "A_GUEST" in hex_common.attribdict[tag] ) :
+continue
+## Skip instructions that saturate in a ternary expression
+if ( tag in {'S2_asr_r_r_sat', 'S2_asl_r_r_sat'} ) :
+continue
+## Skip instructions using switch
+if ( tag in {'S4_vrcrotate_acc', 'S4_vrcrotate'} ) :
+continue
+## Skip trap instructions
+if ( tag in {'J2_trap0', 'J2_trap1'} ) :
+continue
+## Skip 128-bit instructions
+if ( tag in {'A7_croundd_ri', 'A7_croundd_rr'} ) :
+continue
+if ( tag in {'M7_wcmpyrw', 'M7_wcmpyrwc',
+ 'M7_wcmpyiw', 'M7_wcmpyiwc',
+ 'M7_wcmpyrw_rnd', 'M7_wcmpyrwc_rnd',
+ 'M7_wcmpyiw_rnd', 'M7_wcmpyiwc_rnd'} ) :
+continue
+## Skip interleave/deinterleave instructions
+if ( tag in {'S2_interleave', 'S2_deinterleave'} ) :
+continue
+## Skip instructions using bit reverse
+if ( tag in {'S2_brev', 'S2_brevp', 'S2_ct0', 'S2_ct1',
+ 'S2_ct0p', 'S2_ct1p', 'A4_tlbmatch'} ) :
+continue
+## Skip other unsupported instructions
+if ( tag == 'S2_cabacdecbin' or tag == 'A5_ACS' ) :
+continue
+if ( tag.startswith('Y') ) :
+continue
+