static CGEN_INSN_LIST * hash_insn_list (CGEN_CPU_DESC cd, const CGEN_INSN_LIST *insns, CGEN_INSN_LIST **htable, CGEN_INSN_LIST *hentbuf) { int big_p = CGEN_CPU_ENDIAN (cd) == CGEN_ENDIAN_BIG; const CGEN_INSN_LIST *ilist; for (ilist = insns; ilist != NULL; ilist = ilist->next, ++ hentbuf) { unsigned int hash; char buf[4]; unsigned long value; if (! (* cd->dis_hash_p) (ilist->insn)) continue; /* We don't know whether the target uses the buffer or the base insn to hash on, so set both up. */ value = CGEN_INSN_BASE_VALUE (ilist->insn); bfd_put_bits((bfd_vma) value, buf, CGEN_INSN_MASK_BITSIZE (ilist->insn), big_p); hash = (* cd->dis_hash) (buf, value); add_insn_to_hash_chain (hentbuf, ilist->insn, htable, hash); } return hentbuf; }
void cgen_put_insn_value (CGEN_CPU_DESC cd, unsigned char *buf, int length, CGEN_INSN_INT value) { int big_p = (cd->insn_endian == CGEN_ENDIAN_BIG); int insn_chunk_bitsize = cd->insn_chunk_bitsize; if (insn_chunk_bitsize != 0 && insn_chunk_bitsize < length) { /* We need to divide up the incoming value into insn_chunk_bitsize-length segments, and endian-convert them, one at a time. */ int i; /* Enforce divisibility. */ if ((length % insn_chunk_bitsize) != 0) abort (); for (i = 0; i < length; i += insn_chunk_bitsize) /* NB: i == bits */ { int bit_index; bit_index = (length - insn_chunk_bitsize - i); /* NB: not dependent on endianness! */ bfd_put_bits ((bfd_vma) value, & buf[bit_index / 8], insn_chunk_bitsize, big_p); value >>= insn_chunk_bitsize; } }
static CGEN_INSN_LIST * hash_insn_array (CGEN_CPU_DESC cd, const CGEN_INSN * insns, int count, int entsize ATTRIBUTE_UNUSED, CGEN_INSN_LIST ** htable, CGEN_INSN_LIST * hentbuf) { int big_p = CGEN_CPU_ENDIAN (cd) == CGEN_ENDIAN_BIG; int i; for (i = count - 1; i >= 0; --i, ++hentbuf) { unsigned int hash; char buf [4]; unsigned long value; const CGEN_INSN *insn = &insns[i]; if (! (* cd->dis_hash_p) (insn)) continue; /* We don't know whether the target uses the buffer or the base insn to hash on, so set both up. */ value = CGEN_INSN_BASE_VALUE (insn); bfd_put_bits ((bfd_vma) value, buf, CGEN_INSN_MASK_BITSIZE (insn), big_p); hash = (* cd->dis_hash) (buf, value); add_insn_to_hash_chain (hentbuf, insn, htable, hash); } return hentbuf; }