]> sourceware.org Git - cgen.git/commit
Compute correct mask and values when offset in define-ifield is not 0.
authorGuillermo E. Martinez <guillermo.e.martinez@oracle.com>
Wed, 15 Sep 2021 16:47:40 +0000 (18:47 +0200)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Wed, 15 Sep 2021 16:47:40 +0000 (18:47 +0200)
commitd1dd5fcc38eadcc7c88c49576431b0c4a0acbe58
tree91c679c1b33ed0a82169c16a5c1f62ca3844615c
parentf216b622e1205ca839d7b54b5270dab9ba98ee88
Compute correct mask and values when offset in define-ifield is not 0.

If an instruction field is defined in a long form, assigning
an offset different to 0 the mask and constant values are not
computed appropriately:

(dwf f-op-fld-offset "field with an offset" (all-isas) 32 64 31 32 UINT)
;;
;; 63              39  32 31         7            0
;; +---------------------+-------....-------------+
;; |/////////////////////|           |            |
;; +---------------------+-------....-------------+
;;           |
;;           |
;;           |
;;           |
;;           +---> OP_FLD_OFFSET_...

bitrange: #(object <bitrange> 29 32 31 32 64 #t)
mask: 0xffffffff
value: simplify.inc:173:3: Error: Instruction has opcode
       bits outside of its mask.

Fixed to:

bitrange: #(object <bitrange> 29 32 31 32 64 #t)
mask: 0xffffffff00000000
value:      0xaa00000000

word-length relies in base-len (sum of length of all fields
in bitrange objects that conform the instruction), word-value
and word-mask are not using the offset entry in the bitrange
object to calculate the accurate values when constant fields
are provided (ifld-constant? #t), so one more argument
is passed to those procedures to be used in the compute.

Regression tests to the following targets were done:

bpf arm-linuxeabi arm-nacl arm-netbsdelf arm-nto arm-pe
arm-symbianelf arm-vxworks arm-wince-pe aarch64-linux alpha-dec-vms
alpha-linux alpha-linuxecoff alpha-netbsd alpha-unknown-freebsd4.7
am33_2.0-linux arc-linux-uclibc avr-elf bfin-elf cr16-elf cris-elf
crisv32-linux crx-elf d10v-elf d30v-elf dlx-elf epiphany-elf fr30-elf
frv-elf frv-linux ft32-elf h8300-elf hppa-linux hppa-hp-hpux10
hppa64-hp-hpux11.23 hppa64-linux mips-linux mips-vxworks mips64-linux
mipsel-linux-gnu mipsisa32el-linux mips64-openbsd mipstx39-elf
ia64-elf ia64-freebsd5 ia64-hpux ia64-linux ia64-netbsd ia64-vms
ip2k-elf iq2000-elf lm32-elf m32c-elf m32r-elf m68hc11-elf
m68hc12-elf m68k-elf m68k-linux m68k-netbsd mcore-elf mcore-pe
mep-elf metag-linux microblaze-elf mmix mn10200-elf mn10300-elf
moxie-elf ms1-elf msp430-elf mt-elf nds32le-elf nios2-linux or1k-elf
pdp11-dec-aout pj-elf powerpc-eabisim powerpc-eabivle powerpc-linux
powerpc-nto powerpc-wrs-vxworks powerpc64-linux powerpcle-cygwin
powerpcle-elf powerpc64le-linux ppc-lynxos pru-elf riscv32-elf
riscv64-elf rl78-elf rs6000-aix4.3.3 rs6000-aix5.1 rx-elf s390-linux
s390x-linux score-elf sh-linux sh-nto sh-pe sh-rtems sh-vxworks
shl-unknown-netbsdelf sparc-aout sparc-linux sparc-vxworks
sparc64-linux sparc-sun-solaris2.12 spu-elf tic30-unknown-aout
tic30-unknown-coff tic4x-coff tic54x-coff tic6x-elf tilegx-linux
tilepro-linux v850-elf vax-netbsdelf visium-elf i386-darwin
i386-lynxos i586-linux i686-nacl i686-pc-beos i686-pc-elf i686-pe
i686-vxworks x86_64-linux x86_64-w64-mingw32 x86_64-nacl xgate-elf
xstormy16-elf xtensa-elf z8k-coff z80-coff.

2021-09-15  Guillermo E. Martinez  <guillermo.e.martinez@oracle.com>

* ifield.scm: word-len has a relative value depending of word-offset
value, method field-value use word-offset parameter.
* insn.scm: remove condition ifld-beyond-base? in insn-base-value
procedure to allow field access when its offset is different to zero.
* utils.scm: word-value/work-mask accept an offset as argument to
compute the mask and get the value when offset is different that zero.
ChangeLog
ifield.scm
insn.scm
utils.scm
This page took 0.046916 seconds and 5 git commands to generate.