/* GENERATED FILE */
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#include "decode.h"
#include "decode2.h"
#include "pcode.h"
#include "decode_fields32.h"

/* abs_advsimd.xml */
int ABS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ABS_asisdmisc_R */
	/* 01|U=0|11110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E20B800) {
		decode_fields32(ENC_ABS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->neg = (dec->U==1);
		OK(ENC_ABS_ASISDMISC_R);
	}
	/* class ABS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE20B800) {
		decode_fields32(ENC_ABS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_ABS_ASIMDMISC_R);
	}
	return rc;
}

/* adc.xml */
int ADC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=0|S=0|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1A000000) {
		decode_fields32(ENC_ADC_32_ADDSUB_CARRY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(dec->sf==0) OK(ENC_ADC_32_ADDSUB_CARRY);
		if(dec->sf==1) OK(ENC_ADC_64_ADDSUB_CARRY);
	}
	return rc;
}

/* adcs.xml */
int ADCS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x3A000000) {
		decode_fields32(ENC_ADCS_32_ADDSUB_CARRY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(dec->sf==0) OK(ENC_ADCS_32_ADDSUB_CARRY);
		if(dec->sf==1) OK(ENC_ADCS_64_ADDSUB_CARRY);
	}
	return rc;
}

/* addg.xml */
int ADDG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADDG_64_addsub_immtags */
	/* sf=1|op=0|S=0|100011|o2=0|uimm6=xxxxxx|op3=(0)(0)|uimm4=xxxx|Xn=xxxxx|Xd=xxxxx */
	if((INSWORD & 0xFFC00000)==0x91800000) {
		decode_fields32(ENC_ADDG_64_ADDSUB_IMMTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Xd);
		dec->n = UINT(dec->Xn);
		dec->tag_offset = dec->uimm4;
		dec->offset = LSL(ZeroExtend(dec->uimm6,0x40),LOG2_TAG_GRANULE);
		dec->ADD = TRUE;
		OK(ENC_ADDG_64_ADDSUB_IMMTAGS);
	}
	return rc;
}

/* addhn_advsimd.xml */
int ADDHN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADDHN_asimddiff_N */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|01|o1=0|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE204000) {
		decode_fields32(ENC_ADDHN_ASIMDDIFF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->round = (dec->U==1);
		OK(ENC_ADDHN_ASIMDDIFF_N);
	}
	return rc;
}

/* addp_advsimd_pair.xml */
int ADDP_advsimd_pair(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADDP_asisdpair_only */
	/* 01|U=0|11110|size=xx|11000|opcode=11011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E31B800) {
		decode_fields32(ENC_ADDP_ASISDPAIR_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = ReduceOp_ADD;
		OK(ENC_ADDP_ASISDPAIR_ONLY);
	}
	return rc;
}

/* addp_advsimd_vec.xml */
int ADDP_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADDP_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20BC00) {
		decode_fields32(ENC_ADDP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_ADDP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* adds_addsub_ext.xml */
int ADDS_addsub_ext(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00000)==0x2B200000) {
		decode_fields32(ENC_ADDS_32S_ADDSUB_EXT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = UINT(dec->imm3);
		if(dec->shift>4) {
			UNDEFINED;
		}
		/* regular aliases */
		if(dec->Rd==0x1f) return CMN_ADDS_addsub_ext(ctx, dec);
		if(dec->sf==0) OK(ENC_ADDS_32S_ADDSUB_EXT);
		if(dec->sf==1) OK(ENC_ADDS_64S_ADDSUB_EXT);
	}
	return rc;
}

/* adds_addsub_imm.xml */
int ADDS_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x31000000) {
		decode_fields32(ENC_ADDS_32S_ADDSUB_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(!dec->sh) {
			dec->imm = ZeroExtend(dec->imm12,dec->datasize);
		}
		else if(dec->sh) {
			dec->imm = ZeroExtend(((dec->imm12<<12)|0),dec->datasize);
		}
		/* regular aliases */
		if(dec->Rd==0x1f) return CMN_ADDS_addsub_imm(ctx, dec);
		if(dec->sf==0) OK(ENC_ADDS_32S_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_ADDS_64S_ADDSUB_IMM);
	}
	return rc;
}

/* adds_addsub_shift.xml */
int ADDS_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x2B000000) {
		decode_fields32(ENC_ADDS_32_ADDSUB_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(dec->shift==3) {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		/* regular aliases */
		if(dec->Rd==0x1f) return CMN_ADDS_addsub_shift(ctx, dec);
		if(dec->sf==0) OK(ENC_ADDS_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_ADDS_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* addv_advsimd.xml */
int ADDV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADDV_asimdall_only */
	/* 0|Q=x|U=0|01110|size=xx|11000|opcode=11011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE31B800) {
		decode_fields32(ENC_ADDV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = ReduceOp_ADD;
		OK(ENC_ADDV_ASIMDALL_ONLY);
	}
	return rc;
}

/* add_addsub_ext.xml */
int ADD_addsub_ext(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=0|S=0|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00000)==0xB200000) {
		decode_fields32(ENC_ADD_32_ADDSUB_EXT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = UINT(dec->imm3);
		if(dec->shift>4) {
			UNDEFINED;
		}
		if(dec->sf==0) OK(ENC_ADD_32_ADDSUB_EXT);
		if(dec->sf==1) OK(ENC_ADD_64_ADDSUB_EXT);
	}
	return rc;
}

/* add_addsub_imm.xml */
int ADD_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=0|S=0|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x11000000) {
		decode_fields32(ENC_ADD_32_ADDSUB_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(!dec->sh) {
			dec->imm = ZeroExtend(dec->imm12,dec->datasize);
		}
		else if(dec->sh) {
			dec->imm = ZeroExtend(((dec->imm12<<12)|0),dec->datasize);
		}
		/* regular aliases */
		if(dec->sh==0 && dec->imm12==0 && (dec->Rd==0x1f || dec->Rn==0x1f)) return MOV_ADD_addsub_imm(ctx, dec);
		if(dec->sf==0) OK(ENC_ADD_32_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_ADD_64_ADDSUB_IMM);
	}
	return rc;
}

/* add_addsub_shift.xml */
int ADD_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=0|S=0|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0xB000000) {
		decode_fields32(ENC_ADD_32_ADDSUB_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(dec->shift==3) {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		if(dec->sf==0) OK(ENC_ADD_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_ADD_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* add_advsimd.xml */
int ADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADD_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E208400) {
		decode_fields32(ENC_ADD_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->sub_op = (dec->U==1);
		OK(ENC_ADD_ASISDSAME_ONLY);
	}
	/* class ADD_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE208400) {
		decode_fields32(ENC_ADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->U==1);
		OK(ENC_ADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* adr.xml */
int ADR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADR_only_pcreladdr */
	/* op=0|immlo=xx|10000|immhi=xxxxxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x9F000000)==0x10000000) {
		decode_fields32(ENC_ADR_ONLY_PCRELADDR, dec);
		dec->d = UINT(dec->Rd);
		dec->page = (dec->op==1);
		if(dec->page) {
			dec->imm = SignExtend(((dec->immhi<<14)|(dec->immlo<<12)|0),33);
		}
		else {
			dec->imm = SignExtend(((dec->immhi<<2)|dec->immlo),21);
		}
		OK(ENC_ADR_ONLY_PCRELADDR);
	}
	return rc;
}

/* adrp.xml */
int ADRP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ADRP_only_pcreladdr */
	/* op=1|immlo=xx|10000|immhi=xxxxxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x9F000000)==0x90000000) {
		decode_fields32(ENC_ADRP_ONLY_PCRELADDR, dec);
		dec->d = UINT(dec->Rd);
		dec->page = (dec->op==1);
		if(dec->page) {
			dec->imm = SignExtend(((dec->immhi<<14)|(dec->immlo<<12)|0),33);
		}
		else {
			dec->imm = SignExtend(((dec->immhi<<2)|dec->immlo),21);
		}
		OK(ENC_ADRP_ONLY_PCRELADDR);
	}
	return rc;
}

/* aesd_advsimd.xml */
int AESD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class AESD_B_cryptoaes */
	/* 01001110|size=00|10100|0010|D=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x4E285800) {
		decode_fields32(ENC_AESD_B_CRYPTOAES, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveAESExt()) {
			UNDEFINED;
		}
		dec->decrypt = (dec->D==1);
		OK(ENC_AESD_B_CRYPTOAES);
	}
	return rc;
}

/* aese_advsimd.xml */
int AESE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class AESE_B_cryptoaes */
	/* 01001110|size=00|10100|0010|D=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x4E284800) {
		decode_fields32(ENC_AESE_B_CRYPTOAES, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveAESExt()) {
			UNDEFINED;
		}
		dec->decrypt = (dec->D==1);
		OK(ENC_AESE_B_CRYPTOAES);
	}
	return rc;
}

/* aesimc_advsimd.xml */
int AESIMC_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class AESIMC_B_cryptoaes */
	/* 01001110|size=00|10100|0011|D=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x4E287800) {
		decode_fields32(ENC_AESIMC_B_CRYPTOAES, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveAESExt()) {
			UNDEFINED;
		}
		dec->decrypt = (dec->D==1);
		OK(ENC_AESIMC_B_CRYPTOAES);
	}
	return rc;
}

/* aesmc_advsimd.xml */
int AESMC_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class AESMC_B_cryptoaes */
	/* 01001110|size=00|10100|0011|D=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x4E286800) {
		decode_fields32(ENC_AESMC_B_CRYPTOAES, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveAESExt()) {
			UNDEFINED;
		}
		dec->decrypt = (dec->D==1);
		OK(ENC_AESMC_B_CRYPTOAES);
	}
	return rc;
}

/* ands_log_imm.xml */
int ANDS_log_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|opc=11|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x72000000) {
		decode_fields32(ENC_ANDS_32S_LOG_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && dec->N!=0) {
			UNDEFINED;
		}
		DecodeBitMasksCheckUndefined(dec->N,dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->imm = dbmrt.wmask;
		/* regular aliases */
		if(dec->Rd==0x1f) return TST_ANDS_log_imm(ctx, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_ANDS_32S_LOG_IMM);
		if(dec->sf==1) OK(ENC_ANDS_64S_LOG_IMM);
	}
	return rc;
}

/* ands_log_shift.xml */
int ANDS_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|opc=11|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x6A000000) {
		decode_fields32(ENC_ANDS_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		/* regular aliases */
		if(dec->Rd==0x1f) return TST_ANDS_log_shift(ctx, dec);
		if(dec->sf==0) OK(ENC_ANDS_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_ANDS_64_LOG_SHIFT);
	}
	return rc;
}

/* and_advsimd.xml */
int AND_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class AND_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=00|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE201C00) {
		decode_fields32(ENC_AND_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->invert = (SLICE(dec->size,0,0)==1);
		dec->op = (SLICE(dec->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;
		OK(ENC_AND_ASIMDSAME_ONLY);
	}
	return rc;
}

/* and_log_imm.xml */
int AND_log_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=00|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x12000000) {
		decode_fields32(ENC_AND_32_LOG_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && dec->N!=0) {
			UNDEFINED;
		}
		DecodeBitMasksCheckUndefined(dec->N,dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->imm = dbmrt.wmask;
		if(dec->sf==0 && dec->N==0) OK(ENC_AND_32_LOG_IMM);
		if(dec->sf==1) OK(ENC_AND_64_LOG_IMM);
	}
	return rc;
}

/* and_log_shift.xml */
int AND_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=00|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0xA000000) {
		decode_fields32(ENC_AND_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		if(dec->sf==0) OK(ENC_AND_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_AND_64_LOG_SHIFT);
	}
	return rc;
}

/* asrv.xml */
int ASRV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02800) {
		decode_fields32(ENC_ASRV_32_DP_2SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->shift_type = DecodeShift(dec->op2);
		/* unconditional alias */
		if(ASR_ASRV(ctx, dec)==0) return 0;
		if(dec->sf==0) OK(ENC_ASRV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_ASRV_64_DP_2SRC);
	}
	return rc;
}

/* asr_asrv.xml */
int ASR_ASRV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02800) {
		decode_fields32(ENC_ASR_ASRV_32_DP_2SRC, dec);
		if(dec->sf==0) OK(ENC_ASR_ASRV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_ASR_ASRV_64_DP_2SRC);
	}
	return rc;
}

/* asr_sbfm.xml */
int ASR_SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=x11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F807C00)==0x13007C00) {
		decode_fields32(ENC_ASR_SBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0 && dec->imms==0x1f) OK(ENC_ASR_SBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1 && dec->imms==0x3f) OK(ENC_ASR_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* at_sys.xml */
int AT_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=xxx|CRn=0111|CRm=100x|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF8FE00)==0xD5087800) {
		decode_fields32(ENC_AT_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_AT_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* autda.xml */
int AUTDA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=110|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC11800) {
		decode_fields32(ENC_AUTDA_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_AUTDA_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_AUTDZA_64Z_DP_1SRC);
	}
	return rc;
}

/* autdb.xml */
int AUTDB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC11C00) {
		decode_fields32(ENC_AUTDB_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_AUTDB_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_AUTDZB_64Z_DP_1SRC);
	}
	return rc;
}

/* autia.xml */
int AUTIA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=100|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC11000) {
		decode_fields32(ENC_AUTIA_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_AUTIA_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_AUTIZA_64Z_DP_1SRC);
	}
	/* class system */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=10x|Rt=11111 */
	if((INSWORD & 0xFFFFFDDF)==0xD503219F) {
		decode_fields32(ENC_AUTIA1716_HI_HINTS, dec);
		if(dec->CRm==1 && dec->op2==4) OK(ENC_AUTIA1716_HI_HINTS);
		if(dec->CRm==3 && dec->op2==5) OK(ENC_AUTIASP_HI_HINTS);
		if(dec->CRm==3 && dec->op2==4) OK(ENC_AUTIAZ_HI_HINTS);
	}
	return rc;
}

/* autib.xml */
int AUTIB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=101|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC11400) {
		decode_fields32(ENC_AUTIB_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_AUTIB_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_AUTIZB_64Z_DP_1SRC);
	}
	/* class system */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=11x|Rt=11111 */
	if((INSWORD & 0xFFFFFDDF)==0xD50321DF) {
		decode_fields32(ENC_AUTIB1716_HI_HINTS, dec);
		if(dec->CRm==1 && dec->op2==6) OK(ENC_AUTIB1716_HI_HINTS);
		if(dec->CRm==3 && dec->op2==7) OK(ENC_AUTIBSP_HI_HINTS);
		if(dec->CRm==3 && dec->op2==6) OK(ENC_AUTIBZ_HI_HINTS);
	}
	return rc;
}

/* axflag.xml */
int AXFLAG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class AXFLAG_M_pstate */
	/* 1101010100|L=0|op0=00|op1=000|CRn=0100|CRm=(0)(0)(0)(0)|op2=010|Rt =11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD500405F) {
		decode_fields32(ENC_AXFLAG_M_PSTATE, dec);
		if(!HaveFlagFormatExt()) {
			UNDEFINED;
		}
		OK(ENC_AXFLAG_M_PSTATE);
	}
	return rc;
}

/* bcax_advsimd.xml */
int BCAX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BCAX_VVV16_crypto4 */
	/* 110011100|Op0=01|Rm=xxxxx|0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0xCE200000) {
		decode_fields32(ENC_BCAX_VVV16_CRYPTO4, dec);
		if(!HaveSHA3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		OK(ENC_BCAX_VVV16_CRYPTO4);
	}
	return rc;
}

/* bfcvtn_advsimd.xml */
int BFCVTN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFCVTN_asimdmisc_4S */
	/* 0|Q=x|U=0|01110|size=10|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEA16800) {
		decode_fields32(ENC_BFCVTN_ASIMDMISC_4S, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Rd);
		dec->part = UINT(dec->Q);
		dec->elements = ((0x10) ? ((0x40) / (0x10)) : 0);
		OK(ENC_BFCVTN_ASIMDMISC_4S);
	}
	return rc;
}

/* bfcvt_float.xml */
int BFCVT_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFCVT_BS_floatdp1 */
	/* M=0|0|S=0|11110|ptype=01|1|opcode=000110|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x1E634000) {
		decode_fields32(ENC_BFCVT_BS_FLOATDP1, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Rd);
		OK(ENC_BFCVT_BS_FLOATDP1);
	}
	return rc;
}

/* bfc_bfm.xml */
int BFC_BFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class nofill */
	/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7F8003E0)==0x330003E0) {
		decode_fields32(ENC_BFC_BFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_BFC_BFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_BFC_BFM_64M_BITFIELD);
	}
	return rc;
}

/* bfdot_advsimd_elt.xml */
int BFDOT_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFDOT_asimdelem_E */
	/* 0|Q=x|U=0|01111|size=01|L=x|M=x|Rm=xxxx|opcode=1111|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF40F000) {
		decode_fields32(ENC_BFDOT_ASIMDELEM_E, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->M<<4)|dec->Rm));
		dec->d = UINT(dec->Rd);
		dec->i = UINT(((dec->H<<1)|dec->L));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((0x20) ? ((dec->datasize) / (0x20)) : 0);
		OK(ENC_BFDOT_ASIMDELEM_E);
	}
	return rc;
}

/* bfdot_advsimd_vec.xml */
int BFDOT_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFDOT_asimdsame2_D */
	/* 0|Q=x|U=1|01110|size=01|0|Rm=xxxxx|1|opcode=1111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E40FC00) {
		decode_fields32(ENC_BFDOT_ASIMDSAME2_D, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((0x20) ? ((dec->datasize) / (0x20)) : 0);
		OK(ENC_BFDOT_ASIMDSAME2_D);
	}
	return rc;
}

/* bfi_bfm.xml */
int BFI_BFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class nofill */
	/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn!=11111|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x33000000 && (INSWORD & 0x3E0)!=0x3E0) {
		decode_fields32(ENC_BFI_BFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_BFI_BFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_BFI_BFM_64M_BITFIELD);
	}
	return rc;
}

/* bfm.xml */
int BFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class nofill */
	/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x33000000) {
		decode_fields32(ENC_BFM_32M_BITFIELD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->inzero = TRUE;
			dec->extend = TRUE;
		}
		else if(dec->opc==1) {
			dec->inzero = FALSE;
			dec->extend = FALSE;
		}
		else if(dec->opc==2) {
			dec->inzero = TRUE;
			dec->extend = FALSE;
		}
		else if(dec->opc==3) {
			UNDEFINED;
		}
		if(dec->sf==1 && dec->N!=1) {
			UNDEFINED;
		}
		if(dec->sf==0 && (dec->N!=0 || SLICE(dec->immr,5,5)!=0 || SLICE(dec->imms,5,5)!=0)) {
			UNDEFINED;
		}
		dec->R = UINT(dec->immr);
		dec->S = UINT(dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->wmask = dbmrt.wmask;
		dec->tmask = dbmrt.tmask;
		/* regular aliases */
		if(dec->Rn==0x1f && UINT(dec->imms)<UINT(dec->immr)) return BFC_BFM(ctx, dec);
		if(dec->Rn!=0x1f && UINT(dec->imms)<UINT(dec->immr)) return BFI_BFM(ctx, dec);
		if((UINT(dec->imms)) >= (UINT(dec->immr))) return BFXIL_BFM(ctx, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_BFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_BFM_64M_BITFIELD);
	}
	return rc;
}

/* bfmlal_advsimd_elt.xml */
int BFMLAL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFMLAL_asimdelem_F */
	/* 0|Q=x|U=0|01111|size=11|L=x|M=x|Rm=xxxx|opcode<3>=1|opcode<2>=1|opcode<1:0>=11|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xFC0F000) {
		decode_fields32(ENC_BFMLAL_ASIMDELEM_F, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->elements = ((0x20) ? ((0x80) / (0x20)) : 0);
		dec->sel = UINT(dec->Q);
		OK(ENC_BFMLAL_ASIMDELEM_F);
	}
	return rc;
}

/* bfmlal_advsimd_vec.xml */
int BFMLAL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFMLAL_asimdsame2_F_ */
	/* 0|Q=x|U=1|01110|size=11|0|Rm=xxxxx|1|opcode<3:2>=11|opcode=11|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EC0FC00) {
		decode_fields32(ENC_BFMLAL_ASIMDSAME2_F_, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->elements = ((0x20) ? ((0x80) / (0x20)) : 0);
		dec->sel = UINT(dec->Q);
		OK(ENC_BFMLAL_ASIMDSAME2_F_);
	}
	return rc;
}

/* bfmmla_advsimd.xml */
int BFMMLA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BFMMLA_asimdsame2_E */
	/* 0|Q=1|U=1|01110|size=01|0|Rm=xxxxx|1|opcode=1101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x6E40EC00) {
		decode_fields32(ENC_BFMMLA_ASIMDSAME2_E, dec);
		if(!HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		OK(ENC_BFMMLA_ASIMDSAME2_E);
	}
	return rc;
}

/* bfxil_bfm.xml */
int BFXIL_BFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class nofill */
	/* sf=x|opc=01|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x33000000) {
		decode_fields32(ENC_BFXIL_BFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_BFXIL_BFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_BFXIL_BFM_64M_BITFIELD);
	}
	return rc;
}

/* bics.xml */
int BICS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|opc=11|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x6A200000) {
		decode_fields32(ENC_BICS_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		if(dec->sf==0) OK(ENC_BICS_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_BICS_64_LOG_SHIFT);
	}
	return rc;
}

/* bic_advsimd_imm.xml */
int BIC_advsimd_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class shifted_immediate */
	/* 0|Q=x|op=1|0111100000|a=x|b=x|c=x|cmode=xxx1|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */
	if((INSWORD & 0xBFF81C00)==0x2F001400) {
		decode_fields32(ENC_BIC_ASIMDIMM_L_HL, dec);
		dec->rd = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		if(!(((dec->cmode<<1)|dec->op)&0x13)) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==1) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==2) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==3) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x10) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x11) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x12) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x13) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x18) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x19) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1e)==0x1c) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1e) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1f) {
			if(dec->Q==0) {
				UNDEFINED;
			}
			dec->operation_ = ImmediateOp_MOVI;
		}
		dec->imm64 = AdvSIMDExpandImm(dec->op,dec->cmode,((dec->a<<7)|(dec->b<<6)|(dec->c<<5)|(dec->d<<4)|(dec->e<<3)|(dec->f<<2)|(dec->g<<1)|dec->h));
		dec->imm = Replicate(dec->imm64, ((0x40) ? ((dec->datasize) / (0x40)) : 0), 64);
		if((dec->cmode&13)==9) OK(ENC_BIC_ASIMDIMM_L_HL);
		if((dec->cmode&9)==1) OK(ENC_BIC_ASIMDIMM_L_SL);
	}
	return rc;
}

/* bic_advsimd_reg.xml */
int BIC_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BIC_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=01|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE601C00) {
		decode_fields32(ENC_BIC_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->invert = (SLICE(dec->size,0,0)==1);
		dec->op = (SLICE(dec->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;
		OK(ENC_BIC_ASIMDSAME_ONLY);
	}
	return rc;
}

/* bic_and_z_zi.xml */
int BIC_and_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class and_z_zi_ */
	/* 00000101|opc=10|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5800000) {
		decode_fields32(ENC_BIC_AND_Z_ZI_, dec);
		OK(ENC_BIC_AND_Z_ZI_);
	}
	return rc;
}

/* bic_log_shift.xml */
int BIC_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=00|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0xA200000) {
		decode_fields32(ENC_BIC_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		if(dec->sf==0) OK(ENC_BIC_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_BIC_64_LOG_SHIFT);
	}
	return rc;
}

/* bif_advsimd.xml */
int BIF_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BIF_asimdsame_only */
	/* 0|Q=x|U=1|01110|opc2=11|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EE01C00) {
		decode_fields32(ENC_BIF_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!dec->opc2) {
			dec->op = VBitOp_VEOR;
		}
		else if(dec->opc2==1) {
			dec->op = VBitOp_VBSL;
		}
		else if(dec->opc2==2) {
			dec->op = VBitOp_VBIT;
		}
		else if(dec->opc2==3) {
			dec->op = VBitOp_VBIF;
		}
		OK(ENC_BIF_ASIMDSAME_ONLY);
	}
	return rc;
}

/* bit_advsimd.xml */
int BIT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BIT_asimdsame_only */
	/* 0|Q=x|U=1|01110|opc2=10|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EA01C00) {
		decode_fields32(ENC_BIT_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!dec->opc2) {
			dec->op = VBitOp_VEOR;
		}
		else if(dec->opc2==1) {
			dec->op = VBitOp_VBSL;
		}
		else if(dec->opc2==2) {
			dec->op = VBitOp_VBIT;
		}
		else if(dec->opc2==3) {
			dec->op = VBitOp_VBIF;
		}
		OK(ENC_BIT_ASIMDSAME_ONLY);
	}
	return rc;
}

/* bl.xml */
int BL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BL_only_branch_imm */
	/* op=1|00101|imm26=xxxxxxxxxxxxxxxxxxxxxxxxxx */
	if((INSWORD & 0xFC000000)==0x94000000) {
		decode_fields32(ENC_BL_ONLY_BRANCH_IMM, dec);
		dec->branch_type = (dec->op==1) ? BranchType_DIRCALL : BranchType_DIR;
		dec->offset = SignExtend((dec->imm26<<2),28);
		OK(ENC_BL_ONLY_BRANCH_IMM);
	}
	return rc;
}

/* blr.xml */
int BLR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BLR_64_branch_reg */
	/* 1101011|Z=0|opc[2:1]=0|op=01|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=xxxxx|Rm=00000 */
	if((INSWORD & 0xFFFFFC1F)==0xD63F0000) {
		decode_fields32(ENC_BLR_64_BRANCH_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		dec->source_is_sp = ((dec->Z==1) && (dec->m==0x1f));
		if(!dec->pac && dec->m!=0) {
			UNDEFINED;
		}
		else if(dec->pac && !HavePACExt()) {
			UNDEFINED;
		}
		if(!dec->op) {
			dec->branch_type = BranchType_INDIR;
		}
		else if(dec->op==1) {
			dec->branch_type = BranchType_INDCALL;
		}
		else if(dec->op==2) {
			dec->branch_type = BranchType_RET;
		}
		else {
			UNDEFINED;
		}
		if(dec->pac) {
			if(dec->Z==0 && dec->m!=0x1f) {
				UNDEFINED;
			}
			if(dec->branch_type==BranchType_RET) {
				if(dec->n!=0x1f) {
					UNDEFINED;
				}
				dec->n = 0x1e;
				dec->source_is_sp = TRUE;
			}
		}
		OK(ENC_BLR_64_BRANCH_REG);
	}
	return rc;
}

/* blra.xml */
int BLRA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* 1101011|Z=x|opc[2:1]=0|op=01|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=xxxxx|Rm=xxxxx */
	if((INSWORD & 0xFEFFF800)==0xD63F0800) {
		decode_fields32(ENC_BLRAAZ_64_BRANCH_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		dec->source_is_sp = ((dec->Z==1) && (dec->m==0x1f));
		if(!dec->pac && dec->m!=0) {
			UNDEFINED;
		}
		else if(dec->pac && !HavePACExt()) {
			UNDEFINED;
		}
		if(!dec->op) {
			dec->branch_type = BranchType_INDIR;
		}
		else if(dec->op==1) {
			dec->branch_type = BranchType_INDCALL;
		}
		else if(dec->op==2) {
			dec->branch_type = BranchType_RET;
		}
		else {
			UNDEFINED;
		}
		if(dec->pac) {
			if(dec->Z==0 && dec->m!=0x1f) {
				UNDEFINED;
			}
			if(dec->branch_type==BranchType_RET) {
				if(dec->n!=0x1f) {
					UNDEFINED;
				}
				dec->n = 0x1e;
				dec->source_is_sp = TRUE;
			}
		}
		if(dec->Z==0 && dec->M==0 && dec->Rm==0x1f) OK(ENC_BLRAAZ_64_BRANCH_REG);
		if(dec->Z==1 && dec->M==0) OK(ENC_BLRAA_64P_BRANCH_REG);
		if(dec->Z==0 && dec->M==1 && dec->Rm==0x1f) OK(ENC_BLRABZ_64_BRANCH_REG);
		if(dec->Z==1 && dec->M==1) OK(ENC_BLRAB_64P_BRANCH_REG);
	}
	return rc;
}

/* br.xml */
int BR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BR_64_branch_reg */
	/* 1101011|Z=0|opc[2:1]=0|op=00|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=xxxxx|Rm=00000 */
	if((INSWORD & 0xFFFFFC1F)==0xD61F0000) {
		decode_fields32(ENC_BR_64_BRANCH_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		dec->source_is_sp = ((dec->Z==1) && (dec->m==0x1f));
		if(!dec->pac && dec->m!=0) {
			UNDEFINED;
		}
		else if(dec->pac && !HavePACExt()) {
			UNDEFINED;
		}
		if(!dec->op) {
			dec->branch_type = BranchType_INDIR;
		}
		else if(dec->op==1) {
			dec->branch_type = BranchType_INDCALL;
		}
		else if(dec->op==2) {
			dec->branch_type = BranchType_RET;
		}
		else {
			UNDEFINED;
		}
		if(dec->pac) {
			if(dec->Z==0 && dec->m!=0x1f) {
				UNDEFINED;
			}
			if(dec->branch_type==BranchType_RET) {
				if(dec->n!=0x1f) {
					UNDEFINED;
				}
				dec->n = 0x1e;
				dec->source_is_sp = TRUE;
			}
		}
		OK(ENC_BR_64_BRANCH_REG);
	}
	return rc;
}

/* bra.xml */
int BRA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* 1101011|Z=x|opc[2:1]=0|op=00|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=xxxxx|Rm=xxxxx */
	if((INSWORD & 0xFEFFF800)==0xD61F0800) {
		decode_fields32(ENC_BRAAZ_64_BRANCH_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		dec->source_is_sp = ((dec->Z==1) && (dec->m==0x1f));
		if(!dec->pac && dec->m!=0) {
			UNDEFINED;
		}
		else if(dec->pac && !HavePACExt()) {
			UNDEFINED;
		}
		if(!dec->op) {
			dec->branch_type = BranchType_INDIR;
		}
		else if(dec->op==1) {
			dec->branch_type = BranchType_INDCALL;
		}
		else if(dec->op==2) {
			dec->branch_type = BranchType_RET;
		}
		else {
			UNDEFINED;
		}
		if(dec->pac) {
			if(dec->Z==0 && dec->m!=0x1f) {
				UNDEFINED;
			}
			if(dec->branch_type==BranchType_RET) {
				if(dec->n!=0x1f) {
					UNDEFINED;
				}
				dec->n = 0x1e;
				dec->source_is_sp = TRUE;
			}
		}
		if(dec->Z==0 && dec->M==0 && dec->Rm==0x1f) OK(ENC_BRAAZ_64_BRANCH_REG);
		if(dec->Z==1 && dec->M==0) OK(ENC_BRAA_64P_BRANCH_REG);
		if(dec->Z==0 && dec->M==1 && dec->Rm==0x1f) OK(ENC_BRABZ_64_BRANCH_REG);
		if(dec->Z==1 && dec->M==1) OK(ENC_BRAB_64P_BRANCH_REG);
	}
	return rc;
}

/* brk.xml */
int BRK(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BRK_EX_exception */
	/* 11010100|opc=001|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=00 */
	if((INSWORD & 0xFFE0001F)==0xD4200000) {
		decode_fields32(ENC_BRK_EX_EXCEPTION, dec);
		dec->comment = dec->imm16;
		if(HaveBTIExt()) {
			SetBTypeCompatible(TRUE);
		}
		OK(ENC_BRK_EX_EXCEPTION);
	}
	return rc;
}

/* bsl_advsimd.xml */
int BSL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BSL_asimdsame_only */
	/* 0|Q=x|U=1|01110|opc2=01|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E601C00) {
		decode_fields32(ENC_BSL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!dec->opc2) {
			dec->op = VBitOp_VEOR;
		}
		else if(dec->opc2==1) {
			dec->op = VBitOp_VBSL;
		}
		else if(dec->opc2==2) {
			dec->op = VBitOp_VBIT;
		}
		else if(dec->opc2==3) {
			dec->op = VBitOp_VBIF;
		}
		OK(ENC_BSL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* bti.xml */
int BTI(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class BTI_HB_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0100|op2=xx0|Rt=11111 */
	if((INSWORD & 0xFFFFFF3F)==0xD503241F) {
		decode_fields32(ENC_BTI_HB_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_BTI_HB_HINTS);
	}
	return rc;
}

/* b_cond.xml */
int B_cond(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class B_only_condbranch */
	/* 0101010|o1=0|imm19=xxxxxxxxxxxxxxxxxxx|o0=0|cond=xxxx */
	if((INSWORD & 0xFF000010)==0x54000000) {
		decode_fields32(ENC_B_ONLY_CONDBRANCH, dec);
		dec->offset = SignExtend((dec->imm19<<2),21);
		dec->condition = dec->cond;
		OK(ENC_B_ONLY_CONDBRANCH);
	}
	return rc;
}

/* b_uncond.xml */
int B_uncond(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class B_only_branch_imm */
	/* op=0|00101|imm26=xxxxxxxxxxxxxxxxxxxxxxxxxx */
	if((INSWORD & 0xFC000000)==0x14000000) {
		decode_fields32(ENC_B_ONLY_BRANCH_IMM, dec);
		dec->branch_type = (dec->op==1) ? BranchType_DIRCALL : BranchType_DIR;
		dec->offset = SignExtend((dec->imm26<<2),28);
		OK(ENC_B_ONLY_BRANCH_IMM);
	}
	return rc;
}

/* cas.xml */
int CAS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=1|L=x|o1=1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFA07C00)==0x88A07C00) {
		decode_fields32(ENC_CAS_C32_LDSTEXCL, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2 && dec->L==0 && dec->o0==0) OK(ENC_CAS_C32_LDSTEXCL);
		if(dec->size==2 && dec->L==1 && dec->o0==0) OK(ENC_CASA_C32_LDSTEXCL);
		if(dec->size==2 && dec->L==1 && dec->o0==1) OK(ENC_CASAL_C32_LDSTEXCL);
		if(dec->size==2 && dec->L==0 && dec->o0==1) OK(ENC_CASL_C32_LDSTEXCL);
		if(dec->size==3 && dec->L==0 && dec->o0==0) OK(ENC_CAS_C64_LDSTEXCL);
		if(dec->size==3 && dec->L==1 && dec->o0==0) OK(ENC_CASA_C64_LDSTEXCL);
		if(dec->size==3 && dec->L==1 && dec->o0==1) OK(ENC_CASAL_C64_LDSTEXCL);
		if(dec->size==3 && dec->L==0 && dec->o0==1) OK(ENC_CASL_C64_LDSTEXCL);
	}
	return rc;
}

/* casb.xml */
int CASB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=00|001000|o2=1|L=x|o1=1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA07C00)==0x8A07C00) {
		decode_fields32(ENC_CASAB_C32_LDSTEXCL, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->L==1 && dec->o0==0) OK(ENC_CASAB_C32_LDSTEXCL);
		if(dec->L==1 && dec->o0==1) OK(ENC_CASALB_C32_LDSTEXCL);
		if(dec->L==0 && dec->o0==0) OK(ENC_CASB_C32_LDSTEXCL);
		if(dec->L==0 && dec->o0==1) OK(ENC_CASLB_C32_LDSTEXCL);
	}
	return rc;
}

/* cash.xml */
int CASH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=01|001000|o2=1|L=x|o1=1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA07C00)==0x48A07C00) {
		decode_fields32(ENC_CASAH_C32_LDSTEXCL, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->L==1 && dec->o0==0) OK(ENC_CASAH_C32_LDSTEXCL);
		if(dec->L==1 && dec->o0==1) OK(ENC_CASALH_C32_LDSTEXCL);
		if(dec->L==0 && dec->o0==0) OK(ENC_CASH_C32_LDSTEXCL);
		if(dec->L==0 && dec->o0==1) OK(ENC_CASLH_C32_LDSTEXCL);
	}
	return rc;
}

/* casp.xml */
int CASP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* 0|sz=x|001000|o2=0|L=x|o1=1|Rs=xxxxx|o0=x|Rt2=11111|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFA07C00)==0x8207C00) {
		decode_fields32(ENC_CASP_CP32_LDSTEXCL, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		if(SLICE(dec->Rs,0,0)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->Rt,0,0)==1) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->datasize = (0x20) << (UINT(dec->sz));
		dec->regsize = dec->datasize;
		dec->ldacctype = (dec->L==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->o0==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->sz==0 && dec->L==0 && dec->o0==0) OK(ENC_CASP_CP32_LDSTEXCL);
		if(dec->sz==0 && dec->L==1 && dec->o0==0) OK(ENC_CASPA_CP32_LDSTEXCL);
		if(dec->sz==0 && dec->L==1 && dec->o0==1) OK(ENC_CASPAL_CP32_LDSTEXCL);
		if(dec->sz==0 && dec->L==0 && dec->o0==1) OK(ENC_CASPL_CP32_LDSTEXCL);
		if(dec->sz==1 && dec->L==0 && dec->o0==0) OK(ENC_CASP_CP64_LDSTEXCL);
		if(dec->sz==1 && dec->L==1 && dec->o0==0) OK(ENC_CASPA_CP64_LDSTEXCL);
		if(dec->sz==1 && dec->L==1 && dec->o0==1) OK(ENC_CASPAL_CP64_LDSTEXCL);
		if(dec->sz==1 && dec->L==0 && dec->o0==1) OK(ENC_CASPL_CP64_LDSTEXCL);
	}
	return rc;
}

/* cbnz.xml */
int CBNZ(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class br19 */
	/* sf=x|011010|op=1|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0x7F000000)==0x35000000) {
		decode_fields32(ENC_CBNZ_32_COMPBRANCH, dec);
		dec->t = UINT(dec->Rt);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->iszero = (dec->op==0);
		dec->offset = SignExtend((dec->imm19<<2),21);
		if(dec->sf==0) OK(ENC_CBNZ_32_COMPBRANCH);
		if(dec->sf==1) OK(ENC_CBNZ_64_COMPBRANCH);
	}
	return rc;
}

/* cbz.xml */
int CBZ(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class br19 */
	/* sf=x|011010|op=0|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0x7F000000)==0x34000000) {
		decode_fields32(ENC_CBZ_32_COMPBRANCH, dec);
		dec->t = UINT(dec->Rt);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->iszero = (dec->op==0);
		dec->offset = SignExtend((dec->imm19<<2),21);
		if(dec->sf==0) OK(ENC_CBZ_32_COMPBRANCH);
		if(dec->sf==1) OK(ENC_CBZ_64_COMPBRANCH);
	}
	return rc;
}

/* ccmn_imm.xml */
int CCMN_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm5u */
	/* sf=x|op=0|S=1|11010010|imm5=xxxxx|cond=xxxx|1|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */
	if((INSWORD & 0x7FE00C10)==0x3A400800) {
		decode_fields32(ENC_CCMN_32_CONDCMP_IMM, dec);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->condition = dec->cond;
		dec->flags = dec->nzcv;
		dec->imm = ZeroExtend(dec->imm5,dec->datasize);
		if(dec->sf==0) OK(ENC_CCMN_32_CONDCMP_IMM);
		if(dec->sf==1) OK(ENC_CCMN_64_CONDCMP_IMM);
	}
	return rc;
}

/* ccmn_reg.xml */
int CCMN_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=1|11010010|Rm=xxxxx|cond=xxxx|0|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */
	if((INSWORD & 0x7FE00C10)==0x3A400000) {
		decode_fields32(ENC_CCMN_32_CONDCMP_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->condition = dec->cond;
		dec->flags = dec->nzcv;
		if(dec->sf==0) OK(ENC_CCMN_32_CONDCMP_REG);
		if(dec->sf==1) OK(ENC_CCMN_64_CONDCMP_REG);
	}
	return rc;
}

/* ccmp_imm.xml */
int CCMP_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm5u */
	/* sf=x|op=1|S=1|11010010|imm5=xxxxx|cond=xxxx|1|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */
	if((INSWORD & 0x7FE00C10)==0x7A400800) {
		decode_fields32(ENC_CCMP_32_CONDCMP_IMM, dec);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->condition = dec->cond;
		dec->flags = dec->nzcv;
		dec->imm = ZeroExtend(dec->imm5,dec->datasize);
		if(dec->sf==0) OK(ENC_CCMP_32_CONDCMP_IMM);
		if(dec->sf==1) OK(ENC_CCMP_64_CONDCMP_IMM);
	}
	return rc;
}

/* ccmp_reg.xml */
int CCMP_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=1|S=1|11010010|Rm=xxxxx|cond=xxxx|0|o2=0|Rn=xxxxx|o3=0|nzcv=xxxx */
	if((INSWORD & 0x7FE00C10)==0x7A400000) {
		decode_fields32(ENC_CCMP_32_CONDCMP_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->condition = dec->cond;
		dec->flags = dec->nzcv;
		if(dec->sf==0) OK(ENC_CCMP_32_CONDCMP_REG);
		if(dec->sf==1) OK(ENC_CCMP_64_CONDCMP_REG);
	}
	return rc;
}

/* cfinv.xml */
int CFINV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CFINV_M_pstate */
	/* 1101010100|L=0|op0=00|op1=000|CRn=0100|CRm=(0)(0)(0)(0)|op2=000|Rt =11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD500401F) {
		decode_fields32(ENC_CFINV_M_PSTATE, dec);
		if(!HaveFlagManipulateExt()) {
			UNDEFINED;
		}
		OK(ENC_CFINV_M_PSTATE);
	}
	return rc;
}

/* cfp_sys.xml */
int CFP_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=011|CRn=0111|CRm=0011|op2=100|Rt=xxxxx */
	if((INSWORD & 0xFFFFFFE0)==0xD50B7380) {
		decode_fields32(ENC_CFP_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_CFP_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* cinc_csinc.xml */
int CINC_CSINC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010100|Rm!=11111|cond!=111x|0|o2=1|Rn!=11111|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x1A800400 && (INSWORD & 0x1FE3E0)!=0x1FE3E0) {
		decode_fields32(ENC_CINC_CSINC_32_CONDSEL, dec);
		if(dec->sf==0) OK(ENC_CINC_CSINC_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CINC_CSINC_64_CONDSEL);
	}
	return rc;
}

/* cinv_csinv.xml */
int CINV_CSINV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=1|S=0|11010100|Rm!=11111|cond!=111x|0|o2=0|Rn!=11111|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x5A800000 && (INSWORD & 0x1FE3E0)!=0x1FE3E0) {
		decode_fields32(ENC_CINV_CSINV_32_CONDSEL, dec);
		if(dec->sf==0) OK(ENC_CINV_CSINV_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CINV_CSINV_64_CONDSEL);
	}
	return rc;
}

/* clrex.xml */
int CLREX(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CLREX_BN_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|op2=010|Rt=11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD503305F) {
		decode_fields32(ENC_CLREX_BN_BARRIERS, dec);
		OK(ENC_CLREX_BN_BARRIERS);
	}
	return rc;
}

/* cls_advsimd.xml */
int CLS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CLS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE204800) {
		decode_fields32(ENC_CLS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->countop = (dec->U==1) ? CountOp_CLZ : CountOp_CLS;
		OK(ENC_CLS_ASIMDMISC_R);
	}
	return rc;
}

/* cls_int.xml */
int CLS_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:1]=00010|op=1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FFFFC00)==0x5AC01400) {
		decode_fields32(ENC_CLS_32_DP_1SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->opcode = (dec->op==0) ? CountOp_CLZ : CountOp_CLS;
		if(dec->sf==0) OK(ENC_CLS_32_DP_1SRC);
		if(dec->sf==1) OK(ENC_CLS_64_DP_1SRC);
	}
	return rc;
}

/* clz_advsimd.xml */
int CLZ_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CLZ_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=00100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E204800) {
		decode_fields32(ENC_CLZ_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->countop = (dec->U==1) ? CountOp_CLZ : CountOp_CLS;
		OK(ENC_CLZ_ASIMDMISC_R);
	}
	return rc;
}

/* clz_int.xml */
int CLZ_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:1]=00010|op=0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FFFFC00)==0x5AC01000) {
		decode_fields32(ENC_CLZ_32_DP_1SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->opcode = (dec->op==0) ? CountOp_CLZ : CountOp_CLS;
		if(dec->sf==0) OK(ENC_CLZ_32_DP_1SRC);
		if(dec->sf==1) OK(ENC_CLZ_64_DP_1SRC);
	}
	return rc;
}

/* cmeq_advsimd_reg.xml */
int CMEQ_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMEQ_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E208C00) {
		decode_fields32(ENC_CMEQ_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->and_test = (dec->U==0);
		OK(ENC_CMEQ_ASISDSAME_ONLY);
	}
	/* class CMEQ_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E208C00) {
		decode_fields32(ENC_CMEQ_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->and_test = (dec->U==0);
		OK(ENC_CMEQ_ASIMDSAME_ONLY);
	}
	return rc;
}

/* cmeq_advsimd_zero.xml */
int CMEQ_advsimd_zero(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMEQ_asisdmisc_Z */
	/* 01|U=0|11110|size=xx|10000|0100|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E209800) {
		decode_fields32(ENC_CMEQ_ASISDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMEQ_ASISDMISC_Z);
	}
	/* class CMEQ_asimdmisc_Z */
	/* 0|Q=x|U=0|01110|size=xx|10000|0100|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE209800) {
		decode_fields32(ENC_CMEQ_ASIMDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMEQ_ASIMDMISC_Z);
	}
	return rc;
}

/* cmge_advsimd_reg.xml */
int CMGE_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMGE_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E203C00) {
		decode_fields32(ENC_CMGE_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMGE_ASISDSAME_ONLY);
	}
	/* class CMGE_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE203C00) {
		decode_fields32(ENC_CMGE_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMGE_ASIMDSAME_ONLY);
	}
	return rc;
}

/* cmge_advsimd_zero.xml */
int CMGE_advsimd_zero(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMGE_asisdmisc_Z */
	/* 01|U=1|11110|size=xx|10000|0100|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E208800) {
		decode_fields32(ENC_CMGE_ASISDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMGE_ASISDMISC_Z);
	}
	/* class CMGE_asimdmisc_Z */
	/* 0|Q=x|U=1|01110|size=xx|10000|0100|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E208800) {
		decode_fields32(ENC_CMGE_ASIMDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMGE_ASIMDMISC_Z);
	}
	return rc;
}

/* cmgt_advsimd_reg.xml */
int CMGT_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMGT_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E203400) {
		decode_fields32(ENC_CMGT_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMGT_ASISDSAME_ONLY);
	}
	/* class CMGT_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE203400) {
		decode_fields32(ENC_CMGT_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMGT_ASIMDSAME_ONLY);
	}
	return rc;
}

/* cmgt_advsimd_zero.xml */
int CMGT_advsimd_zero(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMGT_asisdmisc_Z */
	/* 01|U=0|11110|size=xx|10000|0100|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E208800) {
		decode_fields32(ENC_CMGT_ASISDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMGT_ASISDMISC_Z);
	}
	/* class CMGT_asimdmisc_Z */
	/* 0|Q=x|U=0|01110|size=xx|10000|0100|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE208800) {
		decode_fields32(ENC_CMGT_ASIMDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMGT_ASIMDMISC_Z);
	}
	return rc;
}

/* cmhi_advsimd.xml */
int CMHI_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMHI_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E203400) {
		decode_fields32(ENC_CMHI_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMHI_ASISDSAME_ONLY);
	}
	/* class CMHI_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|0011|eq=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E203400) {
		decode_fields32(ENC_CMHI_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMHI_ASIMDSAME_ONLY);
	}
	return rc;
}

/* cmhs_advsimd.xml */
int CMHS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMHS_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E203C00) {
		decode_fields32(ENC_CMHS_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMHS_ASISDSAME_ONLY);
	}
	/* class CMHS_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|0011|eq=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E203C00) {
		decode_fields32(ENC_CMHS_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->cmp_eq = (dec->eq==1);
		OK(ENC_CMHS_ASIMDSAME_ONLY);
	}
	return rc;
}

/* cmle_advsimd.xml */
int CMLE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMLE_asisdmisc_Z */
	/* 01|U=1|11110|size=xx|10000|0100|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E209800) {
		decode_fields32(ENC_CMLE_ASISDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMLE_ASISDMISC_Z);
	}
	/* class CMLE_asimdmisc_Z */
	/* 0|Q=x|U=1|01110|size=xx|10000|0100|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E209800) {
		decode_fields32(ENC_CMLE_ASIMDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_CMLE_ASIMDMISC_Z);
	}
	return rc;
}

/* cmlt_advsimd.xml */
int CMLT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMLT_asisdmisc_Z */
	/* 01|U=0|11110|size=xx|10000|opcode=01010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E20A800) {
		decode_fields32(ENC_CMLT_ASISDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->comparison = CompareOp_LT;
		OK(ENC_CMLT_ASISDMISC_Z);
	}
	/* class CMLT_asimdmisc_Z */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=01010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE20A800) {
		decode_fields32(ENC_CMLT_ASIMDMISC_Z, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->comparison = CompareOp_LT;
		OK(ENC_CMLT_ASIMDMISC_Z);
	}
	return rc;
}

/* cmn_adds_addsub_ext.xml */
int CMN_ADDS_addsub_ext(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7FE0001F)==0x2B20001F) {
		decode_fields32(ENC_CMN_ADDS_32S_ADDSUB_EXT, dec);
		if(dec->sf==0) OK(ENC_CMN_ADDS_32S_ADDSUB_EXT);
		if(dec->sf==1) OK(ENC_CMN_ADDS_64S_ADDSUB_EXT);
	}
	return rc;
}

/* cmn_adds_addsub_imm.xml */
int CMN_ADDS_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7F80001F)==0x3100001F) {
		decode_fields32(ENC_CMN_ADDS_32S_ADDSUB_IMM, dec);
		if(dec->sf==0) OK(ENC_CMN_ADDS_32S_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_CMN_ADDS_64S_ADDSUB_IMM);
	}
	return rc;
}

/* cmn_adds_addsub_shift.xml */
int CMN_ADDS_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=0|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7F20001F)==0x2B00001F) {
		decode_fields32(ENC_CMN_ADDS_32_ADDSUB_SHIFT, dec);
		if(dec->sf==0) OK(ENC_CMN_ADDS_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_CMN_ADDS_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* cmple_cmpeq_p_p_zz.xml */
int CMPLE_cmpeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmpge_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24008000) {
		decode_fields32(ENC_CMPLE_CMPGE_P_P_ZZ_, dec);
		OK(ENC_CMPLE_CMPGE_P_P_ZZ_);
	}
	return rc;
}

/* cmplo_cmpeq_p_p_zz.xml */
int CMPLO_cmpeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmphi_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24000010) {
		decode_fields32(ENC_CMPLO_CMPHI_P_P_ZZ_, dec);
		OK(ENC_CMPLO_CMPHI_P_P_ZZ_);
	}
	return rc;
}

/* cmpls_cmpeq_p_p_zz.xml */
int CMPLS_cmpeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmphs_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24000000) {
		decode_fields32(ENC_CMPLS_CMPHS_P_P_ZZ_, dec);
		OK(ENC_CMPLS_CMPHS_P_P_ZZ_);
	}
	return rc;
}

/* cmplt_cmpeq_p_p_zz.xml */
int CMPLT_cmpeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmpgt_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24008010) {
		decode_fields32(ENC_CMPLT_CMPGT_P_P_ZZ_, dec);
		OK(ENC_CMPLT_CMPGT_P_P_ZZ_);
	}
	return rc;
}

/* cmpp_subps.xml */
int CMPP_SUBPS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUBPS_64S_dp_2src */
	/* sf=1|0|S=1|11010110|Xm=xxxxx|opcode=000000|Xn=xxxxx|Xd=11111 */
	if((INSWORD & 0xFFE0FC1F)==0xBAC0001F) {
		decode_fields32(ENC_CMPP_SUBPS_64S_DP_2SRC, dec);
		OK(ENC_CMPP_SUBPS_64S_DP_2SRC);
	}
	return rc;
}

/* cmp_subs_addsub_ext.xml */
int CMP_SUBS_addsub_ext(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7FE0001F)==0x6B20001F) {
		decode_fields32(ENC_CMP_SUBS_32S_ADDSUB_EXT, dec);
		if(dec->sf==0) OK(ENC_CMP_SUBS_32S_ADDSUB_EXT);
		if(dec->sf==1) OK(ENC_CMP_SUBS_64S_ADDSUB_EXT);
	}
	return rc;
}

/* cmp_subs_addsub_imm.xml */
int CMP_SUBS_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7F80001F)==0x7100001F) {
		decode_fields32(ENC_CMP_SUBS_32S_ADDSUB_IMM, dec);
		if(dec->sf==0) OK(ENC_CMP_SUBS_32S_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_CMP_SUBS_64S_ADDSUB_IMM);
	}
	return rc;
}

/* cmp_subs_addsub_shift.xml */
int CMP_SUBS_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7F20001F)==0x6B00001F) {
		decode_fields32(ENC_CMP_SUBS_32_ADDSUB_SHIFT, dec);
		if(dec->sf==0) OK(ENC_CMP_SUBS_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_CMP_SUBS_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* cmtst_advsimd.xml */
int CMTST_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CMTST_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E208C00) {
		decode_fields32(ENC_CMTST_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->and_test = (dec->U==0);
		OK(ENC_CMTST_ASISDSAME_ONLY);
	}
	/* class CMTST_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE208C00) {
		decode_fields32(ENC_CMTST_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->and_test = (dec->U==0);
		OK(ENC_CMTST_ASIMDSAME_ONLY);
	}
	return rc;
}

/* cneg_csneg.xml */
int CNEG_CSNEG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=1|S=0|11010100|Rm=xxxxx|cond!=111x|0|o2=1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x5A800400 && (INSWORD & 0xE000)!=0xE000) {
		decode_fields32(ENC_CNEG_CSNEG_32_CONDSEL, dec);
		if(dec->sf==0) OK(ENC_CNEG_CSNEG_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CNEG_CSNEG_64_CONDSEL);
	}
	return rc;
}

/* cnt_advsimd.xml */
int CNT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CNT_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE205800) {
		decode_fields32(ENC_CNT_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=0) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((8) ? ((dec->datasize) / (8)) : 0);
		OK(ENC_CNT_ASIMDMISC_R);
	}
	return rc;
}

/* cpp_sys.xml */
int CPP_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=011|CRn=0111|CRm=0011|op2=111|Rt=xxxxx */
	if((INSWORD & 0xFFFFFFE0)==0xD50B73E0) {
		decode_fields32(ENC_CPP_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_CPP_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* crc32.xml */
int CRC32(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class crc */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:3>=010|C=0|sz=xx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0F000)==0x1AC04000) {
		decode_fields32(ENC_CRC32B_32C_DP_2SRC, dec);
		if(!HaveCRCExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sf==1 && dec->sz!=3) {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->sz==3) {
			UNDEFINED;
		}
		dec->size = (8) << (UINT(dec->sz));
		dec->crc32c = (dec->C==1);
		if(dec->sf==0 && dec->sz==0) OK(ENC_CRC32B_32C_DP_2SRC);
		if(dec->sf==0 && dec->sz==1) OK(ENC_CRC32H_32C_DP_2SRC);
		if(dec->sf==0 && dec->sz==2) OK(ENC_CRC32W_32C_DP_2SRC);
		if(dec->sf==1 && dec->sz==3) OK(ENC_CRC32X_64C_DP_2SRC);
	}
	return rc;
}

/* crc32c.xml */
int CRC32C(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class crc */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:3>=010|C=1|sz=xx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0F000)==0x1AC05000) {
		decode_fields32(ENC_CRC32CB_32C_DP_2SRC, dec);
		if(!HaveCRCExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sf==1 && dec->sz!=3) {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->sz==3) {
			UNDEFINED;
		}
		dec->size = (8) << (UINT(dec->sz));
		dec->crc32c = (dec->C==1);
		if(dec->sf==0 && dec->sz==0) OK(ENC_CRC32CB_32C_DP_2SRC);
		if(dec->sf==0 && dec->sz==1) OK(ENC_CRC32CH_32C_DP_2SRC);
		if(dec->sf==0 && dec->sz==2) OK(ENC_CRC32CW_32C_DP_2SRC);
		if(dec->sf==1 && dec->sz==3) OK(ENC_CRC32CX_64C_DP_2SRC);
	}
	return rc;
}

/* csdb.xml */
int CSDB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class CSDB_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=100|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503229F) {
		decode_fields32(ENC_CSDB_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_CSDB_HI_HINTS);
	}
	return rc;
}

/* csel.xml */
int CSEL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010100|Rm=xxxxx|cond=xxxx|0|o2=0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x1A800000) {
		decode_fields32(ENC_CSEL_32_CONDSEL, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->condition = dec->cond;
		dec->else_inv = (dec->op==1);
		dec->else_inc = (dec->o2==1);
		if(dec->sf==0) OK(ENC_CSEL_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CSEL_64_CONDSEL);
	}
	return rc;
}

/* csetm_csinv.xml */
int CSETM_CSINV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=1|S=0|11010100|Rm=11111|cond!=111x|0|o2=0|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7FFF0FE0)==0x5A9F03E0 && (INSWORD & 0xE000)!=0xE000) {
		decode_fields32(ENC_CSETM_CSINV_32_CONDSEL, dec);
		if(dec->sf==0) OK(ENC_CSETM_CSINV_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CSETM_CSINV_64_CONDSEL);
	}
	return rc;
}

/* cset_csinc.xml */
int CSET_CSINC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010100|Rm=11111|cond!=111x|0|o2=1|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7FFF0FE0)==0x1A9F07E0 && (INSWORD & 0xE000)!=0xE000) {
		decode_fields32(ENC_CSET_CSINC_32_CONDSEL, dec);
		if(dec->sf==0) OK(ENC_CSET_CSINC_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CSET_CSINC_64_CONDSEL);
	}
	return rc;
}

/* csinc.xml */
int CSINC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010100|Rm=xxxxx|cond=xxxx|0|o2=1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x1A800400) {
		decode_fields32(ENC_CSINC_32_CONDSEL, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->condition = dec->cond;
		dec->else_inv = (dec->op==1);
		dec->else_inc = (dec->o2==1);
		/* regular aliases */
		if(dec->Rm!=0x1f && (dec->cond&14)!=14 && dec->Rn!=0x1f && dec->Rn==dec->Rm) return CINC_CSINC(ctx, dec);
		if(dec->Rm==0x1f && (dec->cond&14)!=14 && dec->Rn==0x1f) return CSET_CSINC(ctx, dec);
		if(dec->sf==0) OK(ENC_CSINC_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CSINC_64_CONDSEL);
	}
	return rc;
}

/* csinv.xml */
int CSINV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=1|S=0|11010100|Rm=xxxxx|cond=xxxx|0|o2=0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x5A800000) {
		decode_fields32(ENC_CSINV_32_CONDSEL, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->condition = dec->cond;
		dec->else_inv = (dec->op==1);
		dec->else_inc = (dec->o2==1);
		/* regular aliases */
		if(dec->Rm!=0x1f && (dec->cond&14)!=14 && dec->Rn!=0x1f && dec->Rn==dec->Rm) return CINV_CSINV(ctx, dec);
		if(dec->Rm==0x1f && (dec->cond&14)!=14 && dec->Rn==0x1f) return CSETM_CSINV(ctx, dec);
		if(dec->sf==0) OK(ENC_CSINV_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CSINV_64_CONDSEL);
	}
	return rc;
}

/* csneg.xml */
int CSNEG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=1|S=0|11010100|Rm=xxxxx|cond=xxxx|0|o2=1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00C00)==0x5A800400) {
		decode_fields32(ENC_CSNEG_32_CONDSEL, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->condition = dec->cond;
		dec->else_inv = (dec->op==1);
		dec->else_inc = (dec->o2==1);
		/* regular aliases */
		if((dec->cond&14)!=14 && dec->Rn==dec->Rm) return CNEG_CSNEG(ctx, dec);
		if(dec->sf==0) OK(ENC_CSNEG_32_CONDSEL);
		if(dec->sf==1) OK(ENC_CSNEG_64_CONDSEL);
	}
	return rc;
}

/* dcps1.xml */
int DCPS1(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DCPS1_DC_exception */
	/* 11010100|opc=101|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=01 */
	if((INSWORD & 0xFFE0001F)==0xD4A00001) {
		decode_fields32(ENC_DCPS1_DC_EXCEPTION, dec);
		dec->target_level = dec->LL;
		if(dec->LL==0) {
			UNDEFINED;
		}
		/* if(!Halted()) { UNDEFINED; } */
		OK(ENC_DCPS1_DC_EXCEPTION);
	}
	return rc;
}

/* dcps2.xml */
int DCPS2(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DCPS2_DC_exception */
	/* 11010100|opc=101|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=10 */
	if((INSWORD & 0xFFE0001F)==0xD4A00002) {
		decode_fields32(ENC_DCPS2_DC_EXCEPTION, dec);
		dec->target_level = dec->LL;
		if(dec->LL==0) {
			UNDEFINED;
		}
		/* if(!Halted()) { UNDEFINED; } */
		OK(ENC_DCPS2_DC_EXCEPTION);
	}
	return rc;
}

/* dcps3.xml */
int DCPS3(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DCPS3_DC_exception */
	/* 11010100|opc=101|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=11 */
	if((INSWORD & 0xFFE0001F)==0xD4A00003) {
		decode_fields32(ENC_DCPS3_DC_EXCEPTION, dec);
		dec->target_level = dec->LL;
		if(dec->LL==0) {
			UNDEFINED;
		}
		/* if(!Halted()) { UNDEFINED; } */
		OK(ENC_DCPS3_DC_EXCEPTION);
	}
	return rc;
}

/* dc_sys.xml */
int DC_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=xxx|CRn=0111|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF8F000)==0xD5087000) {
		decode_fields32(ENC_DC_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_DC_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* dgh.xml */
int DGH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DGH_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=110|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD50320DF) {
		decode_fields32(ENC_DGH_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_DGH_HI_HINTS);
	}
	return rc;
}

/* dmb.xml */
int DMB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DMB_BO_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|1|opc=01|Rt=11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD50330BF) {
		decode_fields32(ENC_DMB_BO_BARRIERS, dec);
		if(!SLICE(dec->CRm,3,2)) {
			dec->domain = MBReqDomain_OuterShareable;
		}
		else if(SLICE(dec->CRm,3,2)==1) {
			dec->domain = MBReqDomain_Nonshareable;
		}
		else if(SLICE(dec->CRm,3,2)==2) {
			dec->domain = MBReqDomain_InnerShareable;
		}
		else if(SLICE(dec->CRm,3,2)==3) {
			dec->domain = MBReqDomain_FullSystem;
		}
		if(!SLICE(dec->CRm,1,0)) {
			dec->types = MBReqTypes_All;
			dec->domain = MBReqDomain_FullSystem;
		}
		else if(SLICE(dec->CRm,1,0)==1) {
			dec->types = MBReqTypes_Reads;
		}
		else if(SLICE(dec->CRm,1,0)==2) {
			dec->types = MBReqTypes_Writes;
		}
		else if(SLICE(dec->CRm,1,0)==3) {
			dec->types = MBReqTypes_All;
		}
		OK(ENC_DMB_BO_BARRIERS);
	}
	return rc;
}

/* drps.xml */
int DRPS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DRPS_64E_branch_reg */
	/* 1101011|opc=0101|op2=11111|op3=000000|Rt=11111|op4=00000 */
	if((INSWORD & 0xFFFFFFFF)==0xD6BF03E0) {
		decode_fields32(ENC_DRPS_64E_BRANCH_REG, dec);
		/* if(!Halted() || ctx->pstate_el==EL0) { UNDEFINED; } */
		OK(ENC_DRPS_64E_BRANCH_REG);
	}
	return rc;
}

/* dsb.xml */
int DSB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DSB_BO_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm!=0x00|1|opc=00|Rt=11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD503309F && (INSWORD & 0xB00)!=0x0) {
		decode_fields32(ENC_DSB_BO_BARRIERS, dec);
		if(!SLICE(dec->CRm,3,2)) {
			dec->domain = MBReqDomain_OuterShareable;
		}
		else if(SLICE(dec->CRm,3,2)==1) {
			dec->domain = MBReqDomain_Nonshareable;
		}
		else if(SLICE(dec->CRm,3,2)==2) {
			dec->domain = MBReqDomain_InnerShareable;
		}
		else if(SLICE(dec->CRm,3,2)==3) {
			dec->domain = MBReqDomain_FullSystem;
		}
		if(!SLICE(dec->CRm,1,0)) {
			dec->types = MBReqTypes_All;
			dec->domain = MBReqDomain_FullSystem;
		}
		else if(SLICE(dec->CRm,1,0)==1) {
			dec->types = MBReqTypes_Reads;
		}
		else if(SLICE(dec->CRm,1,0)==2) {
			dec->types = MBReqTypes_Writes;
		}
		else if(SLICE(dec->CRm,1,0)==3) {
			dec->types = MBReqTypes_All;
		}
		OK(ENC_DSB_BO_BARRIERS);
	}
	return rc;
}

/* dup_advsimd_elt.xml */
int DUP_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DUP_asisdone_only */
	/* 01|op=0|11110000|imm5=xxxxx|0|imm4=0000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E000400) {
		decode_fields32(ENC_DUP_ASISDONE_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->size = LowestSetBit(dec->imm5);
		if(dec->size>3) {
			UNDEFINED;
		}
		dec->index = UINT(SLICE(dec->imm5,4,dec->size+1));
		dec->idxdsize = (SLICE(dec->imm5,4,4)==1) ? 0x80 : 0x40;
		dec->esize = (8) << (dec->size);
		dec->datasize = dec->esize;
		dec->elements = 1;
		/* unconditional alias */
		if(MOV_DUP_advsimd_elt(ctx, dec)==0) return 0;
		OK(ENC_DUP_ASISDONE_ONLY);
	}
	/* class DUP_asimdins_DV_v */
	/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4=0000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE000400) {
		decode_fields32(ENC_DUP_ASIMDINS_DV_V, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->size = LowestSetBit(dec->imm5);
		if(dec->size>3) {
			UNDEFINED;
		}
		dec->index = UINT(SLICE(dec->imm5,4,dec->size+1));
		dec->idxdsize = (SLICE(dec->imm5,4,4)==1) ? 0x80 : 0x40;
		if(dec->size==3 && dec->Q==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (dec->size);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		/* unconditional alias */
		if(MOV_DUP_advsimd_elt(ctx, dec)==0) return 0;
		OK(ENC_DUP_ASIMDINS_DV_V);
	}
	return rc;
}

/* dup_advsimd_gen.xml */
int DUP_advsimd_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DUP_asimdins_DR_r */
	/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4=0001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE000C00) {
		decode_fields32(ENC_DUP_ASIMDINS_DR_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->size = LowestSetBit(dec->imm5);
		if(dec->size>3) {
			UNDEFINED;
		}
		if(dec->size==3 && dec->Q==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (dec->size);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_DUP_ASIMDINS_DR_R);
	}
	return rc;
}

/* dvp_sys.xml */
int DVP_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=011|CRn=0111|CRm=0011|op2=101|Rt=xxxxx */
	if((INSWORD & 0xFFFFFFE0)==0xD50B73A0) {
		decode_fields32(ENC_DVP_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_DVP_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* eon.xml */
int EON(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=10|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x4A200000) {
		decode_fields32(ENC_EON_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		if(dec->sf==0) OK(ENC_EON_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_EON_64_LOG_SHIFT);
	}
	return rc;
}

/* eon_eor_z_zi.xml */
int EON_eor_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eor_z_zi_ */
	/* 00000101|opc=01|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5400000) {
		decode_fields32(ENC_EON_EOR_Z_ZI_, dec);
		OK(ENC_EON_EOR_Z_ZI_);
	}
	return rc;
}

/* eor3_advsimd.xml */
int EOR3_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class EOR3_VVV16_crypto4 */
	/* 110011100|Op0=00|Rm=xxxxx|0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0xCE000000) {
		decode_fields32(ENC_EOR3_VVV16_CRYPTO4, dec);
		if(!HaveSHA3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		OK(ENC_EOR3_VVV16_CRYPTO4);
	}
	return rc;
}

/* eor_advsimd.xml */
int EOR_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class EOR_asimdsame_only */
	/* 0|Q=x|U=1|01110|opc2=00|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E201C00) {
		decode_fields32(ENC_EOR_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!dec->opc2) {
			dec->op = VBitOp_VEOR;
		}
		else if(dec->opc2==1) {
			dec->op = VBitOp_VBSL;
		}
		else if(dec->opc2==2) {
			dec->op = VBitOp_VBIT;
		}
		else if(dec->opc2==3) {
			dec->op = VBitOp_VBIF;
		}
		OK(ENC_EOR_ASIMDSAME_ONLY);
	}
	return rc;
}

/* eor_log_imm.xml */
int EOR_log_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=10|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x52000000) {
		decode_fields32(ENC_EOR_32_LOG_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && dec->N!=0) {
			UNDEFINED;
		}
		DecodeBitMasksCheckUndefined(dec->N,dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->imm = dbmrt.wmask;
		if(dec->sf==0 && dec->N==0) OK(ENC_EOR_32_LOG_IMM);
		if(dec->sf==1) OK(ENC_EOR_64_LOG_IMM);
	}
	return rc;
}

/* eor_log_shift.xml */
int EOR_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|opc=10|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x4A000000) {
		decode_fields32(ENC_EOR_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		if(dec->sf==0) OK(ENC_EOR_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_EOR_64_LOG_SHIFT);
	}
	return rc;
}

/* eret.xml */
int ERET(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ERET_64E_branch_reg */
	/* 1101011|opc[3]=0|opc[2:0]=100|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=11111|op4=00000 */
	if((INSWORD & 0xFFFFFFFF)==0xD69F03E0) {
		decode_fields32(ENC_ERET_64E_BRANCH_REG, dec);
		/* if(ctx->pstate_el==EL0) { UNDEFINED; } */
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		if(!dec->pac && dec->op4!=0) {
			UNDEFINED;
		}
		else if(dec->pac && (!HavePACExt() || dec->op4!=0x1f)) {
			UNDEFINED;
		}
		if(dec->Rn!=0x1f) {
			UNDEFINED;
		}
		OK(ENC_ERET_64E_BRANCH_REG);
	}
	return rc;
}

/* ereta.xml */
int ERETA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* 1101011|opc[3]=0|opc[2:0]=100|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=11111|op4=11111 */
	if((INSWORD & 0xFFFFFBFF)==0xD69F0BFF) {
		decode_fields32(ENC_ERETAA_64E_BRANCH_REG, dec);
		/* if(ctx->pstate_el==EL0) { UNDEFINED; } */
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		if(!dec->pac && dec->op4!=0) {
			UNDEFINED;
		}
		else if(dec->pac && (!HavePACExt() || dec->op4!=0x1f)) {
			UNDEFINED;
		}
		if(dec->Rn!=0x1f) {
			UNDEFINED;
		}
		if(dec->M==0) OK(ENC_ERETAA_64E_BRANCH_REG);
		if(dec->M==1) OK(ENC_ERETAB_64E_BRANCH_REG);
	}
	return rc;
}

/* esb.xml */
int ESB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ESB_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=000|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503221F) {
		decode_fields32(ENC_ESB_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_ESB_HI_HINTS);
	}
	return rc;
}

/* extr.xml */
int EXTR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op21=00|100111|N=x|o0=0|Rm=xxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FA00000)==0x13800000) {
		decode_fields32(ENC_EXTR_32_EXTRACT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(dec->N!=dec->sf) {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->imms,5,5)==1) {
			UNDEFINED;
		}
		dec->lsb = UINT(dec->imms);
		/* regular aliases */
		if(dec->Rn==dec->Rm) return ROR_EXTR(ctx, dec);
		if(dec->sf==0 && dec->N==0 && !(dec->imms&0x20)) OK(ENC_EXTR_32_EXTRACT);
		if(dec->sf==1 && dec->N==1) OK(ENC_EXTR_64_EXTRACT);
	}
	return rc;
}

/* ext_advsimd.xml */
int EXT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class EXT_asimdext_only */
	/* 0|Q=x|101110|op2=00|0|Rm=xxxxx|0|imm4=xxxx|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE08400)==0x2E000000) {
		decode_fields32(ENC_EXT_ASIMDEXT_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->Q==0 && SLICE(dec->imm4,3,3)==1) {
			UNDEFINED;
		}
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->position = (UINT(dec->imm4)) << (3);
		OK(ENC_EXT_ASIMDEXT_ONLY);
	}
	return rc;
}

/* fabd_advsimd.xml */
int FABD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FABD_asisdsamefp16_only */
	/* 01|U=1|11110|a=1|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x7EC01400) {
		decode_fields32(ENC_FABD_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->abs = TRUE;
		OK(ENC_FABD_ASISDSAMEFP16_ONLY);
	}
	/* class FABD_asisdsame_only */
	/* 01|U=1|11110|1|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x7EA0D400) {
		decode_fields32(ENC_FABD_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->abs = TRUE;
		OK(ENC_FABD_ASISDSAME_ONLY);
	}
	/* class FABD_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|a=1|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EC01400) {
		decode_fields32(ENC_FABD_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->abs = (dec->U==1);
		OK(ENC_FABD_ASIMDSAMEFP16_ONLY);
	}
	/* class FABD_asimdsame_only */
	/* 0|Q=x|U=1|01110|1|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2EA0D400) {
		decode_fields32(ENC_FABD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->abs = (dec->U==1);
		OK(ENC_FABD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fabs_advsimd.xml */
int FABS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FABS_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|a=1|111100|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF8F800) {
		decode_fields32(ENC_FABS_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_FABS_ASIMDMISCFP16_R);
	}
	/* class FABS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|1|sz=x|10000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA0F800) {
		decode_fields32(ENC_FABS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_FABS_ASIMDMISC_R);
	}
	return rc;
}

/* fabs_float.xml */
int FABS_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|0000|opc=01|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E20C000) {
		decode_fields32(ENC_FABS_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->opc) {
			dec->fpop = FPUnaryOp_MOV;
		}
		else if(dec->opc==1) {
			dec->fpop = FPUnaryOp_ABS;
		}
		else if(dec->opc==2) {
			dec->fpop = FPUnaryOp_NEG;
		}
		else if(dec->opc==3) {
			dec->fpop = FPUnaryOp_SQRT;
		}
		if(dec->ftype==3) OK(ENC_FABS_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FABS_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FABS_D_FLOATDP1);
	}
	return rc;
}

/* facge_advsimd.xml */
int FACGE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FACGE_asisdsamefp16_only */
	/* 01|U=1|11110|E=0|10|Rm=xxxxx|00|10|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x7E402C00) {
		decode_fields32(ENC_FACGE_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGE_ASISDSAMEFP16_ONLY);
	}
	/* class FACGE_asisdsame_only */
	/* 01|U=1|11110|E=0|sz=x|1|Rm=xxxxx|1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x7E20EC00) {
		decode_fields32(ENC_FACGE_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGE_ASISDSAME_ONLY);
	}
	/* class FACGE_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|E=0|10|Rm=xxxxx|00|10|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E402C00) {
		decode_fields32(ENC_FACGE_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGE_ASIMDSAMEFP16_ONLY);
	}
	/* class FACGE_asimdsame_only */
	/* 0|Q=x|U=1|01110|E=0|sz=x|1|Rm=xxxxx|1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20EC00) {
		decode_fields32(ENC_FACGE_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGE_ASIMDSAME_ONLY);
	}
	return rc;
}

/* facgt_advsimd.xml */
int FACGT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FACGT_asisdsamefp16_only */
	/* 01|U=1|11110|E=1|10|Rm=xxxxx|00|10|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x7EC02C00) {
		decode_fields32(ENC_FACGT_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGT_ASISDSAMEFP16_ONLY);
	}
	/* class FACGT_asisdsame_only */
	/* 01|U=1|11110|E=1|sz=x|1|Rm=xxxxx|1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x7EA0EC00) {
		decode_fields32(ENC_FACGT_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGT_ASISDSAME_ONLY);
	}
	/* class FACGT_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|E=1|10|Rm=xxxxx|00|10|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EC02C00) {
		decode_fields32(ENC_FACGT_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGT_ASIMDSAMEFP16_ONLY);
	}
	/* class FACGT_asimdsame_only */
	/* 0|Q=x|U=1|01110|E=1|sz=x|1|Rm=xxxxx|1110|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2EA0EC00) {
		decode_fields32(ENC_FACGT_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FACGT_ASIMDSAME_ONLY);
	}
	return rc;
}

/* facle_facge_p_p_zz.xml */
int FACLE_facge_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class facge_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=0|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x6500C010) {
		decode_fields32(ENC_FACLE_FACGE_P_P_ZZ_, dec);
		OK(ENC_FACLE_FACGE_P_P_ZZ_);
	}
	return rc;
}

/* faclt_facge_p_p_zz.xml */
int FACLT_facge_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class facgt_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=1|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x6500E010) {
		decode_fields32(ENC_FACLT_FACGT_P_P_ZZ_, dec);
		OK(ENC_FACLT_FACGT_P_P_ZZ_);
	}
	return rc;
}

/* faddp_advsimd_pair.xml */
int FADDP_advsimd_pair(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FADDP_asisdpair_only_H */
	/* 01|U=0|11110|0|sz=0|11000|opcode=01101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E30D800) {
		decode_fields32(ENC_FADDP_ASISDPAIR_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = ReduceOp_FADD;
		OK(ENC_FADDP_ASISDPAIR_ONLY_H);
	}
	/* class FADDP_asisdpair_only_SD */
	/* 01|U=1|11110|0|sz=x|11000|opcode=01101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E30D800) {
		decode_fields32(ENC_FADDP_ASISDPAIR_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = ReduceOp_FADD;
		OK(ENC_FADDP_ASISDPAIR_ONLY_SD);
	}
	return rc;
}

/* faddp_advsimd_vec.xml */
int FADDP_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FADDP_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E401400) {
		decode_fields32(ENC_FADDP_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		OK(ENC_FADDP_ASIMDSAMEFP16_ONLY);
	}
	/* class FADDP_asimdsame_only */
	/* 0|Q=x|U=1|01110|0|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20D400) {
		decode_fields32(ENC_FADDP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		OK(ENC_FADDP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fadd_advsimd.xml */
int FADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FADD_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE401400) {
		decode_fields32(ENC_FADD_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		OK(ENC_FADD_ASIMDSAMEFP16_ONLY);
	}
	/* class FADD_asimdsame_only */
	/* 0|Q=x|U=0|01110|0|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20D400) {
		decode_fields32(ENC_FADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		OK(ENC_FADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fadd_float.xml */
int FADD_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|001|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E202800) {
		decode_fields32(ENC_FADD_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->sub_op = (dec->op==1);
		if(dec->ftype==3) OK(ENC_FADD_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FADD_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FADD_D_FLOATDP2);
	}
	return rc;
}

/* fcadd_advsimd_vec.xml */
int FCADD_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCADD_asimdsame2_C */
	/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|11|rot=x|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20EC00)==0x2E00E400) {
		decode_fields32(ENC_FCADD_ASIMDSAME2_C, dec);
		if(!HaveFCADDExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0) {
			UNDEFINED;
		}
		if(dec->Q==0 && dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		if(!HaveFP16Ext() && dec->esize==0x10) {
			UNDEFINED;
		}
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FCADD_ASIMDSAME2_C);
	}
	return rc;
}

/* fccmpe_float.xml */
int FCCMPE_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|cond=xxxx|01|Rn=xxxxx|op=1|nzcv=xxxx */
	if((INSWORD & 0xFF200C10)==0x1E200410) {
		decode_fields32(ENC_FCCMPE_H_FLOATCCMP, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->signal_all_nans = (dec->op==1);
		dec->condition = dec->cond;
		dec->flags = dec->nzcv;
		if(dec->ftype==3) OK(ENC_FCCMPE_H_FLOATCCMP);
		if(dec->ftype==0) OK(ENC_FCCMPE_S_FLOATCCMP);
		if(dec->ftype==1) OK(ENC_FCCMPE_D_FLOATCCMP);
	}
	return rc;
}

/* fccmp_float.xml */
int FCCMP_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|cond=xxxx|01|Rn=xxxxx|op=0|nzcv=xxxx */
	if((INSWORD & 0xFF200C10)==0x1E200400) {
		decode_fields32(ENC_FCCMP_H_FLOATCCMP, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->signal_all_nans = (dec->op==1);
		dec->condition = dec->cond;
		dec->flags = dec->nzcv;
		if(dec->ftype==3) OK(ENC_FCCMP_H_FLOATCCMP);
		if(dec->ftype==0) OK(ENC_FCCMP_S_FLOATCCMP);
		if(dec->ftype==1) OK(ENC_FCCMP_D_FLOATCCMP);
	}
	return rc;
}

/* fcmeq_advsimd_reg.xml */
int FCMEQ_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMEQ_asisdsamefp16_only */
	/* 01|U=0|11110|E=0|10|Rm=xxxxx|00|10|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E402400) {
		decode_fields32(ENC_FCMEQ_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMEQ_ASISDSAMEFP16_ONLY);
	}
	/* class FCMEQ_asisdsame_only */
	/* 01|U=0|11110|E=0|sz=x|1|Rm=xxxxx|1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x5E20E400) {
		decode_fields32(ENC_FCMEQ_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMEQ_ASISDSAME_ONLY);
	}
	/* class FCMEQ_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|E=0|10|Rm=xxxxx|00|10|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE402400) {
		decode_fields32(ENC_FCMEQ_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMEQ_ASIMDSAMEFP16_ONLY);
	}
	/* class FCMEQ_asimdsame_only */
	/* 0|Q=x|U=0|01110|E=0|sz=x|1|Rm=xxxxx|1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20E400) {
		decode_fields32(ENC_FCMEQ_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMEQ_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fcmeq_advsimd_zero.xml */
int FCMEQ_advsimd_zero(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMEQ_asisdmiscfp16_FZ */
	/* 01|U=0|11110|a=1|111100|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF8D800) {
		decode_fields32(ENC_FCMEQ_ASISDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMEQ_ASISDMISCFP16_FZ);
	}
	/* class FCMEQ_asisdmisc_FZ */
	/* 01|U=0|11110|1|sz=x|10000|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA0D800) {
		decode_fields32(ENC_FCMEQ_ASISDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMEQ_ASISDMISC_FZ);
	}
	/* class FCMEQ_asimdmiscfp16_FZ */
	/* 0|Q=x|U=0|01110|a=1|111100|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF8D800) {
		decode_fields32(ENC_FCMEQ_ASIMDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMEQ_ASIMDMISCFP16_FZ);
	}
	/* class FCMEQ_asimdmisc_FZ */
	/* 0|Q=x|U=0|01110|1|sz=x|10000|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA0D800) {
		decode_fields32(ENC_FCMEQ_ASIMDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMEQ_ASIMDMISC_FZ);
	}
	return rc;
}

/* fcmge_advsimd_reg.xml */
int FCMGE_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMGE_asisdsamefp16_only */
	/* 01|U=1|11110|E=0|10|Rm=xxxxx|00|10|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x7E402400) {
		decode_fields32(ENC_FCMGE_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGE_ASISDSAMEFP16_ONLY);
	}
	/* class FCMGE_asisdsame_only */
	/* 01|U=1|11110|E=0|sz=x|1|Rm=xxxxx|1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x7E20E400) {
		decode_fields32(ENC_FCMGE_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGE_ASISDSAME_ONLY);
	}
	/* class FCMGE_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|E=0|10|Rm=xxxxx|00|10|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E402400) {
		decode_fields32(ENC_FCMGE_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGE_ASIMDSAMEFP16_ONLY);
	}
	/* class FCMGE_asimdsame_only */
	/* 0|Q=x|U=1|01110|E=0|sz=x|1|Rm=xxxxx|1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20E400) {
		decode_fields32(ENC_FCMGE_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGE_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fcmge_advsimd_zero.xml */
int FCMGE_advsimd_zero(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMGE_asisdmiscfp16_FZ */
	/* 01|U=1|11110|a=1|111100|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7EF8C800) {
		decode_fields32(ENC_FCMGE_ASISDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGE_ASISDMISCFP16_FZ);
	}
	/* class FCMGE_asisdmisc_FZ */
	/* 01|U=1|11110|1|sz=x|10000|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EA0C800) {
		decode_fields32(ENC_FCMGE_ASISDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGE_ASISDMISC_FZ);
	}
	/* class FCMGE_asimdmiscfp16_FZ */
	/* 0|Q=x|U=1|01110|a=1|111100|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF8C800) {
		decode_fields32(ENC_FCMGE_ASIMDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGE_ASIMDMISCFP16_FZ);
	}
	/* class FCMGE_asimdmisc_FZ */
	/* 0|Q=x|U=1|01110|1|sz=x|10000|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA0C800) {
		decode_fields32(ENC_FCMGE_ASIMDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGE_ASIMDMISC_FZ);
	}
	return rc;
}

/* fcmgt_advsimd_reg.xml */
int FCMGT_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMGT_asisdsamefp16_only */
	/* 01|U=1|11110|E=1|10|Rm=xxxxx|00|10|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x7EC02400) {
		decode_fields32(ENC_FCMGT_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGT_ASISDSAMEFP16_ONLY);
	}
	/* class FCMGT_asisdsame_only */
	/* 01|U=1|11110|E=1|sz=x|1|Rm=xxxxx|1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x7EA0E400) {
		decode_fields32(ENC_FCMGT_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGT_ASISDSAME_ONLY);
	}
	/* class FCMGT_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|E=1|10|Rm=xxxxx|00|10|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EC02400) {
		decode_fields32(ENC_FCMGT_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGT_ASIMDSAMEFP16_ONLY);
	}
	/* class FCMGT_asimdsame_only */
	/* 0|Q=x|U=1|01110|E=1|sz=x|1|Rm=xxxxx|1110|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2EA0E400) {
		decode_fields32(ENC_FCMGT_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->E<<2)|(dec->U<<1)|dec->ac)) {
			dec->cmp = CompareOp_EQ;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==2) {
			dec->cmp = CompareOp_GE;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==3) {
			dec->cmp = CompareOp_GE;
			dec->abs = TRUE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==6) {
			dec->cmp = CompareOp_GT;
			dec->abs = FALSE;
		}
		else if(((dec->E<<2)|(dec->U<<1)|dec->ac)==7) {
			dec->cmp = CompareOp_GT;
			dec->abs = TRUE;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FCMGT_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fcmgt_advsimd_zero.xml */
int FCMGT_advsimd_zero(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMGT_asisdmiscfp16_FZ */
	/* 01|U=0|11110|a=1|111100|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF8C800) {
		decode_fields32(ENC_FCMGT_ASISDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGT_ASISDMISCFP16_FZ);
	}
	/* class FCMGT_asisdmisc_FZ */
	/* 01|U=0|11110|1|sz=x|10000|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA0C800) {
		decode_fields32(ENC_FCMGT_ASISDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGT_ASISDMISC_FZ);
	}
	/* class FCMGT_asimdmiscfp16_FZ */
	/* 0|Q=x|U=0|01110|a=1|111100|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF8C800) {
		decode_fields32(ENC_FCMGT_ASIMDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGT_ASIMDMISCFP16_FZ);
	}
	/* class FCMGT_asimdmisc_FZ */
	/* 0|Q=x|U=0|01110|1|sz=x|10000|0110|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA0C800) {
		decode_fields32(ENC_FCMGT_ASIMDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMGT_ASIMDMISC_FZ);
	}
	return rc;
}

/* fcmla_advsimd_elt.xml */
int FCMLA_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class 2reg_element */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|0|rot=xx|1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF009400)==0x2F001000) {
		decode_fields32(ENC_FCMLA_ASIMDELEM_C_H, dec);
		if(!HaveFCADDExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->M<<4)|dec->Rm));
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		if(dec->size==2) {
			dec->index = UINT(dec->H);
		}
		dec->esize = (8) << (UINT(dec->size));
		if(!HaveFP16Ext() && dec->esize==0x10) {
			UNDEFINED;
		}
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(dec->size==2 && (dec->L==1 || dec->Q==0)) {
			UNDEFINED;
		}
		if(dec->size==1 && dec->H==1 && dec->Q==0) {
			UNDEFINED;
		}
		if(dec->size==1) OK(ENC_FCMLA_ASIMDELEM_C_H);
		if(dec->size==2) OK(ENC_FCMLA_ASIMDELEM_C_S);
	}
	return rc;
}

/* fcmla_advsimd_vec.xml */
int FCMLA_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMLA_asimdsame2_C */
	/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|10|rot=xx|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20E400)==0x2E00C400) {
		decode_fields32(ENC_FCMLA_ASIMDSAME2_C, dec);
		if(!HaveFCADDExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0) {
			UNDEFINED;
		}
		if(dec->Q==0 && dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		if(!HaveFP16Ext() && dec->esize==0x10) {
			UNDEFINED;
		}
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FCMLA_ASIMDSAME2_C);
	}
	return rc;
}

/* fcmle_advsimd.xml */
int FCMLE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMLE_asisdmiscfp16_FZ */
	/* 01|U=1|11110|a=1|111100|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7EF8D800) {
		decode_fields32(ENC_FCMLE_ASISDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMLE_ASISDMISCFP16_FZ);
	}
	/* class FCMLE_asisdmisc_FZ */
	/* 01|U=1|11110|1|sz=x|10000|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EA0D800) {
		decode_fields32(ENC_FCMLE_ASISDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMLE_ASISDMISC_FZ);
	}
	/* class FCMLE_asimdmiscfp16_FZ */
	/* 0|Q=x|U=1|01110|a=1|111100|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF8D800) {
		decode_fields32(ENC_FCMLE_ASIMDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMLE_ASIMDMISCFP16_FZ);
	}
	/* class FCMLE_asimdmisc_FZ */
	/* 0|Q=x|U=1|01110|1|sz=x|10000|0110|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA0D800) {
		decode_fields32(ENC_FCMLE_ASIMDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		if(!((dec->op<<1)|dec->U)) {
			dec->comparison = CompareOp_GT;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->comparison = CompareOp_GE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->comparison = CompareOp_EQ;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->comparison = CompareOp_LE;
		}
		OK(ENC_FCMLE_ASIMDMISC_FZ);
	}
	return rc;
}

/* fcmle_fcmeq_p_p_zz.xml */
int FCMLE_fcmeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcmge_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x65004000) {
		decode_fields32(ENC_FCMLE_FCMGE_P_P_ZZ_, dec);
		OK(ENC_FCMLE_FCMGE_P_P_ZZ_);
	}
	return rc;
}

/* fcmlt_advsimd.xml */
int FCMLT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCMLT_asisdmiscfp16_FZ */
	/* 01|U=0|11110|a=1|111100|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF8E800) {
		decode_fields32(ENC_FCMLT_ASISDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->comparison = CompareOp_LT;
		OK(ENC_FCMLT_ASISDMISCFP16_FZ);
	}
	/* class FCMLT_asisdmisc_FZ */
	/* 01|U=0|11110|1|sz=x|10000|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA0E800) {
		decode_fields32(ENC_FCMLT_ASISDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->comparison = CompareOp_LT;
		OK(ENC_FCMLT_ASISDMISC_FZ);
	}
	/* class FCMLT_asimdmiscfp16_FZ */
	/* 0|Q=x|U=0|01110|a=1|111100|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF8E800) {
		decode_fields32(ENC_FCMLT_ASIMDMISCFP16_FZ, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->comparison = CompareOp_LT;
		OK(ENC_FCMLT_ASIMDMISCFP16_FZ);
	}
	/* class FCMLT_asimdmisc_FZ */
	/* 0|Q=x|U=0|01110|1|sz=x|10000|opcode=01110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA0E800) {
		decode_fields32(ENC_FCMLT_ASIMDMISC_FZ, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->comparison = CompareOp_LT;
		OK(ENC_FCMLT_ASIMDMISC_FZ);
	}
	return rc;
}

/* fcmlt_fcmeq_p_p_zz.xml */
int FCMLT_fcmeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcmgt_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x65004010) {
		decode_fields32(ENC_FCMLT_FCMGT_P_P_ZZ_, dec);
		OK(ENC_FCMLT_FCMGT_P_P_ZZ_);
	}
	return rc;
}

/* fcmpe_float.xml */
int FCMPE_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=00|1000|Rn=xxxxx|opc=1x|000 */
	if((INSWORD & 0xFF20FC17)==0x1E202010) {
		decode_fields32(ENC_FCMPE_H_FLOATCMP, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->signal_all_nans = (SLICE(dec->opc,1,1)==1);
		dec->cmp_with_zero = (SLICE(dec->opc,0,0)==1);
		if(dec->ftype==3 && dec->opc==2) OK(ENC_FCMPE_H_FLOATCMP);
		if(dec->ftype==3 && /* PreferBitsEqual(['dec->Rm'],'00000') */ true && dec->opc==3) OK(ENC_FCMPE_HZ_FLOATCMP);
		if(dec->ftype==0 && dec->opc==2) OK(ENC_FCMPE_S_FLOATCMP);
		if(dec->ftype==0 && /* PreferBitsEqual(['dec->Rm'],'00000') */ true && dec->opc==3) OK(ENC_FCMPE_SZ_FLOATCMP);
		if(dec->ftype==1 && dec->opc==2) OK(ENC_FCMPE_D_FLOATCMP);
		if(dec->ftype==1 && /* PreferBitsEqual(['dec->Rm'],'00000') */ true && dec->opc==3) OK(ENC_FCMPE_DZ_FLOATCMP);
	}
	return rc;
}

/* fcmp_float.xml */
int FCMP_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=00|1000|Rn=xxxxx|opc=0x|000 */
	if((INSWORD & 0xFF20FC17)==0x1E202000) {
		decode_fields32(ENC_FCMP_H_FLOATCMP, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->signal_all_nans = (SLICE(dec->opc,1,1)==1);
		dec->cmp_with_zero = (SLICE(dec->opc,0,0)==1);
		if(dec->ftype==3 && dec->opc==0) OK(ENC_FCMP_H_FLOATCMP);
		if(dec->ftype==3 && /* PreferBitsEqual(['dec->Rm'],'00000') */ true && dec->opc==1) OK(ENC_FCMP_HZ_FLOATCMP);
		if(dec->ftype==0 && dec->opc==0) OK(ENC_FCMP_S_FLOATCMP);
		if(dec->ftype==0 && /* PreferBitsEqual(['dec->Rm'],'00000') */ true && dec->opc==1) OK(ENC_FCMP_SZ_FLOATCMP);
		if(dec->ftype==1 && dec->opc==0) OK(ENC_FCMP_D_FLOATCMP);
		if(dec->ftype==1 && /* PreferBitsEqual(['dec->Rm'],'00000') */ true && dec->opc==1) OK(ENC_FCMP_DZ_FLOATCMP);
	}
	return rc;
}

/* fcsel_float.xml */
int FCSEL_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|cond=xxxx|11|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF200C00)==0x1E200C00) {
		decode_fields32(ENC_FCSEL_H_FLOATSEL, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->condition = dec->cond;
		if(dec->ftype==3) OK(ENC_FCSEL_H_FLOATSEL);
		if(dec->ftype==0) OK(ENC_FCSEL_S_FLOATSEL);
		if(dec->ftype==1) OK(ENC_FCSEL_D_FLOATSEL);
	}
	return rc;
}

/* fcvtas_advsimd.xml */
int FCVTAS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTAS_asisdmiscfp16_R */
	/* 01|U=0|11110|size<1>=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E79C800) {
		decode_fields32(ENC_FCVTAS_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAS_ASISDMISCFP16_R);
	}
	/* class FCVTAS_asisdmisc_R */
	/* 01|U=0|11110|0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5E21C800) {
		decode_fields32(ENC_FCVTAS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAS_ASISDMISC_R);
	}
	/* class FCVTAS_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|a=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE79C800) {
		decode_fields32(ENC_FCVTAS_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAS_ASIMDMISCFP16_R);
	}
	/* class FCVTAS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE21C800) {
		decode_fields32(ENC_FCVTAS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAS_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtas_float.xml */
int FCVTAS_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=100|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E240000) {
		decode_fields32(ENC_FCVTAS_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTAS_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTAS_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTAS_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTAS_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTAS_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTAS_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtau_advsimd.xml */
int FCVTAU_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTAU_asisdmiscfp16_R */
	/* 01|U=1|11110|size<1>=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7E79C800) {
		decode_fields32(ENC_FCVTAU_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAU_ASISDMISCFP16_R);
	}
	/* class FCVTAU_asisdmisc_R */
	/* 01|U=1|11110|0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E21C800) {
		decode_fields32(ENC_FCVTAU_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAU_ASISDMISC_R);
	}
	/* class FCVTAU_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|a=0|111100|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E79C800) {
		decode_fields32(ENC_FCVTAU_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAU_ASIMDMISCFP16_R);
	}
	/* class FCVTAU_asimdmisc_R */
	/* 0|Q=x|U=1|01110|0|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E21C800) {
		decode_fields32(ENC_FCVTAU_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPRounding_TIEAWAY;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTAU_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtau_float.xml */
int FCVTAU_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=101|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E250000) {
		decode_fields32(ENC_FCVTAU_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTAU_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTAU_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTAU_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTAU_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTAU_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTAU_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtl_advsimd.xml */
int FCVTL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTL_asimdmisc_L */
	/* 0|Q=x|U=0|01110|0|sz=x|10000|opcode=10111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE217800) {
		decode_fields32(ENC_FCVTL_ASIMDMISC_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x10) << (UINT(dec->sz));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FCVTL_ASIMDMISC_L);
	}
	return rc;
}

/* fcvtms_advsimd.xml */
int FCVTMS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTMS_asisdmiscfp16_R */
	/* 01|U=0|11110|o2=0|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E79B800) {
		decode_fields32(ENC_FCVTMS_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMS_ASISDMISCFP16_R);
	}
	/* class FCVTMS_asisdmisc_R */
	/* 01|U=0|11110|o2=0|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5E21B800) {
		decode_fields32(ENC_FCVTMS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMS_ASISDMISC_R);
	}
	/* class FCVTMS_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=0|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE79B800) {
		decode_fields32(ENC_FCVTMS_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMS_ASIMDMISCFP16_R);
	}
	/* class FCVTMS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE21B800) {
		decode_fields32(ENC_FCVTMS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMS_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtms_float.xml */
int FCVTMS_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=10|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E300000) {
		decode_fields32(ENC_FCVTMS_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTMS_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTMS_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTMS_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTMS_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTMS_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTMS_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtmu_advsimd.xml */
int FCVTMU_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTMU_asisdmiscfp16_R */
	/* 01|U=1|11110|o2=0|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7E79B800) {
		decode_fields32(ENC_FCVTMU_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMU_ASISDMISCFP16_R);
	}
	/* class FCVTMU_asisdmisc_R */
	/* 01|U=1|11110|o2=0|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E21B800) {
		decode_fields32(ENC_FCVTMU_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMU_ASISDMISC_R);
	}
	/* class FCVTMU_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=0|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E79B800) {
		decode_fields32(ENC_FCVTMU_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMU_ASIMDMISCFP16_R);
	}
	/* class FCVTMU_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E21B800) {
		decode_fields32(ENC_FCVTMU_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTMU_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtmu_float.xml */
int FCVTMU_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=10|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E310000) {
		decode_fields32(ENC_FCVTMU_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTMU_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTMU_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTMU_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTMU_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTMU_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTMU_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtns_advsimd.xml */
int FCVTNS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTNS_asisdmiscfp16_R */
	/* 01|U=0|11110|o2=0|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E79A800) {
		decode_fields32(ENC_FCVTNS_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNS_ASISDMISCFP16_R);
	}
	/* class FCVTNS_asisdmisc_R */
	/* 01|U=0|11110|o2=0|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5E21A800) {
		decode_fields32(ENC_FCVTNS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNS_ASISDMISC_R);
	}
	/* class FCVTNS_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=0|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE79A800) {
		decode_fields32(ENC_FCVTNS_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNS_ASIMDMISCFP16_R);
	}
	/* class FCVTNS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE21A800) {
		decode_fields32(ENC_FCVTNS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNS_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtns_float.xml */
int FCVTNS_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E200000) {
		decode_fields32(ENC_FCVTNS_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTNS_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTNS_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTNS_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTNS_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTNS_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTNS_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtnu_advsimd.xml */
int FCVTNU_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTNU_asisdmiscfp16_R */
	/* 01|U=1|11110|o2=0|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7E79A800) {
		decode_fields32(ENC_FCVTNU_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNU_ASISDMISCFP16_R);
	}
	/* class FCVTNU_asisdmisc_R */
	/* 01|U=1|11110|o2=0|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E21A800) {
		decode_fields32(ENC_FCVTNU_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNU_ASISDMISC_R);
	}
	/* class FCVTNU_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=0|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E79A800) {
		decode_fields32(ENC_FCVTNU_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNU_ASIMDMISCFP16_R);
	}
	/* class FCVTNU_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E21A800) {
		decode_fields32(ENC_FCVTNU_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTNU_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtnu_float.xml */
int FCVTNU_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E210000) {
		decode_fields32(ENC_FCVTNU_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTNU_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTNU_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTNU_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTNU_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTNU_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTNU_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtn_advsimd.xml */
int FCVTN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTN_asimdmisc_N */
	/* 0|Q=x|U=0|01110|0|sz=x|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE216800) {
		decode_fields32(ENC_FCVTN_ASIMDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x10) << (UINT(dec->sz));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FCVTN_ASIMDMISC_N);
	}
	return rc;
}

/* fcvtps_advsimd.xml */
int FCVTPS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTPS_asisdmiscfp16_R */
	/* 01|U=0|11110|o2=1|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF9A800) {
		decode_fields32(ENC_FCVTPS_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPS_ASISDMISCFP16_R);
	}
	/* class FCVTPS_asisdmisc_R */
	/* 01|U=0|11110|o2=1|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA1A800) {
		decode_fields32(ENC_FCVTPS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPS_ASISDMISC_R);
	}
	/* class FCVTPS_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=1|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF9A800) {
		decode_fields32(ENC_FCVTPS_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPS_ASIMDMISCFP16_R);
	}
	/* class FCVTPS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA1A800) {
		decode_fields32(ENC_FCVTPS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPS_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtps_float.xml */
int FCVTPS_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=01|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E280000) {
		decode_fields32(ENC_FCVTPS_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTPS_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTPS_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTPS_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTPS_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTPS_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTPS_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtpu_advsimd.xml */
int FCVTPU_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTPU_asisdmiscfp16_R */
	/* 01|U=1|11110|o2=1|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7EF9A800) {
		decode_fields32(ENC_FCVTPU_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPU_ASISDMISCFP16_R);
	}
	/* class FCVTPU_asisdmisc_R */
	/* 01|U=1|11110|o2=1|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EA1A800) {
		decode_fields32(ENC_FCVTPU_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPU_ASISDMISC_R);
	}
	/* class FCVTPU_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=1|111100|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF9A800) {
		decode_fields32(ENC_FCVTPU_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPU_ASIMDMISCFP16_R);
	}
	/* class FCVTPU_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=1|sz=x|10000|1101|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA1A800) {
		decode_fields32(ENC_FCVTPU_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTPU_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtpu_float.xml */
int FCVTPU_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=01|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E290000) {
		decode_fields32(ENC_FCVTPU_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTPU_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTPU_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTPU_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTPU_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTPU_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTPU_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtxn_advsimd.xml */
int FCVTXN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTXN_asisdmisc_N */
	/* 01|U=1|11110|0|sz=x|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E216800) {
		decode_fields32(ENC_FCVTXN_ASISDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->sz==0) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		OK(ENC_FCVTXN_ASISDMISC_N);
	}
	/* class FCVTXN_asimdmisc_N */
	/* 0|Q=x|U=1|01110|0|sz=x|10000|opcode=10110|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E216800) {
		decode_fields32(ENC_FCVTXN_ASIMDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->sz==0) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = 0x40;
		dec->elements = 2;
		dec->part = UINT(dec->Q);
		OK(ENC_FCVTXN_ASIMDMISC_N);
	}
	return rc;
}

/* fcvtzs_advsimd_fix.xml */
int FCVTZS_advsimd_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTZS_asisdshf_C */
	/* 01|U=0|111110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F00FC00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_FCVTZS_ASISDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_ASISDSHF_C);
	}
	/* class FCVTZS_asimdshf_C */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF00FC00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_FCVTZS_ASIMDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_ASIMDSHF_C);
	}
	return rc;
}

/* fcvtzs_advsimd_int.xml */
int FCVTZS_advsimd_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTZS_asisdmiscfp16_R */
	/* 01|U=0|11110|o2=1|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF9B800) {
		decode_fields32(ENC_FCVTZS_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZS_ASISDMISCFP16_R);
	}
	/* class FCVTZS_asisdmisc_R */
	/* 01|U=0|11110|o2=1|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA1B800) {
		decode_fields32(ENC_FCVTZS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZS_ASISDMISC_R);
	}
	/* class FCVTZS_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=1|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF9B800) {
		decode_fields32(ENC_FCVTZS_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZS_ASIMDMISCFP16_R);
	}
	/* class FCVTZS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA1B800) {
		decode_fields32(ENC_FCVTZS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZS_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtzs_float_fix.xml */
int FCVTZS_float_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|0|rmode=11|opcode=000|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3F0000)==0x1E180000) {
		decode_fields32(ENC_FCVTZS_32H_FLOAT2FIX, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(dec->sf==0 && SLICE(dec->scale,5,5)==0) {
			UNDEFINED;
		}
		dec->fracbits = 0x40-UINT(dec->scale);
		if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==3) {
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTZS_32H_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTZS_64H_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTZS_32S_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTZS_64S_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTZS_32D_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTZS_64D_FLOAT2FIX);
	}
	return rc;
}

/* fcvtzs_float_int.xml */
int FCVTZS_float_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=11|opcode=000|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E380000) {
		decode_fields32(ENC_FCVTZS_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTZS_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTZS_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTZS_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTZS_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTZS_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTZS_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvtzu_advsimd_fix.xml */
int FCVTZU_advsimd_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTZU_asisdshf_C */
	/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F00FC00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_FCVTZU_ASISDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_ASISDSHF_C);
	}
	/* class FCVTZU_asimdshf_C */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F00FC00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_FCVTZU_ASIMDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_ASIMDSHF_C);
	}
	return rc;
}

/* fcvtzu_advsimd_int.xml */
int FCVTZU_advsimd_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FCVTZU_asisdmiscfp16_R */
	/* 01|U=1|11110|o2=1|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7EF9B800) {
		decode_fields32(ENC_FCVTZU_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZU_ASISDMISCFP16_R);
	}
	/* class FCVTZU_asisdmisc_R */
	/* 01|U=1|11110|o2=1|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EA1B800) {
		decode_fields32(ENC_FCVTZU_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZU_ASISDMISC_R);
	}
	/* class FCVTZU_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=1|111100|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF9B800) {
		decode_fields32(ENC_FCVTZU_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZU_ASIMDMISCFP16_R);
	}
	/* class FCVTZU_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=1|sz=x|10000|1101|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA1B800) {
		decode_fields32(ENC_FCVTZU_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		dec->unsigned_ = (dec->U==1);
		OK(ENC_FCVTZU_ASIMDMISC_R);
	}
	return rc;
}

/* fcvtzu_float_fix.xml */
int FCVTZU_float_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|0|rmode=11|opcode=001|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3F0000)==0x1E190000) {
		decode_fields32(ENC_FCVTZU_32H_FLOAT2FIX, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(dec->sf==0 && SLICE(dec->scale,5,5)==0) {
			UNDEFINED;
		}
		dec->fracbits = 0x40-UINT(dec->scale);
		if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==3) {
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTZU_32H_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTZU_64H_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTZU_32S_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTZU_64S_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTZU_32D_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTZU_64D_FLOAT2FIX);
	}
	return rc;
}

/* fcvtzu_float_int.xml */
int FCVTZU_float_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=11|opcode=001|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E390000) {
		decode_fields32(ENC_FCVTZU_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_FCVTZU_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_FCVTZU_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_FCVTZU_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_FCVTZU_64S_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_FCVTZU_32D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_FCVTZU_64D_FLOAT2INT);
	}
	return rc;
}

/* fcvt_float.xml */
int FCVT_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|0001|opc=xx|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3E7C00)==0x1E224000) {
		decode_fields32(ENC_FCVT_SH_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->ftype==dec->opc) {
			UNDEFINED;
		}
		if(!dec->ftype) {
			dec->srcsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->srcsize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			dec->srcsize = 0x10;
		}
		if(!dec->opc) {
			dec->dstsize = 0x20;
		}
		else if(dec->opc==1) {
			dec->dstsize = 0x40;
		}
		else if(dec->opc==2) {
			UNDEFINED;
		}
		else if(dec->opc==3) {
			dec->dstsize = 0x10;
		}
		if(dec->ftype==3 && dec->opc==0) OK(ENC_FCVT_SH_FLOATDP1);
		if(dec->ftype==3 && dec->opc==1) OK(ENC_FCVT_DH_FLOATDP1);
		if(dec->ftype==0 && dec->opc==3) OK(ENC_FCVT_HS_FLOATDP1);
		if(dec->ftype==0 && dec->opc==1) OK(ENC_FCVT_DS_FLOATDP1);
		if(dec->ftype==1 && dec->opc==3) OK(ENC_FCVT_HD_FLOATDP1);
		if(dec->ftype==1 && dec->opc==0) OK(ENC_FCVT_SD_FLOATDP1);
	}
	return rc;
}

/* fdiv_advsimd.xml */
int FDIV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FDIV_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E403C00) {
		decode_fields32(ENC_FDIV_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FDIV_ASIMDSAMEFP16_ONLY);
	}
	/* class FDIV_asimdsame_only */
	/* 0|Q=x|U=1|01110|0|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20FC00) {
		decode_fields32(ENC_FDIV_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FDIV_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fdiv_float.xml */
int FDIV_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|opcode=0001|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E201800) {
		decode_fields32(ENC_FDIV_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(dec->ftype==3) OK(ENC_FDIV_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FDIV_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FDIV_D_FLOATDP2);
	}
	return rc;
}

/* fjcvtzs.xml */
int FJCVTZS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FJCVTZS_32D_float2int */
	/* sf=0|0|S=0|11110|ftype=01|1|rmode=11|opcode=110|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x1E7E0000) {
		decode_fields32(ENC_FJCVTZS_32D_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		OK(ENC_FJCVTZS_32D_FLOAT2INT);
	}
	return rc;
}

/* fmadd_float.xml */
int FMADD_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11111|ftype=xx|o1=0|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF208000)==0x1F000000) {
		decode_fields32(ENC_FMADD_H_FLOATDP3, dec);
		dec->d = UINT(dec->Rd);
		dec->a = UINT(dec->Ra);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->opa_neg = (dec->o1==1);
		dec->op1_neg = (dec->o0!=dec->o1);
		if(dec->ftype==3) OK(ENC_FMADD_H_FLOATDP3);
		if(dec->ftype==0) OK(ENC_FMADD_S_FLOATDP3);
		if(dec->ftype==1) OK(ENC_FMADD_D_FLOATDP3);
	}
	return rc;
}

/* fmaxnmp_advsimd_pair.xml */
int FMAXNMP_advsimd_pair(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXNMP_asisdpair_only_H */
	/* 01|U=0|11110|o1=0|sz=0|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E30C800) {
		decode_fields32(ENC_FMAXNMP_ASISDPAIR_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMAXNMP_ASISDPAIR_ONLY_H);
	}
	/* class FMAXNMP_asisdpair_only_SD */
	/* 01|U=1|11110|o1=0|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E30C800) {
		decode_fields32(ENC_FMAXNMP_ASISDPAIR_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMAXNMP_ASISDPAIR_ONLY_SD);
	}
	return rc;
}

/* fmaxnmp_advsimd_vec.xml */
int FMAXNMP_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXNMP_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E400400) {
		decode_fields32(ENC_FMAXNMP_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->a==1);
		OK(ENC_FMAXNMP_ASIMDSAMEFP16_ONLY);
	}
	/* class FMAXNMP_asimdsame_only */
	/* 0|Q=x|U=1|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20C400) {
		decode_fields32(ENC_FMAXNMP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMAXNMP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmaxnmv_advsimd.xml */
int FMAXNMV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXNMV_asimdall_only_H */
	/* 0|Q=x|U=0|01110|o1=0|0|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE30C800) {
		decode_fields32(ENC_FMAXNMV_ASIMDALL_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMAXNMV_ASIMDALL_ONLY_H);
	}
	/* class FMAXNMV_asimdall_only_SD */
	/* 0|Q=x|U=1|01110|o1=0|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E30C800) {
		decode_fields32(ENC_FMAXNMV_ASIMDALL_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)!=1) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMAXNMV_ASIMDALL_ONLY_SD);
	}
	return rc;
}

/* fmaxnm_advsimd.xml */
int FMAXNM_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXNM_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE400400) {
		decode_fields32(ENC_FMAXNM_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->a==1);
		OK(ENC_FMAXNM_ASIMDSAMEFP16_ONLY);
	}
	/* class FMAXNM_asimdsame_only */
	/* 0|Q=x|U=0|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20C400) {
		decode_fields32(ENC_FMAXNM_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMAXNM_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmaxnm_float.xml */
int FMAXNM_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|01|op=10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E206800) {
		decode_fields32(ENC_FMAXNM_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->op) {
			dec->operation_ = FPMaxMinOp_MAX;
		}
		else if(dec->op==1) {
			dec->operation_ = FPMaxMinOp_MIN;
		}
		else if(dec->op==2) {
			dec->operation_ = FPMaxMinOp_MAXNUM;
		}
		else if(dec->op==3) {
			dec->operation_ = FPMaxMinOp_MINNUM;
		}
		if(dec->ftype==3) OK(ENC_FMAXNM_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FMAXNM_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FMAXNM_D_FLOATDP2);
	}
	return rc;
}

/* fmaxp_advsimd_pair.xml */
int FMAXP_advsimd_pair(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXP_asisdpair_only_H */
	/* 01|U=0|11110|o1=0|sz=0|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E30F800) {
		decode_fields32(ENC_FMAXP_ASISDPAIR_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMAXP_ASISDPAIR_ONLY_H);
	}
	/* class FMAXP_asisdpair_only_SD */
	/* 01|U=1|11110|o1=0|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E30F800) {
		decode_fields32(ENC_FMAXP_ASISDPAIR_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMAXP_ASISDPAIR_ONLY_SD);
	}
	return rc;
}

/* fmaxp_advsimd_vec.xml */
int FMAXP_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXP_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|o1=0|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E403400) {
		decode_fields32(ENC_FMAXP_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMAXP_ASIMDSAMEFP16_ONLY);
	}
	/* class FMAXP_asimdsame_only */
	/* 0|Q=x|U=1|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20F400) {
		decode_fields32(ENC_FMAXP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMAXP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmaxv_advsimd.xml */
int FMAXV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAXV_asimdall_only_H */
	/* 0|Q=x|U=0|01110|o1=0|0|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE30F800) {
		decode_fields32(ENC_FMAXV_ASIMDALL_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMAXV_ASIMDALL_ONLY_H);
	}
	/* class FMAXV_asimdall_only_SD */
	/* 0|Q=x|U=1|01110|o1=0|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E30F800) {
		decode_fields32(ENC_FMAXV_ASIMDALL_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)!=1) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMAXV_ASIMDALL_ONLY_SD);
	}
	return rc;
}

/* fmax_advsimd.xml */
int FMAX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMAX_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|o1=0|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE403400) {
		decode_fields32(ENC_FMAX_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMAX_ASIMDSAMEFP16_ONLY);
	}
	/* class FMAX_asimdsame_only */
	/* 0|Q=x|U=0|01110|o1=0|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20F400) {
		decode_fields32(ENC_FMAX_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMAX_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmax_float.xml */
int FMAX_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|01|op=00|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E204800) {
		decode_fields32(ENC_FMAX_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->op) {
			dec->operation_ = FPMaxMinOp_MAX;
		}
		else if(dec->op==1) {
			dec->operation_ = FPMaxMinOp_MIN;
		}
		else if(dec->op==2) {
			dec->operation_ = FPMaxMinOp_MAXNUM;
		}
		else if(dec->op==3) {
			dec->operation_ = FPMaxMinOp_MINNUM;
		}
		if(dec->ftype==3) OK(ENC_FMAX_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FMAX_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FMAX_D_FLOATDP2);
	}
	return rc;
}

/* fminnmp_advsimd_pair.xml */
int FMINNMP_advsimd_pair(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINNMP_asisdpair_only_H */
	/* 01|U=0|11110|o1=1|sz=0|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EB0C800) {
		decode_fields32(ENC_FMINNMP_ASISDPAIR_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMINNMP_ASISDPAIR_ONLY_H);
	}
	/* class FMINNMP_asisdpair_only_SD */
	/* 01|U=1|11110|o1=1|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EB0C800) {
		decode_fields32(ENC_FMINNMP_ASISDPAIR_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMINNMP_ASISDPAIR_ONLY_SD);
	}
	return rc;
}

/* fminnmp_advsimd_vec.xml */
int FMINNMP_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINNMP_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|a=1|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EC00400) {
		decode_fields32(ENC_FMINNMP_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->a==1);
		OK(ENC_FMINNMP_ASIMDSAMEFP16_ONLY);
	}
	/* class FMINNMP_asimdsame_only */
	/* 0|Q=x|U=1|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2EA0C400) {
		decode_fields32(ENC_FMINNMP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMINNMP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fminnmv_advsimd.xml */
int FMINNMV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINNMV_asimdall_only_H */
	/* 0|Q=x|U=0|01110|o1=1|0|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEB0C800) {
		decode_fields32(ENC_FMINNMV_ASIMDALL_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMINNMV_ASIMDALL_ONLY_H);
	}
	/* class FMINNMV_asimdall_only_SD */
	/* 0|Q=x|U=1|01110|o1=1|sz=x|11000|opcode=01100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EB0C800) {
		decode_fields32(ENC_FMINNMV_ASIMDALL_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)!=1) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMINNUM : ReduceOp_FMAXNUM;
		OK(ENC_FMINNMV_ASIMDALL_ONLY_SD);
	}
	return rc;
}

/* fminnm_advsimd.xml */
int FMINNM_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINNM_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|Op3=000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEC00400) {
		decode_fields32(ENC_FMINNM_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->a==1);
		OK(ENC_FMINNM_ASIMDSAMEFP16_ONLY);
	}
	/* class FMINNM_asimdsame_only */
	/* 0|Q=x|U=0|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xEA0C400) {
		decode_fields32(ENC_FMINNM_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMINNM_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fminnm_float.xml */
int FMINNM_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|01|op=11|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E207800) {
		decode_fields32(ENC_FMINNM_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->op) {
			dec->operation_ = FPMaxMinOp_MAX;
		}
		else if(dec->op==1) {
			dec->operation_ = FPMaxMinOp_MIN;
		}
		else if(dec->op==2) {
			dec->operation_ = FPMaxMinOp_MAXNUM;
		}
		else if(dec->op==3) {
			dec->operation_ = FPMaxMinOp_MINNUM;
		}
		if(dec->ftype==3) OK(ENC_FMINNM_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FMINNM_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FMINNM_D_FLOATDP2);
	}
	return rc;
}

/* fminp_advsimd_pair.xml */
int FMINP_advsimd_pair(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINP_asisdpair_only_H */
	/* 01|U=0|11110|o1=1|sz=0|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EB0F800) {
		decode_fields32(ENC_FMINP_ASISDPAIR_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMINP_ASISDPAIR_ONLY_H);
	}
	/* class FMINP_asisdpair_only_SD */
	/* 01|U=1|11110|o1=1|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EB0F800) {
		decode_fields32(ENC_FMINP_ASISDPAIR_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->esize) * (2);
		dec->elements = 2;
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMINP_ASISDPAIR_ONLY_SD);
	}
	return rc;
}

/* fminp_advsimd_vec.xml */
int FMINP_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINP_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|o1=1|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EC03400) {
		decode_fields32(ENC_FMINP_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMINP_ASIMDSAMEFP16_ONLY);
	}
	/* class FMINP_asimdsame_only */
	/* 0|Q=x|U=1|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2EA0F400) {
		decode_fields32(ENC_FMINP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMINP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fminv_advsimd.xml */
int FMINV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMINV_asimdall_only_H */
	/* 0|Q=x|U=0|01110|o1=1|0|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEB0F800) {
		decode_fields32(ENC_FMINV_ASIMDALL_ONLY_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMINV_ASIMDALL_ONLY_H);
	}
	/* class FMINV_asimdall_only_SD */
	/* 0|Q=x|U=1|01110|o1=1|sz=x|11000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EB0F800) {
		decode_fields32(ENC_FMINV_ASIMDALL_ONLY_SD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)!=1) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->op = (dec->o1==1) ? ReduceOp_FMIN : ReduceOp_FMAX;
		OK(ENC_FMINV_ASIMDALL_ONLY_SD);
	}
	return rc;
}

/* fmin_advsimd.xml */
int FMIN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMIN_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|o1=1|10|Rm=xxxxx|00|opcode=110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEC03400) {
		decode_fields32(ENC_FMIN_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMIN_ASIMDSAMEFP16_ONLY);
	}
	/* class FMIN_asimdsame_only */
	/* 0|Q=x|U=0|01110|o1=1|sz=x|1|Rm=xxxxx|opcode=11110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xEA0F400) {
		decode_fields32(ENC_FMIN_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->pair = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_FMIN_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmin_float.xml */
int FMIN_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|01|op=01|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E205800) {
		decode_fields32(ENC_FMIN_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->op) {
			dec->operation_ = FPMaxMinOp_MAX;
		}
		else if(dec->op==1) {
			dec->operation_ = FPMaxMinOp_MIN;
		}
		else if(dec->op==2) {
			dec->operation_ = FPMaxMinOp_MAXNUM;
		}
		else if(dec->op==3) {
			dec->operation_ = FPMaxMinOp_MINNUM;
		}
		if(dec->ftype==3) OK(ENC_FMIN_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FMIN_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FMIN_D_FLOATDP2);
	}
	return rc;
}

/* fmlal_advsimd_elt.xml */
int FMLAL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLAL_asimdelem_LH */
	/* 0|Q=x|U=0|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=0|S=0|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF800000) {
		decode_fields32(ENC_FMLAL_ASIMDELEM_LH, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 0;
		OK(ENC_FMLAL_ASIMDELEM_LH);
	}
	/* class FMLAL2_asimdelem_LH */
	/* 0|Q=x|U=1|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=1|S=0|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0x2F808000) {
		decode_fields32(ENC_FMLAL2_ASIMDELEM_LH, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 1;
		OK(ENC_FMLAL2_ASIMDELEM_LH);
	}
	return rc;
}

/* fmlal_advsimd_vec.xml */
int FMLAL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLAL_asimdsame_F */
	/* 0|Q=x|U=0|01110|S=0|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE20EC00) {
		decode_fields32(ENC_FMLAL_ASIMDSAME_F, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 0;
		OK(ENC_FMLAL_ASIMDSAME_F);
	}
	/* class FMLAL2_asimdsame_F */
	/* 0|Q=x|U=1|01110|S=0|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E20CC00) {
		decode_fields32(ENC_FMLAL2_ASIMDSAME_F, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 1;
		OK(ENC_FMLAL2_ASIMDSAME_F);
	}
	return rc;
}

/* fmla_advsimd_elt.xml */
int FMLA_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLA_asisdelem_RH_H */
	/* 01|U=0|11111|size=00|L=x|M=x|Rm=xxxx|0|o2=0|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFC0F400)==0x5F001000) {
		decode_fields32(ENC_FMLA_ASISDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLA_ASISDELEM_RH_H);
	}
	/* class FMLA_asisdelem_R_SD */
	/* 01|U=0|11111|1|sz=x|L=x|M=x|Rm=xxxx|0|o2=0|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80F400)==0x5F801000) {
		decode_fields32(ENC_FMLA_ASISDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLA_ASISDELEM_R_SD);
	}
	/* class FMLA_asimdelem_RH_H */
	/* 0|Q=x|U=0|01111|size=00|L=x|M=x|Rm=xxxx|0|o2=0|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF001000) {
		decode_fields32(ENC_FMLA_ASIMDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLA_ASIMDELEM_RH_H);
	}
	/* class FMLA_asimdelem_R_SD */
	/* 0|Q=x|U=0|01111|1|sz=x|L=x|M=x|Rm=xxxx|0|o2=0|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80F400)==0xF801000) {
		decode_fields32(ENC_FMLA_ASIMDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLA_ASIMDELEM_R_SD);
	}
	return rc;
}

/* fmla_advsimd_vec.xml */
int FMLA_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLA_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE400C00) {
		decode_fields32(ENC_FMLA_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->a==1);
		OK(ENC_FMLA_ASIMDSAMEFP16_ONLY);
	}
	/* class FMLA_asimdsame_only */
	/* 0|Q=x|U=0|01110|op=0|sz=x|1|Rm=xxxxx|opcode=11001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20CC00) {
		decode_fields32(ENC_FMLA_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->op==1);
		OK(ENC_FMLA_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmlsl_advsimd_elt.xml */
int FMLSL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLSL_asimdelem_LH */
	/* 0|Q=x|U=0|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=0|S=1|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF804000) {
		decode_fields32(ENC_FMLSL_ASIMDELEM_LH, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 0;
		OK(ENC_FMLSL_ASIMDELEM_LH);
	}
	/* class FMLSL2_asimdelem_LH */
	/* 0|Q=x|U=1|01111|size[1]=1|sz=0|L=x|M=x|Rm=xxxx|opcode[3]=1|S=1|opcode[1:0]=00|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0x2F80C000) {
		decode_fields32(ENC_FMLSL2_ASIMDELEM_LH, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 1;
		OK(ENC_FMLSL2_ASIMDELEM_LH);
	}
	return rc;
}

/* fmlsl_advsimd_vec.xml */
int FMLSL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLSL_asimdsame_F */
	/* 0|Q=x|U=0|01110|S=1|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEA0EC00) {
		decode_fields32(ENC_FMLSL_ASIMDSAME_F, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 0;
		OK(ENC_FMLSL_ASIMDSAME_F);
	}
	/* class FMLSL2_asimdsame_F */
	/* 0|Q=x|U=1|01110|S=1|sz=0|1|Rm=xxxxx|opcode[4]=1|opcode[3:0]=1001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2EA0CC00) {
		decode_fields32(ENC_FMLSL2_ASIMDSAME_F, dec);
		if(!HaveFP16MulNoRoundingToFP32Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->S==1);
		dec->part = 1;
		OK(ENC_FMLSL2_ASIMDSAME_F);
	}
	return rc;
}

/* fmls_advsimd_elt.xml */
int FMLS_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLS_asisdelem_RH_H */
	/* 01|U=0|11111|size=00|L=x|M=x|Rm=xxxx|0|o2=1|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFC0F400)==0x5F005000) {
		decode_fields32(ENC_FMLS_ASISDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLS_ASISDELEM_RH_H);
	}
	/* class FMLS_asisdelem_R_SD */
	/* 01|U=0|11111|1|sz=x|L=x|M=x|Rm=xxxx|0|o2=1|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80F400)==0x5F805000) {
		decode_fields32(ENC_FMLS_ASISDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLS_ASISDELEM_R_SD);
	}
	/* class FMLS_asimdelem_RH_H */
	/* 0|Q=x|U=0|01111|size=00|L=x|M=x|Rm=xxxx|0|o2=1|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF005000) {
		decode_fields32(ENC_FMLS_ASIMDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLS_ASIMDELEM_RH_H);
	}
	/* class FMLS_asimdelem_R_SD */
	/* 0|Q=x|U=0|01111|1|sz=x|L=x|M=x|Rm=xxxx|0|o2=1|01|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80F400)==0xF805000) {
		decode_fields32(ENC_FMLS_ASIMDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_FMLS_ASIMDELEM_R_SD);
	}
	return rc;
}

/* fmls_advsimd_vec.xml */
int FMLS_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMLS_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|opcode=001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEC00C00) {
		decode_fields32(ENC_FMLS_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->a==1);
		OK(ENC_FMLS_ASIMDSAMEFP16_ONLY);
	}
	/* class FMLS_asimdsame_only */
	/* 0|Q=x|U=0|01110|op=1|sz=x|1|Rm=xxxxx|opcode=11001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xEA0CC00) {
		decode_fields32(ENC_FMLS_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->op==1);
		OK(ENC_FMLS_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmov_advsimd.xml */
int FMOV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMOV_asimdimm_H_h */
	/* 0|Q=x|op=0|0111100000|a=x|b=x|c=x|cmode=1111|o2=1|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */
	if((INSWORD & 0xBFF8FC00)==0xF00FC00) {
		decode_fields32(ENC_FMOV_ASIMDIMM_H_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->rd = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->imm8 = ((dec->a<<7)|(dec->b<<6)|(dec->c<<5)|(dec->d<<4)|(dec->e<<3)|(dec->f<<2)|(dec->g<<1)|dec->h);
		dec->imm16 = ((SLICE(dec->imm8,7,7)<<15)|(NOT(SLICE(dec->imm8,6,6),1)<<14)|(Replicate(SLICE(dec->imm8,6,6), 2, 1)<<12)|(SLICE(dec->imm8,5,0)<<6)|0);
		dec->imm = Replicate(dec->imm16, ((0x10) ? ((dec->datasize) / (0x10)) : 0), 16);
		OK(ENC_FMOV_ASIMDIMM_H_H);
	}
	/* class single_and_double */
	/* 0|Q=x|op=x|0111100000|a=x|b=x|c=x|cmode=1111|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */
	if((INSWORD & 0x9FF8FC00)==0xF00F400) {
		decode_fields32(ENC_FMOV_ASIMDIMM_S_S, dec);
		dec->rd = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		if(!(((dec->cmode<<1)|dec->op)&0x13)) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==1) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==2) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==3) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x10) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x11) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x12) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x13) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x18) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x19) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1e)==0x1c) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1e) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1f) {
			if(dec->Q==0) {
				UNDEFINED;
			}
			dec->operation_ = ImmediateOp_MOVI;
		}
		dec->imm64 = AdvSIMDExpandImm(dec->op,dec->cmode,((dec->a<<7)|(dec->b<<6)|(dec->c<<5)|(dec->d<<4)|(dec->e<<3)|(dec->f<<2)|(dec->g<<1)|dec->h));
		dec->imm = Replicate(dec->imm64, ((0x40) ? ((dec->datasize) / (0x40)) : 0), 64);
		if(dec->op==0) OK(ENC_FMOV_ASIMDIMM_S_S);
		if(dec->Q==1 && dec->op==1) OK(ENC_FMOV_ASIMDIMM_D2_D);
	}
	return rc;
}

/* fmov_cpy_z_p_i.xml */
int FMOV_cpy_z_p_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|0|M=1|sh=0|imm8=00000000|Zd=xxxxx */
	if((INSWORD & 0xFF30FFE0)==0x5104000) {
		decode_fields32(ENC_FMOV_CPY_Z_P_I_, dec);
		OK(ENC_FMOV_CPY_Z_P_I_);
	}
	return rc;
}

/* fmov_dup_z_i.xml */
int FMOV_dup_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_i_ */
	/* 00100101|size=xx|111|opc=00|011|sh=0|imm8=00000000|Zd=xxxxx */
	if((INSWORD & 0xFF3FFFE0)==0x2538C000) {
		decode_fields32(ENC_FMOV_DUP_Z_I_, dec);
		OK(ENC_FMOV_DUP_Z_I_);
	}
	return rc;
}

/* fmov_fcpy_z_p_i.xml */
int FMOV_fcpy_z_p_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcpy_z_p_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|110|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF30E000)==0x510C000) {
		decode_fields32(ENC_FMOV_FCPY_Z_P_I_, dec);
		OK(ENC_FMOV_FCPY_Z_P_I_);
	}
	return rc;
}

/* fmov_fdup_z_i.xml */
int FMOV_fdup_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fdup_z_i_ */
	/* 00100101|size=xx|111|opc=00|111|o2=0|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x2539C000) {
		decode_fields32(ENC_FMOV_FDUP_Z_I_, dec);
		OK(ENC_FMOV_FDUP_Z_I_);
	}
	return rc;
}

/* fmov_float.xml */
int FMOV_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|0000|opc=00|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E204000) {
		decode_fields32(ENC_FMOV_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->opc) {
			dec->fpop = FPUnaryOp_MOV;
		}
		else if(dec->opc==1) {
			dec->fpop = FPUnaryOp_ABS;
		}
		else if(dec->opc==2) {
			dec->fpop = FPUnaryOp_NEG;
		}
		else if(dec->opc==3) {
			dec->fpop = FPUnaryOp_SQRT;
		}
		if(dec->ftype==3) OK(ENC_FMOV_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FMOV_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FMOV_D_FLOATDP1);
	}
	return rc;
}

/* fmov_float_gen.xml */
int FMOV_float_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=0x|opcode=11x|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F36FC00)==0x1E260000) {
		decode_fields32(ENC_FMOV_32H_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3 && dec->rmode==0 && dec->opcode==6) OK(ENC_FMOV_32H_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3 && dec->rmode==0 && dec->opcode==6) OK(ENC_FMOV_64H_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==3 && dec->rmode==0 && dec->opcode==7) OK(ENC_FMOV_H32_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0 && dec->rmode==0 && dec->opcode==7) OK(ENC_FMOV_S32_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0 && dec->rmode==0 && dec->opcode==6) OK(ENC_FMOV_32S_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3 && dec->rmode==0 && dec->opcode==7) OK(ENC_FMOV_H64_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1 && dec->rmode==0 && dec->opcode==7) OK(ENC_FMOV_D64_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==2 && dec->rmode==1 && dec->opcode==7) OK(ENC_FMOV_V64I_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1 && dec->rmode==0 && dec->opcode==6) OK(ENC_FMOV_64D_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==2 && dec->rmode==1 && dec->opcode==6) OK(ENC_FMOV_64VX_FLOAT2INT);
	}
	return rc;
}

/* fmov_float_imm.xml */
int FMOV_float_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm8f */
	/* M=0|0|S=0|11110|ftype=xx|1|imm8=xxxxxxxx|100|imm5=00000|Rd=xxxxx */
	if((INSWORD & 0xFF201FE0)==0x1E201000) {
		decode_fields32(ENC_FMOV_H_FLOATIMM, dec);
		dec->d = UINT(dec->Rd);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->imm = VFPExpandImm(dec->imm8,8);
		if(dec->ftype==3) OK(ENC_FMOV_H_FLOATIMM);
		if(dec->ftype==0) OK(ENC_FMOV_S_FLOATIMM);
		if(dec->ftype==1) OK(ENC_FMOV_D_FLOATIMM);
	}
	return rc;
}

/* fmsub_float.xml */
int FMSUB_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11111|ftype=xx|o1=0|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF208000)==0x1F008000) {
		decode_fields32(ENC_FMSUB_H_FLOATDP3, dec);
		dec->d = UINT(dec->Rd);
		dec->a = UINT(dec->Ra);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->opa_neg = (dec->o1==1);
		dec->op1_neg = (dec->o0!=dec->o1);
		if(dec->ftype==3) OK(ENC_FMSUB_H_FLOATDP3);
		if(dec->ftype==0) OK(ENC_FMSUB_S_FLOATDP3);
		if(dec->ftype==1) OK(ENC_FMSUB_D_FLOATDP3);
	}
	return rc;
}

/* fmulx_advsimd_elt.xml */
int FMULX_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMULX_asisdelem_RH_H */
	/* 01|U=1|11111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFC0F400)==0x7F009000) {
		decode_fields32(ENC_FMULX_ASISDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMULX_ASISDELEM_RH_H);
	}
	/* class FMULX_asisdelem_R_SD */
	/* 01|U=1|11111|1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80F400)==0x7F809000) {
		decode_fields32(ENC_FMULX_ASISDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMULX_ASISDELEM_R_SD);
	}
	/* class FMULX_asimdelem_RH_H */
	/* 0|Q=x|U=1|01111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0x2F009000) {
		decode_fields32(ENC_FMULX_ASIMDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMULX_ASIMDELEM_RH_H);
	}
	/* class FMULX_asimdelem_R_SD */
	/* 0|Q=x|U=1|01111|1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80F400)==0x2F809000) {
		decode_fields32(ENC_FMULX_ASIMDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMULX_ASIMDELEM_R_SD);
	}
	return rc;
}

/* fmulx_advsimd_vec.xml */
int FMULX_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMULX_asisdsamefp16_only */
	/* 01|U=0|11110|a=0|10|Rm=xxxxx|00|opcode=011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E401C00) {
		decode_fields32(ENC_FMULX_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FMULX_ASISDSAMEFP16_ONLY);
	}
	/* class FMULX_asisdsame_only */
	/* 01|U=0|11110|0|sz=x|1|Rm=xxxxx|opcode=11011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x5E20DC00) {
		decode_fields32(ENC_FMULX_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FMULX_ASISDSAME_ONLY);
	}
	/* class FMULX_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE401C00) {
		decode_fields32(ENC_FMULX_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FMULX_ASIMDSAMEFP16_ONLY);
	}
	/* class FMULX_asimdsame_only */
	/* 0|Q=x|U=0|01110|0|sz=x|1|Rm=xxxxx|opcode=11011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20DC00) {
		decode_fields32(ENC_FMULX_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FMULX_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmul_advsimd_elt.xml */
int FMUL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMUL_asisdelem_RH_H */
	/* 01|U=0|11111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFC0F400)==0x5F009000) {
		decode_fields32(ENC_FMUL_ASISDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMUL_ASISDELEM_RH_H);
	}
	/* class FMUL_asisdelem_R_SD */
	/* 01|U=0|11111|1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80F400)==0x5F809000) {
		decode_fields32(ENC_FMUL_ASISDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMUL_ASISDELEM_R_SD);
	}
	/* class FMUL_asimdelem_RH_H */
	/* 0|Q=x|U=0|01111|size=00|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF009000) {
		decode_fields32(ENC_FMUL_ASIMDELEM_RH_H, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMUL_ASIMDELEM_RH_H);
	}
	/* class FMUL_asimdelem_R_SD */
	/* 0|Q=x|U=0|01111|1|sz=x|L=x|M=x|Rm=xxxx|opcode=1001|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80F400)==0xF809000) {
		decode_fields32(ENC_FMUL_ASIMDELEM_R_SD, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		dec->Rmhi = dec->M;
		if(!(((dec->sz<<1)|dec->L)&2)) {
			dec->index = UINT(((dec->H<<1)|dec->L));
		}
		else if(((dec->sz<<1)|dec->L)==2) {
			dec->index = UINT(dec->H);
		}
		else if(((dec->sz<<1)|dec->L)==3) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->mulx_op = (dec->U==1);
		OK(ENC_FMUL_ASIMDELEM_R_SD);
	}
	return rc;
}

/* fmul_advsimd_vec.xml */
int FMUL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FMUL_asimdsamefp16_only */
	/* 0|Q=x|U=1|01110|a=0|10|Rm=xxxxx|00|opcode=011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0x2E401C00) {
		decode_fields32(ENC_FMUL_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FMUL_ASIMDSAMEFP16_ONLY);
	}
	/* class FMUL_asimdsame_only */
	/* 0|Q=x|U=1|01110|0|sz=x|1|Rm=xxxxx|opcode=11011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0x2E20DC00) {
		decode_fields32(ENC_FMUL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FMUL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fmul_float.xml */
int FMUL_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=0|000|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E200800) {
		decode_fields32(ENC_FMUL_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->negated = (dec->op==1);
		if(dec->ftype==3) OK(ENC_FMUL_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FMUL_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FMUL_D_FLOATDP2);
	}
	return rc;
}

/* fneg_advsimd.xml */
int FNEG_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FNEG_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|a=1|111100|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF8F800) {
		decode_fields32(ENC_FNEG_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_FNEG_ASIMDMISCFP16_R);
	}
	/* class FNEG_asimdmisc_R */
	/* 0|Q=x|U=1|01110|1|sz=x|10000|opcode=01111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA0F800) {
		decode_fields32(ENC_FNEG_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_FNEG_ASIMDMISC_R);
	}
	return rc;
}

/* fneg_float.xml */
int FNEG_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|0000|opc=10|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E214000) {
		decode_fields32(ENC_FNEG_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->opc) {
			dec->fpop = FPUnaryOp_MOV;
		}
		else if(dec->opc==1) {
			dec->fpop = FPUnaryOp_ABS;
		}
		else if(dec->opc==2) {
			dec->fpop = FPUnaryOp_NEG;
		}
		else if(dec->opc==3) {
			dec->fpop = FPUnaryOp_SQRT;
		}
		if(dec->ftype==3) OK(ENC_FNEG_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FNEG_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FNEG_D_FLOATDP1);
	}
	return rc;
}

/* fnmadd_float.xml */
int FNMADD_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11111|ftype=xx|o1=1|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF208000)==0x1F200000) {
		decode_fields32(ENC_FNMADD_H_FLOATDP3, dec);
		dec->d = UINT(dec->Rd);
		dec->a = UINT(dec->Ra);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->opa_neg = (dec->o1==1);
		dec->op1_neg = (dec->o0!=dec->o1);
		if(dec->ftype==3) OK(ENC_FNMADD_H_FLOATDP3);
		if(dec->ftype==0) OK(ENC_FNMADD_S_FLOATDP3);
		if(dec->ftype==1) OK(ENC_FNMADD_D_FLOATDP3);
	}
	return rc;
}

/* fnmsub_float.xml */
int FNMSUB_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11111|ftype=xx|o1=1|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF208000)==0x1F208000) {
		decode_fields32(ENC_FNMSUB_H_FLOATDP3, dec);
		dec->d = UINT(dec->Rd);
		dec->a = UINT(dec->Ra);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->opa_neg = (dec->o1==1);
		dec->op1_neg = (dec->o0!=dec->o1);
		if(dec->ftype==3) OK(ENC_FNMSUB_H_FLOATDP3);
		if(dec->ftype==0) OK(ENC_FNMSUB_S_FLOATDP3);
		if(dec->ftype==1) OK(ENC_FNMSUB_D_FLOATDP3);
	}
	return rc;
}

/* fnmul_float.xml */
int FNMUL_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|op=1|000|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E208800) {
		decode_fields32(ENC_FNMUL_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->negated = (dec->op==1);
		if(dec->ftype==3) OK(ENC_FNMUL_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FNMUL_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FNMUL_D_FLOATDP2);
	}
	return rc;
}

/* frecpe_advsimd.xml */
int FRECPE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRECPE_asisdmiscfp16_R */
	/* 01|U=0|11110|size<1>=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF9D800) {
		decode_fields32(ENC_FRECPE_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRECPE_ASISDMISCFP16_R);
	}
	/* class FRECPE_asisdmisc_R */
	/* 01|U=0|11110|1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA1D800) {
		decode_fields32(ENC_FRECPE_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRECPE_ASISDMISC_R);
	}
	/* class FRECPE_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|a=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF9D800) {
		decode_fields32(ENC_FRECPE_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRECPE_ASIMDMISCFP16_R);
	}
	/* class FRECPE_asimdmisc_R */
	/* 0|Q=x|U=0|01110|1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA1D800) {
		decode_fields32(ENC_FRECPE_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRECPE_ASIMDMISC_R);
	}
	return rc;
}

/* frecps_advsimd.xml */
int FRECPS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRECPS_asisdsamefp16_only */
	/* 01|U=0|11110|a=0|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E403C00) {
		decode_fields32(ENC_FRECPS_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRECPS_ASISDSAMEFP16_ONLY);
	}
	/* class FRECPS_asisdsame_only */
	/* 01|U=0|11110|0|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x5E20FC00) {
		decode_fields32(ENC_FRECPS_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRECPS_ASISDSAME_ONLY);
	}
	/* class FRECPS_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=0|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE403C00) {
		decode_fields32(ENC_FRECPS_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRECPS_ASIMDSAMEFP16_ONLY);
	}
	/* class FRECPS_asimdsame_only */
	/* 0|Q=x|U=0|01110|0|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xE20FC00) {
		decode_fields32(ENC_FRECPS_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRECPS_ASIMDSAME_ONLY);
	}
	return rc;
}

/* frecpx_advsimd.xml */
int FRECPX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRECPX_asisdmiscfp16_R */
	/* 01|U=0|11110|a=1|111100|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5EF9F800) {
		decode_fields32(ENC_FRECPX_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRECPX_ASISDMISCFP16_R);
	}
	/* class FRECPX_asisdmisc_R */
	/* 01|U=0|11110|1|sz=x|10000|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5EA1F800) {
		decode_fields32(ENC_FRECPX_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRECPX_ASISDMISC_R);
	}
	return rc;
}

/* frint32x_advsimd.xml */
int FRINT32X_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINT32X_asimdmisc_R */
	/* 0|Q=x|U=1|01110|0|sz=x|10000|1111|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E21E800) {
		decode_fields32(ENC_FRINT32X_ASIMDMISC_R, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->intsize = (dec->op==0) ? 0x20 : 0x40;
		dec->rounding = (dec->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		OK(ENC_FRINT32X_ASIMDMISC_R);
	}
	return rc;
}

/* frint32x_float.xml */
int FRINT32X_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=0x|1|0100|op=01|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x1E28C000) {
		decode_fields32(ENC_FRINT32X_S_FLOATDP1, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if((dec->ftype&2)==2) {
			UNDEFINED;
		}
		dec->intsize = (SLICE(dec->op,1,1)==0) ? 0x20 : 0x40;
		dec->rounding = (SLICE(dec->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		if(dec->ftype==0) OK(ENC_FRINT32X_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINT32X_D_FLOATDP1);
	}
	return rc;
}

/* frint32z_advsimd.xml */
int FRINT32Z_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINT32Z_asimdmisc_R */
	/* 0|Q=x|U=0|01110|0|sz=x|10000|1111|op=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE21E800) {
		decode_fields32(ENC_FRINT32Z_ASIMDMISC_R, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->intsize = (dec->op==0) ? 0x20 : 0x40;
		dec->rounding = (dec->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		OK(ENC_FRINT32Z_ASIMDMISC_R);
	}
	return rc;
}

/* frint32z_float.xml */
int FRINT32Z_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=0x|1|0100|op=00|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x1E284000) {
		decode_fields32(ENC_FRINT32Z_S_FLOATDP1, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if((dec->ftype&2)==2) {
			UNDEFINED;
		}
		dec->intsize = (SLICE(dec->op,1,1)==0) ? 0x20 : 0x40;
		dec->rounding = (SLICE(dec->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		if(dec->ftype==0) OK(ENC_FRINT32Z_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINT32Z_D_FLOATDP1);
	}
	return rc;
}

/* frint64x_advsimd.xml */
int FRINT64X_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINT64X_asimdmisc_R */
	/* 0|Q=x|U=1|01110|0|sz=x|10000|1111|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E21F800) {
		decode_fields32(ENC_FRINT64X_ASIMDMISC_R, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->intsize = (dec->op==0) ? 0x20 : 0x40;
		dec->rounding = (dec->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		OK(ENC_FRINT64X_ASIMDMISC_R);
	}
	return rc;
}

/* frint64x_float.xml */
int FRINT64X_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=0x|1|0100|op=11|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x1E29C000) {
		decode_fields32(ENC_FRINT64X_S_FLOATDP1, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if((dec->ftype&2)==2) {
			UNDEFINED;
		}
		dec->intsize = (SLICE(dec->op,1,1)==0) ? 0x20 : 0x40;
		dec->rounding = (SLICE(dec->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		if(dec->ftype==0) OK(ENC_FRINT64X_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINT64X_D_FLOATDP1);
	}
	return rc;
}

/* frint64z_advsimd.xml */
int FRINT64Z_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINT64Z_asimdmisc_R */
	/* 0|Q=x|U=0|01110|0|sz=x|10000|1111|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE21F800) {
		decode_fields32(ENC_FRINT64Z_ASIMDMISC_R, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->intsize = (dec->op==0) ? 0x20 : 0x40;
		dec->rounding = (dec->U==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		OK(ENC_FRINT64Z_ASIMDMISC_R);
	}
	return rc;
}

/* frint64z_float.xml */
int FRINT64Z_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=0x|1|0100|op=10|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x1E294000) {
		decode_fields32(ENC_FRINT64Z_S_FLOATDP1, dec);
		if(!HaveFrintExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if((dec->ftype&2)==2) {
			UNDEFINED;
		}
		dec->intsize = (SLICE(dec->op,1,1)==0) ? 0x20 : 0x40;
		dec->rounding = (SLICE(dec->op,0,0)==0) ? FPRounding_ZERO : FPRoundingMode(ctx->FPCR);
		if(dec->ftype==0) OK(ENC_FRINT64Z_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINT64Z_D_FLOATDP1);
	}
	return rc;
}

/* frinta_advsimd.xml */
int FRINTA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTA_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=0|111100|1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E798800) {
		decode_fields32(ENC_FRINTA_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTA_ASIMDMISCFP16_R);
	}
	/* class FRINTA_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E218800) {
		decode_fields32(ENC_FRINTA_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTA_ASIMDMISC_R);
	}
	return rc;
}

/* frinta_float.xml */
int FRINTA_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=100|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E264000) {
		decode_fields32(ENC_FRINTA_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTA_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTA_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTA_D_FLOATDP1);
	}
	return rc;
}

/* frinti_advsimd.xml */
int FRINTI_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTI_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=1|111100|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF99800) {
		decode_fields32(ENC_FRINTI_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTI_ASIMDMISCFP16_R);
	}
	/* class FRINTI_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=1|sz=x|10000|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA19800) {
		decode_fields32(ENC_FRINTI_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTI_ASIMDMISC_R);
	}
	return rc;
}

/* frinti_float.xml */
int FRINTI_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=111|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E27C000) {
		decode_fields32(ENC_FRINTI_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTI_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTI_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTI_D_FLOATDP1);
	}
	return rc;
}

/* frintm_advsimd.xml */
int FRINTM_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTM_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=0|111100|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE799800) {
		decode_fields32(ENC_FRINTM_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTM_ASIMDMISCFP16_R);
	}
	/* class FRINTM_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE219800) {
		decode_fields32(ENC_FRINTM_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTM_ASIMDMISC_R);
	}
	return rc;
}

/* frintm_float.xml */
int FRINTM_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=010|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E254000) {
		decode_fields32(ENC_FRINTM_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTM_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTM_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTM_D_FLOATDP1);
	}
	return rc;
}

/* frintn_advsimd.xml */
int FRINTN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTN_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=0|111100|1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE798800) {
		decode_fields32(ENC_FRINTN_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTN_ASIMDMISCFP16_R);
	}
	/* class FRINTN_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=0|sz=x|10000|1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE218800) {
		decode_fields32(ENC_FRINTN_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTN_ASIMDMISC_R);
	}
	return rc;
}

/* frintn_float.xml */
int FRINTN_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=000|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E244000) {
		decode_fields32(ENC_FRINTN_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTN_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTN_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTN_D_FLOATDP1);
	}
	return rc;
}

/* frintp_advsimd.xml */
int FRINTP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTP_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=1|111100|1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF98800) {
		decode_fields32(ENC_FRINTP_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTP_ASIMDMISCFP16_R);
	}
	/* class FRINTP_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|1100|o1=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA18800) {
		decode_fields32(ENC_FRINTP_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTP_ASIMDMISC_R);
	}
	return rc;
}

/* frintp_float.xml */
int FRINTP_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=001|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E24C000) {
		decode_fields32(ENC_FRINTP_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTP_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTP_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTP_D_FLOATDP1);
	}
	return rc;
}

/* frintx_advsimd.xml */
int FRINTX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTX_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|o2=0|111100|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E799800) {
		decode_fields32(ENC_FRINTX_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTX_ASIMDMISCFP16_R);
	}
	/* class FRINTX_asimdmisc_R */
	/* 0|Q=x|U=1|01110|o2=0|sz=x|10000|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E219800) {
		decode_fields32(ENC_FRINTX_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTX_ASIMDMISC_R);
	}
	return rc;
}

/* frintx_float.xml */
int FRINTX_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=110|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E274000) {
		decode_fields32(ENC_FRINTX_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTX_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTX_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTX_D_FLOATDP1);
	}
	return rc;
}

/* frintz_advsimd.xml */
int FRINTZ_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRINTZ_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|o2=1|111100|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xEF99800) {
		decode_fields32(ENC_FRINTZ_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTZ_ASIMDMISCFP16_R);
	}
	/* class FRINTZ_asimdmisc_R */
	/* 0|Q=x|U=0|01110|o2=1|sz=x|10000|1100|o1=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA19800) {
		decode_fields32(ENC_FRINTZ_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->exact = FALSE;
		if(!(((dec->U<<2)|(dec->o1<<1)|dec->o2)&4)) {
			dec->rounding = FPDecodeRounding(((dec->o1<<1)|dec->o2));
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==5) {
			UNDEFINED;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(((dec->U<<2)|(dec->o1<<1)|dec->o2)==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		OK(ENC_FRINTZ_ASIMDMISC_R);
	}
	return rc;
}

/* frintz_float.xml */
int FRINTZ_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|001|rmode=011|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E25C000) {
		decode_fields32(ENC_FRINTZ_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->exact = FALSE;
		if(!(dec->rmode&4)) {
			dec->rounding = FPDecodeRounding(SLICE(dec->rmode,1,0));
		}
		else if(dec->rmode==4) {
			dec->rounding = FPRounding_TIEAWAY;
		}
		else if(dec->rmode==5) {
			UNDEFINED;
		}
		else if(dec->rmode==6) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->exact = TRUE;
		}
		else if(dec->rmode==7) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
		}
		if(dec->ftype==3) OK(ENC_FRINTZ_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FRINTZ_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FRINTZ_D_FLOATDP1);
	}
	return rc;
}

/* frsqrte_advsimd.xml */
int FRSQRTE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRSQRTE_asisdmiscfp16_R */
	/* 01|U=1|11110|a=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7EF9D800) {
		decode_fields32(ENC_FRSQRTE_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRSQRTE_ASISDMISCFP16_R);
	}
	/* class FRSQRTE_asisdmisc_R */
	/* 01|U=1|11110|1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7EA1D800) {
		decode_fields32(ENC_FRSQRTE_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRSQRTE_ASISDMISC_R);
	}
	/* class FRSQRTE_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|a=1|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF9D800) {
		decode_fields32(ENC_FRSQRTE_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRSQRTE_ASIMDMISCFP16_R);
	}
	/* class FRSQRTE_asimdmisc_R */
	/* 0|Q=x|U=1|01110|1|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA1D800) {
		decode_fields32(ENC_FRSQRTE_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRSQRTE_ASIMDMISC_R);
	}
	return rc;
}

/* frsqrts_advsimd.xml */
int FRSQRTS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FRSQRTS_asisdsamefp16_only */
	/* 01|U=0|11110|a=1|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5EC03C00) {
		decode_fields32(ENC_FRSQRTS_ASISDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRSQRTS_ASISDSAMEFP16_ONLY);
	}
	/* class FRSQRTS_asisdsame_only */
	/* 01|U=0|11110|1|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x5EA0FC00) {
		decode_fields32(ENC_FRSQRTS_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		OK(ENC_FRSQRTS_ASISDSAME_ONLY);
	}
	/* class FRSQRTS_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|opcode=111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEC03C00) {
		decode_fields32(ENC_FRSQRTS_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRSQRTS_ASIMDSAMEFP16_ONLY);
	}
	/* class FRSQRTS_asimdsame_only */
	/* 0|Q=x|U=0|01110|1|sz=x|1|Rm=xxxxx|opcode=11111|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xEA0FC00) {
		decode_fields32(ENC_FRSQRTS_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FRSQRTS_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fsqrt_advsimd.xml */
int FSQRT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FSQRT_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|a=1|111100|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2EF9F800) {
		decode_fields32(ENC_FSQRT_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FSQRT_ASIMDMISCFP16_R);
	}
	/* class FSQRT_asimdmisc_R */
	/* 0|Q=x|U=1|01110|1|sz=x|10000|opcode=11111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA1F800) {
		decode_fields32(ENC_FSQRT_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_FSQRT_ASIMDMISC_R);
	}
	return rc;
}

/* fsqrt_float.xml */
int FSQRT_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|0000|opc=11|10000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x1E21C000) {
		decode_fields32(ENC_FSQRT_H_FLOATDP1, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!dec->opc) {
			dec->fpop = FPUnaryOp_MOV;
		}
		else if(dec->opc==1) {
			dec->fpop = FPUnaryOp_ABS;
		}
		else if(dec->opc==2) {
			dec->fpop = FPUnaryOp_NEG;
		}
		else if(dec->opc==3) {
			dec->fpop = FPUnaryOp_SQRT;
		}
		if(dec->ftype==3) OK(ENC_FSQRT_H_FLOATDP1);
		if(dec->ftype==0) OK(ENC_FSQRT_S_FLOATDP1);
		if(dec->ftype==1) OK(ENC_FSQRT_D_FLOATDP1);
	}
	return rc;
}

/* fsub_advsimd.xml */
int FSUB_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class FSUB_asimdsamefp16_only */
	/* 0|Q=x|U=0|01110|a=1|10|Rm=xxxxx|00|opcode=010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEC01400) {
		decode_fields32(ENC_FSUB_ASIMDSAMEFP16_ONLY, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->abs = (dec->U==1);
		OK(ENC_FSUB_ASIMDSAMEFP16_ONLY);
	}
	/* class FSUB_asimdsame_only */
	/* 0|Q=x|U=0|01110|1|sz=x|1|Rm=xxxxx|opcode=11010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFA0FC00)==0xEA0D400) {
		decode_fields32(ENC_FSUB_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->abs = (dec->U==1);
		OK(ENC_FSUB_ASIMDSAME_ONLY);
	}
	return rc;
}

/* fsub_float.xml */
int FSUB_float(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* M=0|0|S=0|11110|ftype=xx|1|Rm=xxxxx|001|op=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x1E203800) {
		decode_fields32(ENC_FSUB_H_FLOATDP2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!dec->ftype) {
			dec->datasize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->datasize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->datasize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		dec->sub_op = (dec->op==1);
		if(dec->ftype==3) OK(ENC_FSUB_H_FLOATDP2);
		if(dec->ftype==0) OK(ENC_FSUB_S_FLOATDP2);
		if(dec->ftype==1) OK(ENC_FSUB_D_FLOATDP2);
	}
	return rc;
}

/* gmi.xml */
int GMI(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class GMI_64G_dp_2src */
	/* sf=1|0|S=0|11010110|Xm=xxxxx|opcode=000101|Xn=xxxxx|Xd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9AC01400) {
		decode_fields32(ENC_GMI_64G_DP_2SRC, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Xd);
		dec->n = UINT(dec->Xn);
		dec->m = UINT(dec->Xm);
		OK(ENC_GMI_64G_DP_2SRC);
	}
	return rc;
}

/* hint.xml */
int HINT(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class HINT_HM_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=xxxx|op2=xxx|Rt=11111 */
	if((INSWORD & 0xFFFFF01F)==0xD503201F) {
		decode_fields32(ENC_HINT_HM_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_HINT_HM_HINTS);
	}
	return rc;
}

/* hlt.xml */
int HLT(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class HLT_EX_exception */
	/* 11010100|opc=010|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=00 */
	if((INSWORD & 0xFFE0001F)==0xD4400000) {
		decode_fields32(ENC_HLT_EX_EXCEPTION, dec);
		if(ctx->EDSCR_HDE==0 || !HaltingAllowed()) {
			UNDEFINED;
		}
		if(HaveBTIExt()) {
			SetBTypeCompatible(TRUE);
		}
		OK(ENC_HLT_EX_EXCEPTION);
	}
	return rc;
}

/* hvc.xml */
int HVC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class HVC_EX_exception */
	/* 11010100|opc=000|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=10 */
	if((INSWORD & 0xFFE0001F)==0xD4000002) {
		decode_fields32(ENC_HVC_EX_EXCEPTION, dec);
		OK(ENC_HVC_EX_EXCEPTION);
	}
	return rc;
}

/* ic_sys.xml */
int IC_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=xxx|CRn=0111|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF8F000)==0xD5087000) {
		decode_fields32(ENC_IC_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_IC_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* ins_advsimd_elt.xml */
int INS_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class INS_asimdins_IV_v */
	/* 0|Q=1|op=1|01110000|imm5=xxxxx|0|imm4=xxxx|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08400)==0x6E000400) {
		decode_fields32(ENC_INS_ASIMDINS_IV_V, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->size = LowestSetBit(dec->imm5);
		if(dec->size>3) {
			UNDEFINED;
		}
		dec->dst_index = UINT(SLICE(dec->imm5,4,dec->size+1));
		dec->src_index = UINT(SLICE(dec->imm4,3,dec->size));
		dec->idxdsize = (SLICE(dec->imm4,3,3)==1) ? 0x80 : 0x40;
		dec->esize = (8) << (dec->size);
		/* unconditional alias */
		if(MOV_INS_advsimd_elt(ctx, dec)==0) return 0;
		OK(ENC_INS_ASIMDINS_IV_V);
	}
	return rc;
}

/* ins_advsimd_gen.xml */
int INS_advsimd_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class INS_asimdins_IR_r */
	/* 0|Q=1|op=0|01110000|imm5=xxxxx|0|imm4=0011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4E001C00) {
		decode_fields32(ENC_INS_ASIMDINS_IR_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->size = LowestSetBit(dec->imm5);
		if(dec->size>3) {
			UNDEFINED;
		}
		dec->index = UINT(SLICE(dec->imm5,4,dec->size+1));
		dec->esize = (8) << (dec->size);
		dec->datasize = 0x80;
		/* unconditional alias */
		if(MOV_INS_advsimd_gen(ctx, dec)==0) return 0;
		OK(ENC_INS_ASIMDINS_IR_R);
	}
	return rc;
}

/* irg.xml */
int IRG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class IRG_64I_dp_2src */
	/* sf=1|0|S=0|11010110|Xm=xxxxx|opcode=000100|Xn=xxxxx|Xd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9AC01000) {
		decode_fields32(ENC_IRG_64I_DP_2SRC, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Xd);
		dec->n = UINT(dec->Xn);
		dec->m = UINT(dec->Xm);
		OK(ENC_IRG_64I_DP_2SRC);
	}
	return rc;
}

/* isb.xml */
int ISB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ISB_BI_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=xxxx|1|opc=10|Rt=11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD50330DF) {
		decode_fields32(ENC_ISB_BI_BARRIERS, dec);
		OK(ENC_ISB_BI_BARRIERS);
	}
	return rc;
}

/* ld1r_advsimd.xml */
int LD1R_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD1R_asisdlso_R1 */
	/* 0|Q=x|0011010|L=1|R=0|00000|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xD40C000) {
		decode_fields32(ENC_LD1R_ASISDLSO_R1, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD1R_ASISDLSO_R1);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xDC0C000) {
		decode_fields32(ENC_LD1R_ASISDLSOP_R1_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD1R_ASISDLSOP_R1_I);
		if(dec->Rm!=0x1f) OK(ENC_LD1R_ASISDLSOP_RX1_R);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld1_advsimd_mult.xml */
int LD1_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011000|L=1|000000|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xC402000) {
		decode_fields32(ENC_LD1_ASISDLSE_R1_1V, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==7) OK(ENC_LD1_ASISDLSE_R1_1V);
		if(dec->opcode==10) OK(ENC_LD1_ASISDLSE_R2_2V);
		if(dec->opcode==6) OK(ENC_LD1_ASISDLSE_R3_3V);
		if(dec->opcode==2) OK(ENC_LD1_ASISDLSE_R4_4V);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xCC02000) {
		decode_fields32(ENC_LD1_ASISDLSEP_I1_I1, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==7) OK(ENC_LD1_ASISDLSEP_I1_I1);
		if(dec->Rm!=0x1f && dec->opcode==7) OK(ENC_LD1_ASISDLSEP_R1_R1);
		if(dec->Rm==0x1f && dec->opcode==10) OK(ENC_LD1_ASISDLSEP_I2_I2);
		if(dec->Rm!=0x1f && dec->opcode==10) OK(ENC_LD1_ASISDLSEP_R2_R2);
		if(dec->Rm==0x1f && dec->opcode==6) OK(ENC_LD1_ASISDLSEP_I3_I3);
		if(dec->Rm!=0x1f && dec->opcode==6) OK(ENC_LD1_ASISDLSEP_R3_R3);
		if(dec->Rm==0x1f && dec->opcode==2) OK(ENC_LD1_ASISDLSEP_I4_I4);
		if(dec->Rm!=0x1f && dec->opcode==2) OK(ENC_LD1_ASISDLSEP_R4_R4);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* ld1_advsimd_sngl.xml */
int LD1_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=1|R=0|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD400000) {
		decode_fields32(ENC_LD1_ASISDLSO_B1_1B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==0) OK(ENC_LD1_ASISDLSO_B1_1B);
		if(dec->opcode==2 && !(dec->size&1)) OK(ENC_LD1_ASISDLSO_H1_1H);
		if(dec->opcode==4 && dec->size==0) OK(ENC_LD1_ASISDLSO_S1_1S);
		if(dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_LD1_ASISDLSO_D1_1D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xDC00000) {
		decode_fields32(ENC_LD1_ASISDLSOP_B1_I1B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==0) OK(ENC_LD1_ASISDLSOP_B1_I1B);
		if(dec->Rm!=0x1f && dec->opcode==0) OK(ENC_LD1_ASISDLSOP_BX1_R1B);
		if(dec->Rm==0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_LD1_ASISDLSOP_H1_I1H);
		if(dec->Rm!=0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_LD1_ASISDLSOP_HX1_R1H);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->size==0) OK(ENC_LD1_ASISDLSOP_S1_I1S);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->size==0) OK(ENC_LD1_ASISDLSOP_SX1_R1S);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_LD1_ASISDLSOP_D1_I1D);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_LD1_ASISDLSOP_DX1_R1D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld2r_advsimd.xml */
int LD2R_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD2R_asisdlso_R2 */
	/* 0|Q=x|0011010|L=1|R=1|00000|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xD60C000) {
		decode_fields32(ENC_LD2R_ASISDLSO_R2, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD2R_ASISDLSO_R2);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=110|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xDE0C000) {
		decode_fields32(ENC_LD2R_ASISDLSOP_R2_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD2R_ASISDLSOP_R2_I);
		if(dec->Rm!=0x1f) OK(ENC_LD2R_ASISDLSOP_RX2_R);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld2_advsimd_mult.xml */
int LD2_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD2_asisdlse_R2 */
	/* 0|Q=x|0011000|L=1|000000|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xC408000) {
		decode_fields32(ENC_LD2_ASISDLSE_R2, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD2_ASISDLSE_R2);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xCC08000) {
		decode_fields32(ENC_LD2_ASISDLSEP_I2_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD2_ASISDLSEP_I2_I);
		if(dec->Rm!=0x1f) OK(ENC_LD2_ASISDLSEP_R2_R);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* ld2_advsimd_sngl.xml */
int LD2_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=1|R=1|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD600000) {
		decode_fields32(ENC_LD2_ASISDLSO_B2_2B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==0) OK(ENC_LD2_ASISDLSO_B2_2B);
		if(dec->opcode==2 && !(dec->size&1)) OK(ENC_LD2_ASISDLSO_H2_2H);
		if(dec->opcode==4 && dec->size==0) OK(ENC_LD2_ASISDLSO_S2_2S);
		if(dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_LD2_ASISDLSO_D2_2D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xDE00000) {
		decode_fields32(ENC_LD2_ASISDLSOP_B2_I2B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==0) OK(ENC_LD2_ASISDLSOP_B2_I2B);
		if(dec->Rm!=0x1f && dec->opcode==0) OK(ENC_LD2_ASISDLSOP_BX2_R2B);
		if(dec->Rm==0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_LD2_ASISDLSOP_H2_I2H);
		if(dec->Rm!=0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_LD2_ASISDLSOP_HX2_R2H);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->size==0) OK(ENC_LD2_ASISDLSOP_S2_I2S);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->size==0) OK(ENC_LD2_ASISDLSOP_SX2_R2S);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_LD2_ASISDLSOP_D2_I2D);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_LD2_ASISDLSOP_DX2_R2D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld3r_advsimd.xml */
int LD3R_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD3R_asisdlso_R3 */
	/* 0|Q=x|0011010|L=1|R=0|00000|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xD40E000) {
		decode_fields32(ENC_LD3R_ASISDLSO_R3, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD3R_ASISDLSO_R3);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xDC0E000) {
		decode_fields32(ENC_LD3R_ASISDLSOP_R3_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD3R_ASISDLSOP_R3_I);
		if(dec->Rm!=0x1f) OK(ENC_LD3R_ASISDLSOP_RX3_R);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld3_advsimd_mult.xml */
int LD3_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD3_asisdlse_R3 */
	/* 0|Q=x|0011000|L=1|000000|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xC404000) {
		decode_fields32(ENC_LD3_ASISDLSE_R3, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD3_ASISDLSE_R3);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xCC04000) {
		decode_fields32(ENC_LD3_ASISDLSEP_I3_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD3_ASISDLSEP_I3_I);
		if(dec->Rm!=0x1f) OK(ENC_LD3_ASISDLSEP_R3_R);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* ld3_advsimd_sngl.xml */
int LD3_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=1|R=0|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD402000) {
		decode_fields32(ENC_LD3_ASISDLSO_B3_3B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==1) OK(ENC_LD3_ASISDLSO_B3_3B);
		if(dec->opcode==3 && !(dec->size&1)) OK(ENC_LD3_ASISDLSO_H3_3H);
		if(dec->opcode==5 && dec->size==0) OK(ENC_LD3_ASISDLSO_S3_3S);
		if(dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_LD3_ASISDLSO_D3_3D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=0|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xDC02000) {
		decode_fields32(ENC_LD3_ASISDLSOP_B3_I3B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==1) OK(ENC_LD3_ASISDLSOP_B3_I3B);
		if(dec->Rm!=0x1f && dec->opcode==1) OK(ENC_LD3_ASISDLSOP_BX3_R3B);
		if(dec->Rm==0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_LD3_ASISDLSOP_H3_I3H);
		if(dec->Rm!=0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_LD3_ASISDLSOP_HX3_R3H);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->size==0) OK(ENC_LD3_ASISDLSOP_S3_I3S);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->size==0) OK(ENC_LD3_ASISDLSOP_SX3_R3S);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_LD3_ASISDLSOP_D3_I3D);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_LD3_ASISDLSOP_DX3_R3D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld4r_advsimd.xml */
int LD4R_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD4R_asisdlso_R4 */
	/* 0|Q=x|0011010|L=1|R=1|00000|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xD60E000) {
		decode_fields32(ENC_LD4R_ASISDLSO_R4, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD4R_ASISDLSO_R4);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=111|S=0|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xDE0E000) {
		decode_fields32(ENC_LD4R_ASISDLSOP_R4_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD4R_ASISDLSOP_R4_I);
		if(dec->Rm!=0x1f) OK(ENC_LD4R_ASISDLSOP_RX4_R);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ld4_advsimd_mult.xml */
int LD4_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LD4_asisdlse_R4 */
	/* 0|Q=x|0011000|L=1|000000|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xC400000) {
		decode_fields32(ENC_LD4_ASISDLSE_R4, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_LD4_ASISDLSE_R4);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=1|0|Rm=xxxxx|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xCC00000) {
		decode_fields32(ENC_LD4_ASISDLSEP_I4_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_LD4_ASISDLSEP_I4_I);
		if(dec->Rm!=0x1f) OK(ENC_LD4_ASISDLSEP_R4_R);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* ld4_advsimd_sngl.xml */
int LD4_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=1|R=1|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD602000) {
		decode_fields32(ENC_LD4_ASISDLSO_B4_4B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==1) OK(ENC_LD4_ASISDLSO_B4_4B);
		if(dec->opcode==3 && !(dec->size&1)) OK(ENC_LD4_ASISDLSO_H4_4H);
		if(dec->opcode==5 && dec->size==0) OK(ENC_LD4_ASISDLSO_S4_4S);
		if(dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_LD4_ASISDLSO_D4_4D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=1|R=1|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xDE02000) {
		decode_fields32(ENC_LD4_ASISDLSOP_B4_I4B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==1) OK(ENC_LD4_ASISDLSOP_B4_I4B);
		if(dec->Rm!=0x1f && dec->opcode==1) OK(ENC_LD4_ASISDLSOP_BX4_R4B);
		if(dec->Rm==0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_LD4_ASISDLSOP_H4_I4H);
		if(dec->Rm!=0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_LD4_ASISDLSOP_HX4_R4H);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->size==0) OK(ENC_LD4_ASISDLSOP_S4_I4S);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->size==0) OK(ENC_LD4_ASISDLSOP_SX4_R4S);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_LD4_ASISDLSOP_D4_I4D);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_LD4_ASISDLSOP_DX4_R4D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* ldadd.xml */
int LDADD(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8200000) {
		decode_fields32(ENC_LDADD_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STADD_LDADD(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDADD_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDADDA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDADDAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDADDL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDADD_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDADDA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDADDAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDADDL_64_MEMOP);
	}
	return rc;
}

/* ldaddb.xml */
int LDADDB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38200000) {
		decode_fields32(ENC_LDADDAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STADDB_LDADDB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDADDAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDADDALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDADDB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDADDLB_32_MEMOP);
	}
	return rc;
}

/* ldaddh.xml */
int LDADDH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78200000) {
		decode_fields32(ENC_LDADDAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STADDH_LDADDH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDADDAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDADDALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDADDH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDADDLH_32_MEMOP);
	}
	return rc;
}

/* ldapr.xml */
int LDAPR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=1|R=0|1|Rs=(1)(1)(1)(1)(1)|o3=1|opc=100|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xB8A0C000) {
		decode_fields32(ENC_LDAPR_32L_MEMOP, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->acctype = AccType_ORDERED;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_LDAPR_32L_MEMOP);
		if(dec->size==3) OK(ENC_LDAPR_64L_MEMOP);
	}
	return rc;
}

/* ldaprb.xml */
int LDAPRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAPRB_32L_memop */
	/* size=00|111|V=0|00|A=1|R=0|1|Rs=(1)(1)(1)(1)(1)|o3=1|opc=100|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x38A0C000) {
		decode_fields32(ENC_LDAPRB_32L_MEMOP, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->acctype = AccType_ORDERED;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDAPRB_32L_MEMOP);
	}
	return rc;
}

/* ldaprh.xml */
int LDAPRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAPRH_32L_memop */
	/* size=01|111|V=0|00|A=1|R=0|1|Rs=(1)(1)(1)(1)(1)|o3=1|opc=100|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x78A0C000) {
		decode_fields32(ENC_LDAPRH_32L_MEMOP, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->s = UINT(dec->Rs);
		dec->acctype = AccType_ORDERED;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDAPRH_32L_MEMOP);
	}
	return rc;
}

/* ldapurb.xml */
int LDAPURB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAPURB_32_ldapstl_unscaled */
	/* size=00|011001|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x19400000) {
		decode_fields32(ENC_LDAPURB_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDAPURB_32_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldapurh.xml */
int LDAPURH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAPURH_32_ldapstl_unscaled */
	/* size=01|011001|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x59400000) {
		decode_fields32(ENC_LDAPURH_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDAPURH_32_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldapursb.xml */
int LDAPURSB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=00|011001|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x19800000) {
		decode_fields32(ENC_LDAPURSB_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDAPURSB_32_LDAPSTL_UNSCALED);
		if(dec->opc==2) OK(ENC_LDAPURSB_64_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldapursh.xml */
int LDAPURSH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=01|011001|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x59800000) {
		decode_fields32(ENC_LDAPURSH_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDAPURSH_32_LDAPSTL_UNSCALED);
		if(dec->opc==2) OK(ENC_LDAPURSH_64_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldapursw.xml */
int LDAPURSW(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAPURSW_64_ldapstl_unscaled */
	/* size=10|011001|opc=10|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x99800000) {
		decode_fields32(ENC_LDAPURSW_64_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDAPURSW_64_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldapur_gen.xml */
int LDAPUR_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=1x|011001|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0x99400000) {
		decode_fields32(ENC_LDAPUR_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_LDAPUR_32_LDAPSTL_UNSCALED);
		if(dec->size==3) OK(ENC_LDAPUR_64_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldar.xml */
int LDAR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88C08000) {
		decode_fields32(ENC_LDAR_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_LDAR_LR32_LDSTEXCL);
		if(dec->size==3) OK(ENC_LDAR_LR64_LDSTEXCL);
	}
	return rc;
}

/* ldarb.xml */
int LDARB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDARB_LR32_ldstexcl */
	/* size=00|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8C08000) {
		decode_fields32(ENC_LDARB_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDARB_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldarh.xml */
int LDARH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDARH_LR32_ldstexcl */
	/* size=01|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48C08000) {
		decode_fields32(ENC_LDARH_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDARH_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldaxp.xml */
int LDAXP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* 1|sz=x|001000|o2=0|L=1|o1=1|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88608000) {
		decode_fields32(ENC_LDAXP_LP32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = TRUE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (0x20) << (UINT(dec->sz));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->sz==0) OK(ENC_LDAXP_LP32_LDSTEXCL);
		if(dec->sz==1) OK(ENC_LDAXP_LP64_LDSTEXCL);
	}
	return rc;
}

/* ldaxr.xml */
int LDAXR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88408000) {
		decode_fields32(ENC_LDAXR_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_LDAXR_LR32_LDSTEXCL);
		if(dec->size==3) OK(ENC_LDAXR_LR64_LDSTEXCL);
	}
	return rc;
}

/* ldaxrb.xml */
int LDAXRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAXRB_LR32_ldstexcl */
	/* size=00|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8408000) {
		decode_fields32(ENC_LDAXRB_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDAXRB_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldaxrh.xml */
int LDAXRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDAXRH_LR32_ldstexcl */
	/* size=01|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48408000) {
		decode_fields32(ENC_LDAXRH_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDAXRH_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldclr.xml */
int LDCLR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8201000) {
		decode_fields32(ENC_LDCLR_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STCLR_LDCLR(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDCLR_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDCLRA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDCLRAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDCLRL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDCLR_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDCLRA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDCLRAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDCLRL_64_MEMOP);
	}
	return rc;
}

/* ldclrb.xml */
int LDCLRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38201000) {
		decode_fields32(ENC_LDCLRAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STCLRB_LDCLRB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDCLRAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDCLRALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDCLRB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDCLRLB_32_MEMOP);
	}
	return rc;
}

/* ldclrh.xml */
int LDCLRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78201000) {
		decode_fields32(ENC_LDCLRAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STCLRH_LDCLRH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDCLRAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDCLRALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDCLRH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDCLRLH_32_MEMOP);
	}
	return rc;
}

/* ldeor.xml */
int LDEOR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8202000) {
		decode_fields32(ENC_LDEOR_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STEOR_LDEOR(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDEOR_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDEORA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDEORAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDEORL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDEOR_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDEORA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDEORAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDEORL_64_MEMOP);
	}
	return rc;
}

/* ldeorb.xml */
int LDEORB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38202000) {
		decode_fields32(ENC_LDEORAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STEORB_LDEORB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDEORAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDEORALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDEORB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDEORLB_32_MEMOP);
	}
	return rc;
}

/* ldeorh.xml */
int LDEORH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78202000) {
		decode_fields32(ENC_LDEORAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STEORH_LDEORH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDEORAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDEORALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDEORH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDEORLH_32_MEMOP);
	}
	return rc;
}

/* ldg.xml */
int LDG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDG_64Loffset_ldsttags */
	/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=00|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9600000) {
		decode_fields32(ENC_LDG_64LOFFSET_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Xt);
		dec->n = UINT(dec->Xn);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		OK(ENC_LDG_64LOFFSET_LDSTTAGS);
	}
	return rc;
}

/* ldgm.xml */
int LDGM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDGM_64bulk_ldsttags */
	/* 11011001|opc=11|1|imm9=000000000|op2=00|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xD9E00000) {
		decode_fields32(ENC_LDGM_64BULK_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Xt);
		dec->n = UINT(dec->Xn);
		OK(ENC_LDGM_64BULK_LDSTTAGS);
	}
	return rc;
}

/* ldlar.xml */
int LDLAR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88C00000) {
		decode_fields32(ENC_LDLAR_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_LDLAR_LR32_LDSTEXCL);
		if(dec->size==3) OK(ENC_LDLAR_LR64_LDSTEXCL);
	}
	return rc;
}

/* ldlarb.xml */
int LDLARB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDLARB_LR32_ldstexcl */
	/* size=00|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8C00000) {
		decode_fields32(ENC_LDLARB_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDLARB_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldlarh.xml */
int LDLARH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDLARH_LR32_ldstexcl */
	/* size=01|001000|o2=1|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48C00000) {
		decode_fields32(ENC_LDLARH_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDLARH_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldnp_fpsimd.xml */
int LDNP_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_scaled_offset */
	/* opc=xx|101|V=1|000|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2C400000) {
		decode_fields32(ENC_LDNP_S_LDSTNAPAIR_OFFS, dec);
		if(dec->opc==0) OK(ENC_LDNP_S_LDSTNAPAIR_OFFS);
		if(dec->opc==1) OK(ENC_LDNP_D_LDSTNAPAIR_OFFS);
		if(dec->opc==2) OK(ENC_LDNP_Q_LDSTNAPAIR_OFFS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_VECSTREAM;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(dec->opc==3) {
		UNDEFINED;
	}
	dec->scale = 2+UINT(dec->opc);
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* ldnp_gen.xml */
int LDNP_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_scaled_offset */
	/* opc=x0|101|V=0|000|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x28400000) {
		decode_fields32(ENC_LDNP_32_LDSTNAPAIR_OFFS, dec);
		if(dec->opc==0) OK(ENC_LDNP_32_LDSTNAPAIR_OFFS);
		if(dec->opc==2) OK(ENC_LDNP_64_LDSTNAPAIR_OFFS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_STREAM;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(SLICE(dec->opc,0,0)==1) {
		UNDEFINED;
	}
	dec->scale = 2+UINT(SLICE(dec->opc,1,1));
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* ldpsw.xml */
int LDPSW(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDPSW_64_ldstpair_post */
	/* opc=01|101|V=0|001|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x68C00000) {
		decode_fields32(ENC_LDPSW_64_LDSTPAIR_POST, dec);
		OK(ENC_LDPSW_64_LDSTPAIR_POST);
	}
	/* class LDPSW_64_ldstpair_pre */
	/* opc=01|101|V=0|011|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x69C00000) {
		decode_fields32(ENC_LDPSW_64_LDSTPAIR_PRE, dec);
		OK(ENC_LDPSW_64_LDSTPAIR_PRE);
	}
	/* class LDPSW_64_ldstpair_off */
	/* opc=01|101|V=0|010|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x69400000) {
		decode_fields32(ENC_LDPSW_64_LDSTPAIR_OFF, dec);
		OK(ENC_LDPSW_64_LDSTPAIR_OFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_NORMAL;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(((dec->L<<1)|SLICE(dec->opc,0,0))==1 || dec->opc==3) {
		UNDEFINED;
	}
	dec->signed_ = (SLICE(dec->opc,0,0)!=0);
	dec->scale = 2+UINT(SLICE(dec->opc,1,1));
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* ldp_fpsimd.xml */
int LDP_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* opc=xx|101|V=1|001|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2CC00000) {
		decode_fields32(ENC_LDP_S_LDSTPAIR_POST, dec);
		if(dec->opc==0) OK(ENC_LDP_S_LDSTPAIR_POST);
		if(dec->opc==1) OK(ENC_LDP_D_LDSTPAIR_POST);
		if(dec->opc==2) OK(ENC_LDP_Q_LDSTPAIR_POST);
	}
	/* class pre_indexed */
	/* opc=xx|101|V=1|011|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2DC00000) {
		decode_fields32(ENC_LDP_S_LDSTPAIR_PRE, dec);
		if(dec->opc==0) OK(ENC_LDP_S_LDSTPAIR_PRE);
		if(dec->opc==1) OK(ENC_LDP_D_LDSTPAIR_PRE);
		if(dec->opc==2) OK(ENC_LDP_Q_LDSTPAIR_PRE);
	}
	/* class signed_scaled_offset */
	/* opc=xx|101|V=1|010|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2D400000) {
		decode_fields32(ENC_LDP_S_LDSTPAIR_OFF, dec);
		if(dec->opc==0) OK(ENC_LDP_S_LDSTPAIR_OFF);
		if(dec->opc==1) OK(ENC_LDP_D_LDSTPAIR_OFF);
		if(dec->opc==2) OK(ENC_LDP_Q_LDSTPAIR_OFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(dec->opc==3) {
		UNDEFINED;
	}
	dec->scale = 2+UINT(dec->opc);
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* ldp_gen.xml */
int LDP_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* opc=x0|101|V=0|001|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x28C00000) {
		decode_fields32(ENC_LDP_32_LDSTPAIR_POST, dec);
		if(dec->opc==0) OK(ENC_LDP_32_LDSTPAIR_POST);
		if(dec->opc==2) OK(ENC_LDP_64_LDSTPAIR_POST);
	}
	/* class pre_indexed */
	/* opc=x0|101|V=0|011|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x29C00000) {
		decode_fields32(ENC_LDP_32_LDSTPAIR_PRE, dec);
		if(dec->opc==0) OK(ENC_LDP_32_LDSTPAIR_PRE);
		if(dec->opc==2) OK(ENC_LDP_64_LDSTPAIR_PRE);
	}
	/* class signed_scaled_offset */
	/* opc=x0|101|V=0|010|L=1|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x29400000) {
		decode_fields32(ENC_LDP_32_LDSTPAIR_OFF, dec);
		if(dec->opc==0) OK(ENC_LDP_32_LDSTPAIR_OFF);
		if(dec->opc==2) OK(ENC_LDP_64_LDSTPAIR_OFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_NORMAL;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(((dec->L<<1)|SLICE(dec->opc,0,0))==1 || dec->opc==3) {
		UNDEFINED;
	}
	dec->signed_ = (SLICE(dec->opc,0,0)!=0);
	dec->scale = 2+UINT(SLICE(dec->opc,1,1));
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* ldra.xml */
int LDRA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=11|111|V=0|00|M=x|S=x|1|imm9=xxxxxxxxx|W=x|1|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF200400)==0xF8200400) {
		decode_fields32(ENC_LDRAA_64_LDST_PAC, dec);
		if(!HavePACExt() || dec->size!=3) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->wback = (dec->W==1);
		dec->use_key_a = (dec->M==0);
		dec->S10 = ((dec->S<<9)|dec->imm9);
		dec->scale = 3;
		dec->offset = LSL(SignExtend(dec->S10,10),dec->scale);
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->M==0 && dec->W==0) OK(ENC_LDRAA_64_LDST_PAC);
		if(dec->M==0 && dec->W==1) OK(ENC_LDRAA_64W_LDST_PAC);
		if(dec->M==1 && dec->W==0) OK(ENC_LDRAB_64_LDST_PAC);
		if(dec->M==1 && dec->W==1) OK(ENC_LDRAB_64W_LDST_PAC);
	}
	return rc;
}

/* ldrb_imm.xml */
int LDRB_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDRB_32_ldst_immpost */
	/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38400400) {
		decode_fields32(ENC_LDRB_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDRB_32_LDST_IMMPOST);
	}
	/* class LDRB_32_ldst_immpre */
	/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38400C00) {
		decode_fields32(ENC_LDRB_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDRB_32_LDST_IMMPRE);
	}
	/* class LDRB_32_ldst_pos */
	/* size=00|111|V=0|01|opc=01|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x39400000) {
		decode_fields32(ENC_LDRB_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		OK(ENC_LDRB_32_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldrb_reg.xml */
int LDRB_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class 32 */
	/* size=00|111|V=0|00|opc=01|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38600800) {
		decode_fields32(ENC_LDRB_32B_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->option!=3) OK(ENC_LDRB_32B_LDST_REGOFF);
		if(dec->option==3) OK(ENC_LDRB_32BL_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldrh_imm.xml */
int LDRH_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDRH_32_ldst_immpost */
	/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78400400) {
		decode_fields32(ENC_LDRH_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDRH_32_LDST_IMMPOST);
	}
	/* class LDRH_32_ldst_immpre */
	/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78400C00) {
		decode_fields32(ENC_LDRH_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDRH_32_LDST_IMMPRE);
	}
	/* class LDRH_32_ldst_pos */
	/* size=01|111|V=0|01|opc=01|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x79400000) {
		decode_fields32(ENC_LDRH_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		OK(ENC_LDRH_32_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldrh_reg.xml */
int LDRH_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDRH_32_ldst_regoff */
	/* size=01|111|V=0|00|opc=01|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78600800) {
		decode_fields32(ENC_LDRH_32_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		OK(ENC_LDRH_32_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldrsb_imm.xml */
int LDRSB_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x38800400) {
		decode_fields32(ENC_LDRSB_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDRSB_32_LDST_IMMPOST);
		if(dec->opc==2) OK(ENC_LDRSB_64_LDST_IMMPOST);
	}
	/* class pre_indexed */
	/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x38800C00) {
		decode_fields32(ENC_LDRSB_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDRSB_32_LDST_IMMPRE);
		if(dec->opc==2) OK(ENC_LDRSB_64_LDST_IMMPRE);
	}
	/* class unsigned_scaled_offset */
	/* size=00|111|V=0|01|opc=1x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF800000)==0x39800000) {
		decode_fields32(ENC_LDRSB_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		if(dec->opc==3) OK(ENC_LDRSB_32_LDST_POS);
		if(dec->opc==2) OK(ENC_LDRSB_64_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldrsb_reg.xml */
int LDRSB_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|opc=1x|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x38A00800) {
		decode_fields32(ENC_LDRSB_32B_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->opc==3 && dec->option!=3) OK(ENC_LDRSB_32B_LDST_REGOFF);
		if(dec->opc==3 && dec->option==3) OK(ENC_LDRSB_32BL_LDST_REGOFF);
		if(dec->opc==2 && dec->option!=3) OK(ENC_LDRSB_64B_LDST_REGOFF);
		if(dec->opc==2 && dec->option==3) OK(ENC_LDRSB_64BL_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldrsh_imm.xml */
int LDRSH_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x78800400) {
		decode_fields32(ENC_LDRSH_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDRSH_32_LDST_IMMPOST);
		if(dec->opc==2) OK(ENC_LDRSH_64_LDST_IMMPOST);
	}
	/* class pre_indexed */
	/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x78800C00) {
		decode_fields32(ENC_LDRSH_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDRSH_32_LDST_IMMPRE);
		if(dec->opc==2) OK(ENC_LDRSH_64_LDST_IMMPRE);
	}
	/* class unsigned_scaled_offset */
	/* size=01|111|V=0|01|opc=1x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF800000)==0x79800000) {
		decode_fields32(ENC_LDRSH_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		if(dec->opc==3) OK(ENC_LDRSH_32_LDST_POS);
		if(dec->opc==2) OK(ENC_LDRSH_64_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldrsh_reg.xml */
int LDRSH_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|opc=1x|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x78A00800) {
		decode_fields32(ENC_LDRSH_32_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->opc==3) OK(ENC_LDRSH_32_LDST_REGOFF);
		if(dec->opc==2) OK(ENC_LDRSH_64_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldrsw_imm.xml */
int LDRSW_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDRSW_64_ldst_immpost */
	/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xB8800400) {
		decode_fields32(ENC_LDRSW_64_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDRSW_64_LDST_IMMPOST);
	}
	/* class LDRSW_64_ldst_immpre */
	/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xB8800C00) {
		decode_fields32(ENC_LDRSW_64_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDRSW_64_LDST_IMMPRE);
	}
	/* class LDRSW_64_ldst_pos */
	/* size=10|111|V=0|01|opc=10|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0xB9800000) {
		decode_fields32(ENC_LDRSW_64_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		OK(ENC_LDRSW_64_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldrsw_lit.xml */
int LDRSW_lit(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDRSW_64_loadlit */
	/* opc=10|011|V=0|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF000000)==0x98000000) {
		decode_fields32(ENC_LDRSW_64_LOADLIT, dec);
		dec->t = UINT(dec->Rt);
		dec->memop = MemOp_LOAD;
		dec->signed_ = FALSE;
		if(!dec->opc) {
			dec->size = 4;
		}
		else if(dec->opc==1) {
			dec->size = 8;
		}
		else if(dec->opc==2) {
			dec->size = 4;
			dec->signed_ = TRUE;
		}
		else if(dec->opc==3) {
			dec->memop = MemOp_PREFETCH;
		}
		dec->offset = SignExtend((dec->imm19<<2),21);
		dec->tag_checked = FALSE;
		OK(ENC_LDRSW_64_LOADLIT);
	}
	return rc;
}

/* ldrsw_reg.xml */
int LDRSW_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDRSW_64_ldst_regoff */
	/* size=10|111|V=0|00|opc=10|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xB8A00800) {
		decode_fields32(ENC_LDRSW_64_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		OK(ENC_LDRSW_64_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldr_imm_fpsimd.xml */
int LDR_imm_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* size=xx|111|V=1|00|opc=x1|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C400400) {
		decode_fields32(ENC_LDR_B_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==0 && dec->opc==1) OK(ENC_LDR_B_LDST_IMMPOST);
		if(dec->size==1 && dec->opc==1) OK(ENC_LDR_H_LDST_IMMPOST);
		if(dec->size==2 && dec->opc==1) OK(ENC_LDR_S_LDST_IMMPOST);
		if(dec->size==3 && dec->opc==1) OK(ENC_LDR_D_LDST_IMMPOST);
		if(dec->size==0 && dec->opc==3) OK(ENC_LDR_Q_LDST_IMMPOST);
	}
	/* class pre_indexed */
	/* size=xx|111|V=1|00|opc=x1|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C400C00) {
		decode_fields32(ENC_LDR_B_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==0 && dec->opc==1) OK(ENC_LDR_B_LDST_IMMPRE);
		if(dec->size==1 && dec->opc==1) OK(ENC_LDR_H_LDST_IMMPRE);
		if(dec->size==2 && dec->opc==1) OK(ENC_LDR_S_LDST_IMMPRE);
		if(dec->size==3 && dec->opc==1) OK(ENC_LDR_D_LDST_IMMPRE);
		if(dec->size==0 && dec->opc==3) OK(ENC_LDR_Q_LDST_IMMPRE);
	}
	/* class unsigned_scaled_offset */
	/* size=xx|111|V=1|01|opc=x1|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F400000)==0x3D400000) {
		decode_fields32(ENC_LDR_B_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		if(dec->size==0 && dec->opc==1) OK(ENC_LDR_B_LDST_POS);
		if(dec->size==1 && dec->opc==1) OK(ENC_LDR_H_LDST_POS);
		if(dec->size==2 && dec->opc==1) OK(ENC_LDR_S_LDST_POS);
		if(dec->size==3 && dec->opc==1) OK(ENC_LDR_D_LDST_POS);
		if(dec->size==0 && dec->opc==3) OK(ENC_LDR_Q_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (SLICE(dec->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldr_imm_gen.xml */
int LDR_imm_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8400400) {
		decode_fields32(ENC_LDR_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_LDR_32_LDST_IMMPOST);
		if(dec->size==3) OK(ENC_LDR_64_LDST_IMMPOST);
	}
	/* class pre_indexed */
	/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8400C00) {
		decode_fields32(ENC_LDR_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_LDR_32_LDST_IMMPRE);
		if(dec->size==3) OK(ENC_LDR_64_LDST_IMMPRE);
	}
	/* class unsigned_scaled_offset */
	/* size=1x|111|V=0|01|opc=01|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFC00000)==0xB9400000) {
		decode_fields32(ENC_LDR_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		if(dec->size==2) OK(ENC_LDR_32_LDST_POS);
		if(dec->size==3) OK(ENC_LDR_64_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldr_lit_fpsimd.xml */
int LDR_lit_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class literal */
	/* opc=xx|011|V=1|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F000000)==0x1C000000) {
		decode_fields32(ENC_LDR_S_LOADLIT, dec);
		dec->t = UINT(dec->Rt);
		if(!dec->opc) {
			dec->size = 4;
		}
		else if(dec->opc==1) {
			dec->size = 8;
		}
		else if(dec->opc==2) {
			dec->size = 0x10;
		}
		else if(dec->opc==3) {
			UNDEFINED;
		}
		dec->offset = SignExtend((dec->imm19<<2),21);
		dec->tag_checked = FALSE;
		if(dec->opc==0) OK(ENC_LDR_S_LOADLIT);
		if(dec->opc==1) OK(ENC_LDR_D_LOADLIT);
		if(dec->opc==2) OK(ENC_LDR_Q_LOADLIT);
	}
	return rc;
}

/* ldr_lit_gen.xml */
int LDR_lit_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class literal */
	/* opc=0x|011|V=0|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF000000)==0x18000000) {
		decode_fields32(ENC_LDR_32_LOADLIT, dec);
		dec->t = UINT(dec->Rt);
		dec->memop = MemOp_LOAD;
		dec->signed_ = FALSE;
		if(!dec->opc) {
			dec->size = 4;
		}
		else if(dec->opc==1) {
			dec->size = 8;
		}
		else if(dec->opc==2) {
			dec->size = 4;
			dec->signed_ = TRUE;
		}
		else if(dec->opc==3) {
			dec->memop = MemOp_PREFETCH;
		}
		dec->offset = SignExtend((dec->imm19<<2),21);
		dec->tag_checked = FALSE;
		if(dec->opc==0) OK(ENC_LDR_32_LOADLIT);
		if(dec->opc==1) OK(ENC_LDR_64_LOADLIT);
	}
	return rc;
}

/* ldr_reg_fpsimd.xml */
int LDR_reg_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fpsimd */
	/* size=xx|111|V=1|00|opc=x1|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C600800) {
		decode_fields32(ENC_LDR_B_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->size==0 && dec->opc==1 && dec->option!=3) OK(ENC_LDR_B_LDST_REGOFF);
		if(dec->size==0 && dec->opc==1 && dec->option==3) OK(ENC_LDR_BL_LDST_REGOFF);
		if(dec->size==1 && dec->opc==1) OK(ENC_LDR_H_LDST_REGOFF);
		if(dec->size==2 && dec->opc==1) OK(ENC_LDR_S_LDST_REGOFF);
		if(dec->size==3 && dec->opc==1) OK(ENC_LDR_D_LDST_REGOFF);
		if(dec->size==0 && dec->opc==3) OK(ENC_LDR_Q_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (SLICE(dec->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldr_reg_gen.xml */
int LDR_reg_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|opc=01|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8600800) {
		decode_fields32(ENC_LDR_32_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->size==2) OK(ENC_LDR_32_LDST_REGOFF);
		if(dec->size==3) OK(ENC_LDR_64_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* ldset.xml */
int LDSET(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8203000) {
		decode_fields32(ENC_LDSET_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSET_LDSET(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDSET_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDSETA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDSETAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDSETL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDSET_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDSETA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDSETAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDSETL_64_MEMOP);
	}
	return rc;
}

/* ldsetb.xml */
int LDSETB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38203000) {
		decode_fields32(ENC_LDSETAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSETB_LDSETB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDSETAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDSETALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDSETB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDSETLB_32_MEMOP);
	}
	return rc;
}

/* ldseth.xml */
int LDSETH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78203000) {
		decode_fields32(ENC_LDSETAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSETH_LDSETH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDSETAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDSETALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDSETH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDSETLH_32_MEMOP);
	}
	return rc;
}

/* ldsmax.xml */
int LDSMAX(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8204000) {
		decode_fields32(ENC_LDSMAX_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSMAX_LDSMAX(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDSMAX_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDSMAXA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDSMAXAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDSMAXL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDSMAX_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDSMAXA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDSMAXAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDSMAXL_64_MEMOP);
	}
	return rc;
}

/* ldsmaxb.xml */
int LDSMAXB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38204000) {
		decode_fields32(ENC_LDSMAXAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSMAXB_LDSMAXB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDSMAXAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDSMAXALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDSMAXB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDSMAXLB_32_MEMOP);
	}
	return rc;
}

/* ldsmaxh.xml */
int LDSMAXH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78204000) {
		decode_fields32(ENC_LDSMAXAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSMAXH_LDSMAXH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDSMAXAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDSMAXALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDSMAXH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDSMAXLH_32_MEMOP);
	}
	return rc;
}

/* ldsmin.xml */
int LDSMIN(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8205000) {
		decode_fields32(ENC_LDSMIN_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSMIN_LDSMIN(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDSMIN_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDSMINA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDSMINAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDSMINL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDSMIN_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDSMINA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDSMINAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDSMINL_64_MEMOP);
	}
	return rc;
}

/* ldsminb.xml */
int LDSMINB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38205000) {
		decode_fields32(ENC_LDSMINAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSMINB_LDSMINB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDSMINAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDSMINALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDSMINB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDSMINLB_32_MEMOP);
	}
	return rc;
}

/* ldsminh.xml */
int LDSMINH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78205000) {
		decode_fields32(ENC_LDSMINAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STSMINH_LDSMINH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDSMINAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDSMINALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDSMINH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDSMINLH_32_MEMOP);
	}
	return rc;
}

/* ldtr.xml */
int LDTR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8400800) {
		decode_fields32(ENC_LDTR_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_LDTR_32_LDST_UNPRIV);
		if(dec->size==3) OK(ENC_LDTR_64_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldtrb.xml */
int LDTRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDTRB_32_ldst_unpriv */
	/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38400800) {
		decode_fields32(ENC_LDTRB_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDTRB_32_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldtrh.xml */
int LDTRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDTRH_32_ldst_unpriv */
	/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78400800) {
		decode_fields32(ENC_LDTRH_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDTRH_32_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldtrsb.xml */
int LDTRSB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x38800800) {
		decode_fields32(ENC_LDTRSB_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDTRSB_32_LDST_UNPRIV);
		if(dec->opc==2) OK(ENC_LDTRSB_64_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldtrsh.xml */
int LDTRSH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x78800800) {
		decode_fields32(ENC_LDTRSH_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDTRSH_32_LDST_UNPRIV);
		if(dec->opc==2) OK(ENC_LDTRSH_64_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldtrsw.xml */
int LDTRSW(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDTRSW_64_ldst_unpriv */
	/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xB8800800) {
		decode_fields32(ENC_LDTRSW_64_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDTRSW_64_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldumax.xml */
int LDUMAX(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8206000) {
		decode_fields32(ENC_LDUMAX_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STUMAX_LDUMAX(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDUMAX_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDUMAXA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDUMAXAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDUMAXL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDUMAX_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDUMAXA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDUMAXAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDUMAXL_64_MEMOP);
	}
	return rc;
}

/* ldumaxb.xml */
int LDUMAXB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38206000) {
		decode_fields32(ENC_LDUMAXAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STUMAXB_LDUMAXB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDUMAXAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDUMAXALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDUMAXB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDUMAXLB_32_MEMOP);
	}
	return rc;
}

/* ldumaxh.xml */
int LDUMAXH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78206000) {
		decode_fields32(ENC_LDUMAXAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STUMAXH_LDUMAXH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDUMAXAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDUMAXALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDUMAXH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDUMAXLH_32_MEMOP);
	}
	return rc;
}

/* ldumin.xml */
int LDUMIN(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8207000) {
		decode_fields32(ENC_LDUMIN_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STUMIN_LDUMIN(ctx, dec);
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_LDUMIN_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_LDUMINA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_LDUMINAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_LDUMINL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_LDUMIN_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_LDUMINA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_LDUMINAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_LDUMINL_64_MEMOP);
	}
	return rc;
}

/* lduminb.xml */
int LDUMINB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38207000) {
		decode_fields32(ENC_LDUMINAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STUMINB_LDUMINB(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDUMINAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDUMINALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDUMINB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDUMINLB_32_MEMOP);
	}
	return rc;
}

/* lduminh.xml */
int LDUMINH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78207000) {
		decode_fields32(ENC_LDUMINAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		if(!dec->opc) {
			dec->op = MemAtomicOp_ADD;
		}
		else if(dec->opc==1) {
			dec->op = MemAtomicOp_BIC;
		}
		else if(dec->opc==2) {
			dec->op = MemAtomicOp_EOR;
		}
		else if(dec->opc==3) {
			dec->op = MemAtomicOp_ORR;
		}
		else if(dec->opc==4) {
			dec->op = MemAtomicOp_SMAX;
		}
		else if(dec->opc==5) {
			dec->op = MemAtomicOp_SMIN;
		}
		else if(dec->opc==6) {
			dec->op = MemAtomicOp_UMAX;
		}
		else if(dec->opc==7) {
			dec->op = MemAtomicOp_UMIN;
		}
		dec->tag_checked = dec->n!=0x1f;
		/* regular aliases */
		if(dec->A==0 && dec->Rt==0x1f) return STUMINH_LDUMINH(ctx, dec);
		if(dec->A==1 && dec->R==0) OK(ENC_LDUMINAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_LDUMINALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_LDUMINH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_LDUMINLH_32_MEMOP);
	}
	return rc;
}

/* ldurb.xml */
int LDURB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDURB_32_ldst_unscaled */
	/* size=00|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38400000) {
		decode_fields32(ENC_LDURB_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDURB_32_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldurh.xml */
int LDURH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDURH_32_ldst_unscaled */
	/* size=01|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78400000) {
		decode_fields32(ENC_LDURH_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDURH_32_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldursb.xml */
int LDURSB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=00|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x38800000) {
		decode_fields32(ENC_LDURSB_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDURSB_32_LDST_UNSCALED);
		if(dec->opc==2) OK(ENC_LDURSB_64_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldursh.xml */
int LDURSH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=01|111|V=0|00|opc=1x|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFA00C00)==0x78800000) {
		decode_fields32(ENC_LDURSH_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->opc==3) OK(ENC_LDURSH_32_LDST_UNSCALED);
		if(dec->opc==2) OK(ENC_LDURSH_64_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldursw.xml */
int LDURSW(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDURSW_64_ldst_unscaled */
	/* size=10|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xB8800000) {
		decode_fields32(ENC_LDURSW_64_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_LDURSW_64_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldur_fpsimd.xml */
int LDUR_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=xx|111|V=1|00|opc=x1|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C400000) {
		decode_fields32(ENC_LDUR_B_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==0 && dec->opc==1) OK(ENC_LDUR_B_LDST_UNSCALED);
		if(dec->size==1 && dec->opc==1) OK(ENC_LDUR_H_LDST_UNSCALED);
		if(dec->size==2 && dec->opc==1) OK(ENC_LDUR_S_LDST_UNSCALED);
		if(dec->size==3 && dec->opc==1) OK(ENC_LDUR_D_LDST_UNSCALED);
		if(dec->size==0 && dec->opc==3) OK(ENC_LDUR_Q_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (SLICE(dec->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldur_gen.xml */
int LDUR_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=1x|111|V=0|00|opc=01|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8400000) {
		decode_fields32(ENC_LDUR_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_LDUR_32_LDST_UNSCALED);
		if(dec->size==3) OK(ENC_LDUR_64_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* ldxp.xml */
int LDXP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* 1|sz=x|001000|o2=0|L=1|o1=1|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88600000) {
		decode_fields32(ENC_LDXP_LP32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = TRUE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (0x20) << (UINT(dec->sz));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->sz==0) OK(ENC_LDXP_LP32_LDSTEXCL);
		if(dec->sz==1) OK(ENC_LDXP_LP64_LDSTEXCL);
	}
	return rc;
}

/* ldxr.xml */
int LDXR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88400000) {
		decode_fields32(ENC_LDXR_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_LDXR_LR32_LDSTEXCL);
		if(dec->size==3) OK(ENC_LDXR_LR64_LDSTEXCL);
	}
	return rc;
}

/* ldxrb.xml */
int LDXRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDXRB_LR32_ldstexcl */
	/* size=00|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8400000) {
		decode_fields32(ENC_LDXRB_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDXRB_LR32_LDSTEXCL);
	}
	return rc;
}

/* ldxrh.xml */
int LDXRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class LDXRH_LR32_ldstexcl */
	/* size=01|001000|o2=0|L=1|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48400000) {
		decode_fields32(ENC_LDXRH_LR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_LDXRH_LR32_LDSTEXCL);
	}
	return rc;
}

/* lslv.xml */
int LSLV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02000) {
		decode_fields32(ENC_LSLV_32_DP_2SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->shift_type = DecodeShift(dec->op2);
		/* unconditional alias */
		if(LSL_LSLV(ctx, dec)==0) return 0;
		if(dec->sf==0) OK(ENC_LSLV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_LSLV_64_DP_2SRC);
	}
	return rc;
}

/* lsl_lslv.xml */
int LSL_LSLV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02000) {
		decode_fields32(ENC_LSL_LSLV_32_DP_2SRC, dec);
		if(dec->sf==0) OK(ENC_LSL_LSLV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_LSL_LSLV_64_DP_2SRC);
	}
	return rc;
}

/* lsl_ubfm.xml */
int LSL_UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x53000000) {
		decode_fields32(ENC_LSL_UBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0 && dec->imms!=0x1f) OK(ENC_LSL_UBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1 && dec->imms!=0x3f) OK(ENC_LSL_UBFM_64M_BITFIELD);
	}
	return rc;
}

/* lsrv.xml */
int LSRV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02400) {
		decode_fields32(ENC_LSRV_32_DP_2SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->shift_type = DecodeShift(dec->op2);
		/* unconditional alias */
		if(LSR_LSRV(ctx, dec)==0) return 0;
		if(dec->sf==0) OK(ENC_LSRV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_LSRV_64_DP_2SRC);
	}
	return rc;
}

/* lsr_lsrv.xml */
int LSR_LSRV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02400) {
		decode_fields32(ENC_LSR_LSRV_32_DP_2SRC, dec);
		if(dec->sf==0) OK(ENC_LSR_LSRV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_LSR_LSRV_64_DP_2SRC);
	}
	return rc;
}

/* lsr_ubfm.xml */
int LSR_UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=x11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F807C00)==0x53007C00) {
		decode_fields32(ENC_LSR_UBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0 && dec->imms==0x1f) OK(ENC_LSR_UBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1 && dec->imms==0x3f) OK(ENC_LSR_UBFM_64M_BITFIELD);
	}
	return rc;
}

/* madd.xml */
int MADD(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE08000)==0x1B000000) {
		decode_fields32(ENC_MADD_32A_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = (dec->sf==1) ? 0x40 : 0x20;
		dec->datasize = dec->destsize;
		dec->sub_op = (dec->o0==1);
		/* regular aliases */
		if(dec->Ra==0x1f) return MUL_MADD(ctx, dec);
		if(dec->sf==0) OK(ENC_MADD_32A_DP_3SRC);
		if(dec->sf==1) OK(ENC_MADD_64A_DP_3SRC);
	}
	return rc;
}

/* mla_advsimd_elt.xml */
int MLA_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MLA_asimdelem_R */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=0|00|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F000000) {
		decode_fields32(ENC_MLA_ASIMDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_MLA_ASIMDELEM_R);
	}
	return rc;
}

/* mla_advsimd_vec.xml */
int MLA_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MLA_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE209400) {
		decode_fields32(ENC_MLA_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->U==1);
		OK(ENC_MLA_ASIMDSAME_ONLY);
	}
	return rc;
}

/* mls_advsimd_elt.xml */
int MLS_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MLS_asimdelem_R */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=1|00|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F004000) {
		decode_fields32(ENC_MLS_ASIMDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_MLS_ASIMDELEM_R);
	}
	return rc;
}

/* mls_advsimd_vec.xml */
int MLS_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MLS_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E209400) {
		decode_fields32(ENC_MLS_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->U==1);
		OK(ENC_MLS_ASIMDSAME_ONLY);
	}
	return rc;
}

/* mneg_msub.xml */
int MNEG_MSUB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=1|Ra=11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1B00FC00) {
		decode_fields32(ENC_MNEG_MSUB_32A_DP_3SRC, dec);
		if(dec->sf==0) OK(ENC_MNEG_MSUB_32A_DP_3SRC);
		if(dec->sf==1) OK(ENC_MNEG_MSUB_64A_DP_3SRC);
	}
	return rc;
}

/* movi_advsimd.xml */
int MOVI_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|op=x|0111100000|a=x|b=x|c=x|cmode=xxxx|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */
	if((INSWORD & 0x9FF80C00)==0xF000400) {
		decode_fields32(ENC_MOVI_ASIMDIMM_N_B, dec);
		dec->rd = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		if(!(((dec->cmode<<1)|dec->op)&0x13)) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==1) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==2) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==3) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x10) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x11) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x12) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x13) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x18) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x19) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1e)==0x1c) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1e) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1f) {
			if(dec->Q==0) {
				UNDEFINED;
			}
			dec->operation_ = ImmediateOp_MOVI;
		}
		dec->imm64 = AdvSIMDExpandImm(dec->op,dec->cmode,((dec->a<<7)|(dec->b<<6)|(dec->c<<5)|(dec->d<<4)|(dec->e<<3)|(dec->f<<2)|(dec->g<<1)|dec->h));
		dec->imm = Replicate(dec->imm64, ((0x40) ? ((dec->datasize) / (0x40)) : 0), 64);
		if(dec->op==0 && dec->cmode==14) OK(ENC_MOVI_ASIMDIMM_N_B);
		if(dec->op==0 && (dec->cmode&13)==8) OK(ENC_MOVI_ASIMDIMM_L_HL);
		if(dec->op==0 && !(dec->cmode&9)) OK(ENC_MOVI_ASIMDIMM_L_SL);
		if(dec->op==0 && (dec->cmode&14)==12) OK(ENC_MOVI_ASIMDIMM_M_SM);
		if(dec->Q==0 && dec->op==1 && dec->cmode==14) OK(ENC_MOVI_ASIMDIMM_D_DS);
		if(dec->Q==1 && dec->op==1 && dec->cmode==14) OK(ENC_MOVI_ASIMDIMM_D2_D);
	}
	return rc;
}

/* movk.xml */
int MOVK(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm18_packed */
	/* sf=x|opc=11|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x72800000) {
		decode_fields32(ENC_MOVK_32_MOVEWIDE, dec);
		dec->d = UINT(dec->Rd);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->imm = dec->imm16;
		if(!dec->opc) {
			dec->opcode = MoveWideOp_N;
		}
		else if(dec->opc==2) {
			dec->opcode = MoveWideOp_Z;
		}
		else if(dec->opc==3) {
			dec->opcode = MoveWideOp_K;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->hw,1,1)==1) {
			UNDEFINED;
		}
		dec->pos = UINT((dec->hw<<4));
		if(dec->sf==0 && !(dec->hw&2)) OK(ENC_MOVK_32_MOVEWIDE);
		if(dec->sf==1) OK(ENC_MOVK_64_MOVEWIDE);
	}
	return rc;
}

/* movn.xml */
int MOVN(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm18_packed */
	/* sf=x|opc=00|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x12800000) {
		decode_fields32(ENC_MOVN_32_MOVEWIDE, dec);
		dec->d = UINT(dec->Rd);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->imm = dec->imm16;
		if(!dec->opc) {
			dec->opcode = MoveWideOp_N;
		}
		else if(dec->opc==2) {
			dec->opcode = MoveWideOp_Z;
		}
		else if(dec->opc==3) {
			dec->opcode = MoveWideOp_K;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->hw,1,1)==1) {
			UNDEFINED;
		}
		dec->pos = UINT((dec->hw<<4));
		/* regular aliases */
		bool encoding32 = dec->sf==0 && !(dec->hw&2);
		bool encoding64 = dec->sf==1;
		if((!(IsZero(dec->imm16) && dec->hw!=0) && EncodingLabeled64Bit()) || (!(IsZero(dec->imm16) && dec->hw!=0) && !IsOnes(dec->imm16,16) && EncodingLabeled32Bit())) return MOV_MOVN(ctx, dec);
		if(dec->sf==0 && !(dec->hw&2)) OK(ENC_MOVN_32_MOVEWIDE);
		if(dec->sf==1) OK(ENC_MOVN_64_MOVEWIDE);
	}
	return rc;
}

/* movs_and_p_p_pp.xml */
int MOVS_and_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ands_p_p_pp_z */
	/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25404000) {
		decode_fields32(ENC_MOVS_ANDS_P_P_PP_Z, dec);
		OK(ENC_MOVS_ANDS_P_P_PP_Z);
	}
	return rc;
}

/* movs_orr_p_p_pp.xml */
int MOVS_orr_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orrs_p_p_pp_z */
	/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25C04000) {
		decode_fields32(ENC_MOVS_ORRS_P_P_PP_Z, dec);
		OK(ENC_MOVS_ORRS_P_P_PP_Z);
	}
	return rc;
}

/* movz.xml */
int MOVZ(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm18_packed */
	/* sf=x|opc=10|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x52800000) {
		decode_fields32(ENC_MOVZ_32_MOVEWIDE, dec);
		dec->d = UINT(dec->Rd);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->imm = dec->imm16;
		if(!dec->opc) {
			dec->opcode = MoveWideOp_N;
		}
		else if(dec->opc==2) {
			dec->opcode = MoveWideOp_Z;
		}
		else if(dec->opc==3) {
			dec->opcode = MoveWideOp_K;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->hw,1,1)==1) {
			UNDEFINED;
		}
		dec->pos = UINT((dec->hw<<4));
		/* regular aliases */
		if(!(IsZero(dec->imm16) && dec->hw!=0)) return MOV_MOVZ(ctx, dec);
		if(dec->sf==0 && !(dec->hw&2)) OK(ENC_MOVZ_32_MOVEWIDE);
		if(dec->sf==1) OK(ENC_MOVZ_64_MOVEWIDE);
	}
	return rc;
}

/* mov_add_addsub_imm.xml */
int MOV_ADD_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=0|S=0|100010|sh=0|imm12=000000000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FFFFC00)==0x11000000) {
		decode_fields32(ENC_MOV_ADD_32_ADDSUB_IMM, dec);
		if(dec->sf==0) OK(ENC_MOV_ADD_32_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_MOV_ADD_64_ADDSUB_IMM);
	}
	return rc;
}

/* mov_dup_advsimd_elt.xml */
int MOV_DUP_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class DUP_asisdone_only */
	/* 01|op=0|11110000|imm5=xxxxx|0|imm4=0000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E000400) {
		decode_fields32(ENC_MOV_DUP_ASISDONE_ONLY, dec);
		OK(ENC_MOV_DUP_ASISDONE_ONLY);
	}
	return rc;
}

/* mov_ins_advsimd_elt.xml */
int MOV_INS_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class INS_asimdins_IV_v */
	/* 0|Q=1|op=1|01110000|imm5=xxxxx|0|imm4=xxxx|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08400)==0x6E000400) {
		decode_fields32(ENC_MOV_INS_ASIMDINS_IV_V, dec);
		OK(ENC_MOV_INS_ASIMDINS_IV_V);
	}
	return rc;
}

/* mov_ins_advsimd_gen.xml */
int MOV_INS_advsimd_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class INS_asimdins_IR_r */
	/* 0|Q=1|op=0|01110000|imm5=xxxxx|0|imm4=0011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4E001C00) {
		decode_fields32(ENC_MOV_INS_ASIMDINS_IR_R, dec);
		OK(ENC_MOV_INS_ASIMDINS_IR_R);
	}
	return rc;
}

/* mov_movn.xml */
int MOV_MOVN(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm18_packed */
	/* sf=x|opc=00|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x12800000) {
		decode_fields32(ENC_MOV_MOVN_32_MOVEWIDE, dec);
		if(dec->sf==0 && !(dec->hw&2)) OK(ENC_MOV_MOVN_32_MOVEWIDE);
		if(dec->sf==1) OK(ENC_MOV_MOVN_64_MOVEWIDE);
	}
	return rc;
}

/* mov_movz.xml */
int MOV_MOVZ(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class imm18_packed */
	/* sf=x|opc=10|100101|hw=xx|imm16=xxxxxxxxxxxxxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x52800000) {
		decode_fields32(ENC_MOV_MOVZ_32_MOVEWIDE, dec);
		if(dec->sf==0 && !(dec->hw&2)) OK(ENC_MOV_MOVZ_32_MOVEWIDE);
		if(dec->sf==1) OK(ENC_MOV_MOVZ_64_MOVEWIDE);
	}
	return rc;
}

/* mov_orr_advsimd_reg.xml */
int MOV_ORR_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ORR_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=10|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEA01C00) {
		decode_fields32(ENC_MOV_ORR_ASIMDSAME_ONLY, dec);
		OK(ENC_MOV_ORR_ASIMDSAME_ONLY);
	}
	return rc;
}

/* mov_orr_log_imm.xml */
int MOV_ORR_log_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=01|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7F8003E0)==0x320003E0) {
		decode_fields32(ENC_MOV_ORR_32_LOG_IMM, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_MOV_ORR_32_LOG_IMM);
		if(dec->sf==1) OK(ENC_MOV_ORR_64_LOG_IMM);
	}
	return rc;
}

/* mov_orr_log_shift.xml */
int MOV_ORR_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=01|01010|shift=00|N=0|Rm=xxxxx|imm6=000000|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7FE0FFE0)==0x2A0003E0) {
		decode_fields32(ENC_MOV_ORR_32_LOG_SHIFT, dec);
		if(dec->sf==0) OK(ENC_MOV_ORR_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_MOV_ORR_64_LOG_SHIFT);
	}
	return rc;
}

/* mov_umov_advsimd.xml */
int MOV_UMOV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|op=0|01110000|imm5=xxx00|0|imm4<3:2>=01|imm4=11|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE3FC00)==0xE003C00) {
		decode_fields32(ENC_MOV_UMOV_ASIMDINS_W_W, dec);
		if(dec->Q==0 && (dec->imm5&7)==4) OK(ENC_MOV_UMOV_ASIMDINS_W_W);
		if(dec->Q==1 && (dec->imm5&15)==8) OK(ENC_MOV_UMOV_ASIMDINS_X_X);
	}
	return rc;
}

/* mov_and_p_p_pp.xml */
int MOV_and_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class and_p_p_pp_z */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004000) {
		decode_fields32(ENC_MOV_AND_P_P_PP_Z, dec);
		OK(ENC_MOV_AND_P_P_PP_Z);
	}
	return rc;
}

/* mov_cpy_z_o_i.xml */
int MOV_cpy_z_o_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_o_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|0|M=0|sh=x|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF30C000)==0x5100000) {
		decode_fields32(ENC_MOV_CPY_Z_O_I_, dec);
		OK(ENC_MOV_CPY_Z_O_I_);
	}
	return rc;
}

/* mov_cpy_z_p_i.xml */
int MOV_cpy_z_p_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|0|M=1|sh=x|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF30C000)==0x5104000) {
		decode_fields32(ENC_MOV_CPY_Z_P_I_, dec);
		OK(ENC_MOV_CPY_Z_P_I_);
	}
	return rc;
}

/* mov_cpy_z_p_r.xml */
int MOV_cpy_z_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_r_ */
	/* 00000101|size=xx|101000101|Pg=xxx|Rn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x528A000) {
		decode_fields32(ENC_MOV_CPY_Z_P_R_, dec);
		OK(ENC_MOV_CPY_Z_P_R_);
	}
	return rc;
}

/* mov_cpy_z_p_v.xml */
int MOV_cpy_z_p_v(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_v_ */
	/* 00000101|size=xx|100000100|Pg=xxx|Vn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5208000) {
		decode_fields32(ENC_MOV_CPY_Z_P_V_, dec);
		OK(ENC_MOV_CPY_Z_P_V_);
	}
	return rc;
}

/* mov_dup_z_i.xml */
int MOV_dup_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_i_ */
	/* 00100101|size=xx|111|opc=00|011|sh=x|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2538C000) {
		decode_fields32(ENC_MOV_DUP_Z_I_, dec);
		OK(ENC_MOV_DUP_Z_I_);
	}
	return rc;
}

/* mov_dup_z_r.xml */
int MOV_dup_z_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_r_ */
	/* 00000101|size=xx|100000001110|Rn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5203800) {
		decode_fields32(ENC_MOV_DUP_Z_R_, dec);
		OK(ENC_MOV_DUP_Z_R_);
	}
	return rc;
}

/* mov_dup_z_zi.xml */
int MOV_dup_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_zi_ */
	/* 00000101|imm2=xx|1|tsz=xxxxx|001000|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5202000) {
		decode_fields32(ENC_MOV_DUP_Z_ZI_, dec);
		if(BitCount(((dec->imm2<<5)|dec->tsz))==1) OK(ENC_MOV_DUP_Z_ZI_);
		if(BitCount(((dec->imm2<<5)|dec->tsz))>1) OK(ENC_MOV_DUP_Z_ZI_2);
	}
	return rc;
}

/* mov_dupm_z_i.xml */
int MOV_dupm_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dupm_z_i_ */
	/* 00000101110000|imm13=xxxxxxxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5C00000) {
		decode_fields32(ENC_MOV_DUPM_Z_I_, dec);
		OK(ENC_MOV_DUPM_Z_I_);
	}
	return rc;
}

/* mov_orr_p_p_pp.xml */
int MOV_orr_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_p_p_pp_z */
	/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25804000) {
		decode_fields32(ENC_MOV_ORR_P_P_PP_Z, dec);
		OK(ENC_MOV_ORR_P_P_PP_Z);
	}
	return rc;
}

/* mov_orr_z_zz.xml */
int MOV_orr_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_z_zz_ */
	/* 00000100|opc=01|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4603000) {
		decode_fields32(ENC_MOV_ORR_Z_ZZ_, dec);
		OK(ENC_MOV_ORR_Z_ZZ_);
	}
	return rc;
}

/* mov_sel_p_p_pp.xml */
int MOV_sel_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sel_p_p_pp_ */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004210) {
		decode_fields32(ENC_MOV_SEL_P_P_PP_, dec);
		OK(ENC_MOV_SEL_P_P_PP_);
	}
	return rc;
}

/* mov_sel_z_p_zz.xml */
int MOV_sel_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sel_z_p_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|11|Pg=xxxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20C000)==0x520C000) {
		decode_fields32(ENC_MOV_SEL_Z_P_ZZ_, dec);
		OK(ENC_MOV_SEL_Z_P_ZZ_);
	}
	return rc;
}

/* mrs.xml */
int MRS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MRS_RS_systemmove */
	/* 1101010100|L=1|op0<1>=1|o0=x|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF00000)==0xD5300000) {
		decode_fields32(ENC_MRS_RS_SYSTEMMOVE, dec);
		CheckSystemAccess(((1<<1)|dec->o0),dec->op1,dec->CRn,dec->CRm,dec->op2,dec->Rt,dec->L);
		dec->t = UINT(dec->Rt);
		dec->sys_op0 = 2+UINT(dec->o0);
		dec->sys_op1 = UINT(dec->op1);
		dec->sys_op2 = UINT(dec->op2);
		dec->sys_crn = UINT(dec->CRn);
		dec->sys_crm = UINT(dec->CRm);
		dec->read = (dec->L==1);
		OK(ENC_MRS_RS_SYSTEMMOVE);
	}
	return rc;
}

/* msr_imm.xml */
int MSR_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MSR_SI_pstate */
	/* 1101010100|L=0|op0=00|op1=xxx|CRn=0100|CRm=xxxx|op2=xxx|Rt =11111 */
	if((INSWORD & 0xFFF8F01F)==0xD500401F) {
		decode_fields32(ENC_MSR_SI_PSTATE, dec);
		if(dec->op1==0 && dec->op2==0) {
			SEE /* CFINV */;
		}
		if(dec->op1==0 && dec->op2==1) {
			SEE /* XAFLAG */;
		}
		if(dec->op1==0 && dec->op2==2) {
			SEE /* AXFLAG */;
		}
		CheckSystemAccess(0,dec->op1,4,dec->CRm,dec->op2,0x1f,0);
		dec->operand = dec->CRm;
		if(((dec->op1<<3)|dec->op2)==3) {
			if(!HaveUAOExt()) {
				UNDEFINED;
			}
			dec->field = PSTATEField_UAO;
		}
		else if(((dec->op1<<3)|dec->op2)==4) {
			if(!HavePANExt()) {
				UNDEFINED;
			}
			dec->field = PSTATEField_PAN;
		}
		else if(((dec->op1<<3)|dec->op2)==5) {
			dec->field = PSTATEField_SP;
		}
		else if(((dec->op1<<3)|dec->op2)==0x1a) {
			if(!HaveDITExt()) {
				UNDEFINED;
			}
			dec->field = PSTATEField_DIT;
		}
		else if(((dec->op1<<3)|dec->op2)==0x1c) {
			if(!HaveMTEExt()) {
				UNDEFINED;
			}
			dec->field = PSTATEField_TCO;
		}
		else if(((dec->op1<<3)|dec->op2)==0x1e) {
			dec->field = PSTATEField_DAIFSet;
		}
		else if(((dec->op1<<3)|dec->op2)==0x1f) {
			dec->field = PSTATEField_DAIFClr;
		}
		else if(((dec->op1<<3)|dec->op2)==0x19) {
			if(!HaveSSBSExt()) {
				UNDEFINED;
			}
			dec->field = PSTATEField_SSBS;
		}
		else {
			UNDEFINED;
		}
		/* if(ctx->pstate_el==EL0 && (dec->field==PSTATEField_DAIFSet || dec->field==PSTATEField_DAIFClr)) { if(!ELUsingAArch32(EL1) && ((EL2Enabled() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3) || dec->SCTLR_EL1_UMA==0)) {	if(EL2Enabled() && !ELUsingAArch32(EL2) && dec->HCR_EL2_TGE==1) {		SystemAccessTrap(EL2,0x18);	}	else {		SystemAccessTrap(EL1,0x18);	}} } */
		OK(ENC_MSR_SI_PSTATE);
	}
	return rc;
}

/* msr_reg.xml */
int MSR_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MSR_SR_systemmove */
	/* 1101010100|L=0|op0<1>=1|o0=x|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF00000)==0xD5100000) {
		decode_fields32(ENC_MSR_SR_SYSTEMMOVE, dec);
		CheckSystemAccess(((1<<1)|dec->o0),dec->op1,dec->CRn,dec->CRm,dec->op2,dec->Rt,dec->L);
		dec->t = UINT(dec->Rt);
		dec->sys_op0 = 2+UINT(dec->o0);
		dec->sys_op1 = UINT(dec->op1);
		dec->sys_op2 = UINT(dec->op2);
		dec->sys_crn = UINT(dec->CRn);
		dec->sys_crm = UINT(dec->CRm);
		dec->read = (dec->L==1);
		OK(ENC_MSR_SR_SYSTEMMOVE);
	}
	return rc;
}

/* msub.xml */
int MSUB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE08000)==0x1B008000) {
		decode_fields32(ENC_MSUB_32A_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = (dec->sf==1) ? 0x40 : 0x20;
		dec->datasize = dec->destsize;
		dec->sub_op = (dec->o0==1);
		/* regular aliases */
		if(dec->Ra==0x1f) return MNEG_MSUB(ctx, dec);
		if(dec->sf==0) OK(ENC_MSUB_32A_DP_3SRC);
		if(dec->sf==1) OK(ENC_MSUB_64A_DP_3SRC);
	}
	return rc;
}

/* mul_madd.xml */
int MUL_MADD(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op54=00|11011|op31=000|Rm=xxxxx|o0=0|Ra=11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1B007C00) {
		decode_fields32(ENC_MUL_MADD_32A_DP_3SRC, dec);
		if(dec->sf==0) OK(ENC_MUL_MADD_32A_DP_3SRC);
		if(dec->sf==1) OK(ENC_MUL_MADD_64A_DP_3SRC);
	}
	return rc;
}

/* mul_advsimd_elt.xml */
int MUL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MUL_asimdelem_R */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1000|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF008000) {
		decode_fields32(ENC_MUL_ASIMDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_MUL_ASIMDELEM_R);
	}
	return rc;
}

/* mul_advsimd_vec.xml */
int MUL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class MUL_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE209C00) {
		decode_fields32(ENC_MUL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->U==1 && dec->size!=0) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->poly = (dec->U==1);
		OK(ENC_MUL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* mvni_advsimd.xml */
int MVNI_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|op=1|0111100000|a=x|b=x|c=x|cmode=xxxx|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */
	if((INSWORD & 0xBFF80C00)==0x2F000400) {
		decode_fields32(ENC_MVNI_ASIMDIMM_L_HL, dec);
		dec->rd = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		if(!(((dec->cmode<<1)|dec->op)&0x13)) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==1) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==2) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==3) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x10) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x11) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x12) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x13) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x18) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x19) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1e)==0x1c) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1e) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1f) {
			if(dec->Q==0) {
				UNDEFINED;
			}
			dec->operation_ = ImmediateOp_MOVI;
		}
		dec->imm64 = AdvSIMDExpandImm(dec->op,dec->cmode,((dec->a<<7)|(dec->b<<6)|(dec->c<<5)|(dec->d<<4)|(dec->e<<3)|(dec->f<<2)|(dec->g<<1)|dec->h));
		dec->imm = Replicate(dec->imm64, ((0x40) ? ((dec->datasize) / (0x40)) : 0), 64);
		if((dec->cmode&13)==8) OK(ENC_MVNI_ASIMDIMM_L_HL);
		if(!(dec->cmode&9)) OK(ENC_MVNI_ASIMDIMM_L_SL);
		if((dec->cmode&14)==12) OK(ENC_MVNI_ASIMDIMM_M_SM);
	}
	return rc;
}

/* mvn_not_advsimd.xml */
int MVN_NOT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class NOT_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=00|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E205800) {
		decode_fields32(ENC_MVN_NOT_ASIMDMISC_R, dec);
		OK(ENC_MVN_NOT_ASIMDMISC_R);
	}
	return rc;
}

/* mvn_orn_log_shift.xml */
int MVN_ORN_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=01|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7F2003E0)==0x2A2003E0) {
		decode_fields32(ENC_MVN_ORN_32_LOG_SHIFT, dec);
		if(dec->sf==0) OK(ENC_MVN_ORN_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_MVN_ORN_64_LOG_SHIFT);
	}
	return rc;
}

/* negs_subs_addsub_shift.xml */
int NEGS_SUBS_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7F2003E0)==0x6B0003E0) {
		decode_fields32(ENC_NEGS_SUBS_32_ADDSUB_SHIFT, dec);
		if(dec->sf==0) OK(ENC_NEGS_SUBS_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_NEGS_SUBS_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* neg_sub_addsub_shift.xml */
int NEG_SUB_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=1|S=0|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7F2003E0)==0x4B0003E0) {
		decode_fields32(ENC_NEG_SUB_32_ADDSUB_SHIFT, dec);
		if(dec->sf==0) OK(ENC_NEG_SUB_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_NEG_SUB_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* neg_advsimd.xml */
int NEG_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class NEG_asisdmisc_R */
	/* 01|U=1|11110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E20B800) {
		decode_fields32(ENC_NEG_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->neg = (dec->U==1);
		OK(ENC_NEG_ASISDMISC_R);
	}
	/* class NEG_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=01011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E20B800) {
		decode_fields32(ENC_NEG_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_NEG_ASIMDMISC_R);
	}
	return rc;
}

/* ngcs_sbcs.xml */
int NGCS_SBCS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|11010000|Rm=xxxxx|000000|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7FE0FFE0)==0x7A0003E0) {
		decode_fields32(ENC_NGCS_SBCS_32_ADDSUB_CARRY, dec);
		if(dec->sf==0) OK(ENC_NGCS_SBCS_32_ADDSUB_CARRY);
		if(dec->sf==1) OK(ENC_NGCS_SBCS_64_ADDSUB_CARRY);
	}
	return rc;
}

/* ngc_sbc.xml */
int NGC_SBC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=1|S=0|11010000|Rm=xxxxx|000000|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0x7FE0FFE0)==0x5A0003E0) {
		decode_fields32(ENC_NGC_SBC_32_ADDSUB_CARRY, dec);
		if(dec->sf==0) OK(ENC_NGC_SBC_32_ADDSUB_CARRY);
		if(dec->sf==1) OK(ENC_NGC_SBC_64_ADDSUB_CARRY);
	}
	return rc;
}

/* nop.xml */
int NOP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class NOP_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=000|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503201F) {
		decode_fields32(ENC_NOP_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_NOP_HI_HINTS);
	}
	return rc;
}

/* nots_eor_p_p_pp.xml */
int NOTS_eor_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eors_p_p_pp_z */
	/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25404200) {
		decode_fields32(ENC_NOTS_EORS_P_P_PP_Z, dec);
		OK(ENC_NOTS_EORS_P_P_PP_Z);
	}
	return rc;
}

/* not_advsimd.xml */
int NOT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class NOT_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=00|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E205800) {
		decode_fields32(ENC_NOT_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((8) ? ((dec->datasize) / (8)) : 0);
		/* unconditional alias */
		if(MVN_NOT_advsimd(ctx, dec)==0) return 0;
		OK(ENC_NOT_ASIMDMISC_R);
	}
	return rc;
}

/* not_eor_p_p_pp.xml */
int NOT_eor_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eor_p_p_pp_z */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004200) {
		decode_fields32(ENC_NOT_EOR_P_P_PP_Z, dec);
		OK(ENC_NOT_EOR_P_P_PP_Z);
	}
	return rc;
}

/* orn_advsimd.xml */
int ORN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ORN_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=11|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEE01C00) {
		decode_fields32(ENC_ORN_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->invert = (SLICE(dec->size,0,0)==1);
		dec->op = (SLICE(dec->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;
		OK(ENC_ORN_ASIMDSAME_ONLY);
	}
	return rc;
}

/* orn_log_shift.xml */
int ORN_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=01|01010|shift=xx|N=1|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x2A200000) {
		decode_fields32(ENC_ORN_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		/* regular aliases */
		if(dec->Rn==0x1f) return MVN_ORN_log_shift(ctx, dec);
		if(dec->sf==0) OK(ENC_ORN_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_ORN_64_LOG_SHIFT);
	}
	return rc;
}

/* orn_orr_z_zi.xml */
int ORN_orr_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_z_zi_ */
	/* 00000101|opc=00|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5000000) {
		decode_fields32(ENC_ORN_ORR_Z_ZI_, dec);
		OK(ENC_ORN_ORR_Z_ZI_);
	}
	return rc;
}

/* orr_advsimd_imm.xml */
int ORR_advsimd_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class shifted_immediate */
	/* 0|Q=x|op=0|0111100000|a=x|b=x|c=x|cmode=xxx1|o2=0|1|d=x|e=x|f=x|g=x|h=x|Rd=xxxxx */
	if((INSWORD & 0xBFF81C00)==0xF001400) {
		decode_fields32(ENC_ORR_ASIMDIMM_L_HL, dec);
		dec->rd = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		if(!(((dec->cmode<<1)|dec->op)&0x13)) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==1) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==2) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x13)==3) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x10) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x11) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x12) {
			dec->operation_ = ImmediateOp_ORR;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1b)==0x13) {
			dec->operation_ = ImmediateOp_BIC;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x18) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1d)==0x19) {
			dec->operation_ = ImmediateOp_MVNI;
		}
		else if((((dec->cmode<<1)|dec->op)&0x1e)==0x1c) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1e) {
			dec->operation_ = ImmediateOp_MOVI;
		}
		else if(((dec->cmode<<1)|dec->op)==0x1f) {
			if(dec->Q==0) {
				UNDEFINED;
			}
			dec->operation_ = ImmediateOp_MOVI;
		}
		dec->imm64 = AdvSIMDExpandImm(dec->op,dec->cmode,((dec->a<<7)|(dec->b<<6)|(dec->c<<5)|(dec->d<<4)|(dec->e<<3)|(dec->f<<2)|(dec->g<<1)|dec->h));
		dec->imm = Replicate(dec->imm64, ((0x40) ? ((dec->datasize) / (0x40)) : 0), 64);
		if((dec->cmode&13)==9) OK(ENC_ORR_ASIMDIMM_L_HL);
		if((dec->cmode&9)==1) OK(ENC_ORR_ASIMDIMM_L_SL);
	}
	return rc;
}

/* orr_advsimd_reg.xml */
int ORR_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ORR_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=10|1|Rm=xxxxx|opcode=00011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xEA01C00) {
		decode_fields32(ENC_ORR_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->invert = (SLICE(dec->size,0,0)==1);
		dec->op = (SLICE(dec->size,1,1)==1) ? LogicalOp_ORR : LogicalOp_AND;
		/* regular aliases */
		if(dec->Rm==dec->Rn) return MOV_ORR_advsimd_reg(ctx, dec);
		OK(ENC_ORR_ASIMDSAME_ONLY);
	}
	return rc;
}

/* orr_log_imm.xml */
int ORR_log_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=01|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x32000000) {
		decode_fields32(ENC_ORR_32_LOG_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && dec->N!=0) {
			UNDEFINED;
		}
		DecodeBitMasksCheckUndefined(dec->N,dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->imm = dbmrt.wmask;
		/* regular aliases */
		if(dec->Rn==0x1f && !MoveWidePreferred(dec->sf,dec->N,dec->imms,dec->immr)) return MOV_ORR_log_imm(ctx, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_ORR_32_LOG_IMM);
		if(dec->sf==1) OK(ENC_ORR_64_LOG_IMM);
	}
	return rc;
}

/* orr_log_shift.xml */
int ORR_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|opc=01|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x2A000000) {
		decode_fields32(ENC_ORR_32_LOG_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->op = LogicalOp_AND;
			dec->setflags = FALSE;
		}
		else if(dec->opc==1) {
			dec->op = LogicalOp_ORR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==2) {
			dec->op = LogicalOp_EOR;
			dec->setflags = FALSE;
		}
		else if(dec->opc==3) {
			dec->op = LogicalOp_AND;
			dec->setflags = TRUE;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		dec->invert = (dec->N==1);
		/* regular aliases */
		if(dec->shift==0 && dec->imm6==0 && dec->Rn==0x1f) return MOV_ORR_log_shift(ctx, dec);
		if(dec->sf==0) OK(ENC_ORR_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_ORR_64_LOG_SHIFT);
	}
	return rc;
}

/* pacda.xml */
int PACDA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=010|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC10800) {
		decode_fields32(ENC_PACDA_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_PACDA_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_PACDZA_64Z_DP_1SRC);
	}
	return rc;
}

/* pacdb.xml */
int PACDB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=011|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC10C00) {
		decode_fields32(ENC_PACDB_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_PACDB_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_PACDZB_64Z_DP_1SRC);
	}
	return rc;
}

/* pacga.xml */
int PACGA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PACGA_64P_dp_2src */
	/* sf=1|op=0|S=0|11010110|Rm=xxxxx|opcode2=001100|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9AC03000) {
		decode_fields32(ENC_PACGA_64P_DP_2SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->m==0x1f) {
			dec->source_is_sp = TRUE;
		}
		OK(ENC_PACGA_64P_DP_2SRC);
	}
	return rc;
}

/* pacia.xml */
int PACIA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC10000) {
		decode_fields32(ENC_PACIA_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_PACIA_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_PACIZA_64Z_DP_1SRC);
	}
	/* class system */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=00x|Rt=11111 */
	if((INSWORD & 0xFFFFFDDF)==0xD503211F) {
		decode_fields32(ENC_PACIA1716_HI_HINTS, dec);
		dec->source_is_sp = FALSE;
		if(((dec->CRm<<3)|dec->op2)==0x18) {
			dec->d = 0x1e;
			dec->n = 0x1f;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x19) {
			dec->d = 0x1e;
			dec->source_is_sp = TRUE;
			if(HaveBTIExt()) {
				SetBTypeCompatible(BTypeCompatible_PACIXSP());
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==8) {
			dec->d = 0x11;
			dec->n = 0x10;
		}
		else if(((dec->CRm<<3)|dec->op2)==10) {
			SEE /* PACIB */;
		}
		else if(((dec->CRm<<3)|dec->op2)==12) {
			SEE /* AUTIA */;
		}
		else if(((dec->CRm<<3)|dec->op2)==14) {
			SEE /* AUTIB */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x7e)==0x1a) {
			SEE /* PACIB */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x7e)==0x1c) {
			SEE /* AUTIA */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x7e)==0x1e) {
			SEE /* AUTIB */;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else {
			SEE /* HINT */;
		}
		if(dec->CRm==1 && dec->op2==0) OK(ENC_PACIA1716_HI_HINTS);
		if(dec->CRm==3 && dec->op2==1) OK(ENC_PACIASP_HI_HINTS);
		if(dec->CRm==3 && dec->op2==0) OK(ENC_PACIAZ_HI_HINTS);
	}
	return rc;
}

/* pacib.xml */
int PACIB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=0|Z=x|opcode[2:0]=001|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFDC00)==0xDAC10400) {
		decode_fields32(ENC_PACIB_64P_DP_1SRC, dec);
		dec->source_is_sp = FALSE;
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->Z==0) {
			if(dec->n==0x1f) {
				dec->source_is_sp = TRUE;
			}
		}
		else {
			if(dec->n!=0x1f) {
				UNDEFINED;
			}
		}
		if(dec->Z==0) OK(ENC_PACIB_64P_DP_1SRC);
		if(dec->Z==1 && dec->Rn==0x1f) OK(ENC_PACIZB_64Z_DP_1SRC);
	}
	/* class system */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=00x1|op2=01x|Rt=11111 */
	if((INSWORD & 0xFFFFFDDF)==0xD503215F) {
		decode_fields32(ENC_PACIB1716_HI_HINTS, dec);
		dec->source_is_sp = FALSE;
		if(((dec->CRm<<3)|dec->op2)==0x1a) {
			dec->d = 0x1e;
			dec->n = 0x1f;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x1b) {
			dec->d = 0x1e;
			dec->source_is_sp = TRUE;
			if(HaveBTIExt()) {
				SetBTypeCompatible(BTypeCompatible_PACIXSP());
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==10) {
			dec->d = 0x11;
			dec->n = 0x10;
		}
		else if(((dec->CRm<<3)|dec->op2)==8) {
			SEE /* PACIA */;
		}
		else if(((dec->CRm<<3)|dec->op2)==12) {
			SEE /* AUTIA */;
		}
		else if(((dec->CRm<<3)|dec->op2)==14) {
			SEE /* AUTIB */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x7e)==0x18) {
			SEE /* PACIA */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x7e)==0x1c) {
			SEE /* AUTIA */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x7e)==0x1e) {
			SEE /* AUTIB */;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else {
			SEE /* HINT */;
		}
		if(dec->CRm==1 && dec->op2==2) OK(ENC_PACIB1716_HI_HINTS);
		if(dec->CRm==3 && dec->op2==3) OK(ENC_PACIBSP_HI_HINTS);
		if(dec->CRm==3 && dec->op2==2) OK(ENC_PACIBZ_HI_HINTS);
	}
	return rc;
}

/* pmull_advsimd.xml */
int PMULL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PMULL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=1110|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20E000) {
		decode_fields32(ENC_PMULL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==1 || dec->size==2) {
			UNDEFINED;
		}
		if(dec->size==3 && !HaveBit128PMULLExt()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_PMULL_ASIMDDIFF_L);
	}
	return rc;
}

/* pmul_advsimd.xml */
int PMUL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PMUL_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E209C00) {
		decode_fields32(ENC_PMUL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->U==1 && dec->size!=0) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->poly = (dec->U==1);
		OK(ENC_PMUL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* prfm_imm.xml */
int PRFM_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PRFM_P_ldst_pos */
	/* size=11|111|V=0|01|opc=10|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0xF9800000) {
		decode_fields32(ENC_PRFM_P_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		OK(ENC_PRFM_P_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* prfm_lit.xml */
int PRFM_lit(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PRFM_P_loadlit */
	/* opc=11|011|V=0|00|imm19=xxxxxxxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF000000)==0xD8000000) {
		decode_fields32(ENC_PRFM_P_LOADLIT, dec);
		dec->t = UINT(dec->Rt);
		dec->memop = MemOp_LOAD;
		dec->signed_ = FALSE;
		if(!dec->opc) {
			dec->size = 4;
		}
		else if(dec->opc==1) {
			dec->size = 8;
		}
		else if(dec->opc==2) {
			dec->size = 4;
			dec->signed_ = TRUE;
		}
		else if(dec->opc==3) {
			dec->memop = MemOp_PREFETCH;
		}
		dec->offset = SignExtend((dec->imm19<<2),21);
		dec->tag_checked = FALSE;
		OK(ENC_PRFM_P_LOADLIT);
	}
	return rc;
}

/* prfm_reg.xml */
int PRFM_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PRFM_P_ldst_regoff */
	/* size=11|111|V=0|00|opc=10|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xF8A00800) {
		decode_fields32(ENC_PRFM_P_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		OK(ENC_PRFM_P_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* prfum.xml */
int PRFUM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PRFUM_P_ldst_unscaled */
	/* size=11|111|V=0|00|opc=10|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xF8800000) {
		decode_fields32(ENC_PRFUM_P_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_PRFUM_P_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* psb.xml */
int PSB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PSB_HC_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=001|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503223F) {
		decode_fields32(ENC_PSB_HC_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_PSB_HC_HINTS);
	}
	return rc;
}

/* pssbb.xml */
int PSSBB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class PSSBB_only_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=0100|1|opc=00|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503349F) {
		decode_fields32(ENC_PSSBB_ONLY_BARRIERS, dec);
		OK(ENC_PSSBB_ONLY_BARRIERS);
	}
	return rc;
}

/* raddhn_advsimd.xml */
int RADDHN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RADDHN_asimddiff_N */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|01|o1=0|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E204000) {
		decode_fields32(ENC_RADDHN_ASIMDDIFF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->round = (dec->U==1);
		OK(ENC_RADDHN_ASIMDDIFF_N);
	}
	return rc;
}

/* rax1_advsimd.xml */
int RAX1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RAX1_VVV2_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=11|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE608C00) {
		decode_fields32(ENC_RAX1_VVV2_CRYPTOSHA512_3, dec);
		if(!HaveSHA3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_RAX1_VVV2_CRYPTOSHA512_3);
	}
	return rc;
}

/* rbit_advsimd.xml */
int RBIT_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RBIT_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=01|10000|opcode=00101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E605800) {
		decode_fields32(ENC_RBIT_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 8;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((8) ? ((dec->datasize) / (8)) : 0);
		OK(ENC_RBIT_ASIMDMISC_R);
	}
	return rc;
}

/* rbit_int.xml */
int RBIT_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opcode[1:0]=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FFFFC00)==0x5AC00000) {
		decode_fields32(ENC_RBIT_32_DP_1SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(dec->sf==0) OK(ENC_RBIT_32_DP_1SRC);
		if(dec->sf==1) OK(ENC_RBIT_64_DP_1SRC);
	}
	return rc;
}

/* ret.xml */
int RET(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RET_64R_branch_reg */
	/* 1101011|Z=0|opc[2:1]=0|op=10|op2=11111|op3[5:2]=0000|A=0|M=0|Rn=xxxxx|Rm=00000 */
	if((INSWORD & 0xFFFFFC1F)==0xD65F0000) {
		decode_fields32(ENC_RET_64R_BRANCH_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		dec->source_is_sp = ((dec->Z==1) && (dec->m==0x1f));
		if(!dec->pac && dec->m!=0) {
			UNDEFINED;
		}
		else if(dec->pac && !HavePACExt()) {
			UNDEFINED;
		}
		if(!dec->op) {
			dec->branch_type = BranchType_INDIR;
		}
		else if(dec->op==1) {
			dec->branch_type = BranchType_INDCALL;
		}
		else if(dec->op==2) {
			dec->branch_type = BranchType_RET;
		}
		else {
			UNDEFINED;
		}
		if(dec->pac) {
			if(dec->Z==0 && dec->m!=0x1f) {
				UNDEFINED;
			}
			if(dec->branch_type==BranchType_RET) {
				if(dec->n!=0x1f) {
					UNDEFINED;
				}
				dec->n = 0x1e;
				dec->source_is_sp = TRUE;
			}
		}
		OK(ENC_RET_64R_BRANCH_REG);
	}
	return rc;
}

/* reta.xml */
int RETA(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* 1101011|Z=0|opc[2:1]=0|op=10|op2=11111|op3[5:2]=0000|A=1|M=x|Rn=11111|Rm=11111 */
	if((INSWORD & 0xFFFFFBFF)==0xD65F0BFF) {
		decode_fields32(ENC_RETAA_64E_BRANCH_REG, dec);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->pac = (dec->A==1);
		dec->use_key_a = (dec->M==0);
		dec->source_is_sp = ((dec->Z==1) && (dec->m==0x1f));
		if(!dec->pac && dec->m!=0) {
			UNDEFINED;
		}
		else if(dec->pac && !HavePACExt()) {
			UNDEFINED;
		}
		if(!dec->op) {
			dec->branch_type = BranchType_INDIR;
		}
		else if(dec->op==1) {
			dec->branch_type = BranchType_INDCALL;
		}
		else if(dec->op==2) {
			dec->branch_type = BranchType_RET;
		}
		else {
			UNDEFINED;
		}
		if(dec->pac) {
			if(dec->Z==0 && dec->m!=0x1f) {
				UNDEFINED;
			}
			if(dec->branch_type==BranchType_RET) {
				if(dec->n!=0x1f) {
					UNDEFINED;
				}
				dec->n = 0x1e;
				dec->source_is_sp = TRUE;
			}
		}
		if(dec->M==0) OK(ENC_RETAA_64E_BRANCH_REG);
		if(dec->M==1) OK(ENC_RETAB_64E_BRANCH_REG);
	}
	return rc;
}

/* rev.xml */
int REV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=1x|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FFFF800)==0x5AC00800) {
		decode_fields32(ENC_REV_32_DP_1SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			ENDOFINSTRUCTION;
		}
		else if(dec->opc==1) {
			dec->container_size = 0x10;
		}
		else if(dec->opc==2) {
			dec->container_size = 0x20;
		}
		else if(dec->opc==3) {
			if(dec->sf==0) {
				UNDEFINED;
			}
			dec->container_size = 0x40;
		}
		if(dec->sf==0 && dec->opc==2) OK(ENC_REV_32_DP_1SRC);
		if(dec->sf==1 && dec->opc==3) OK(ENC_REV_64_DP_1SRC);
	}
	return rc;
}

/* rev16_advsimd.xml */
int REV16_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class REV16_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|0000|o0=1|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE201800) {
		decode_fields32(ENC_REV16_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->op = ((dec->o0<<1)|dec->U);
		if((UINT(dec->op)+UINT(dec->size)) >= (3)) {
			UNDEFINED;
		}
		if(dec->op==2) {
			dec->container_size = 0x10;
		}
		else if(dec->op==1) {
			dec->container_size = 0x20;
		}
		else if(!dec->op) {
			dec->container_size = 0x40;
		}
		dec->containers = ((dec->container_size) ? ((dec->datasize) / (dec->container_size)) : 0);
		dec->elements_per_container = ((dec->esize) ? ((dec->container_size) / (dec->esize)) : 0);
		OK(ENC_REV16_ASIMDMISC_R);
	}
	return rc;
}

/* rev16_int.xml */
int REV16_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FFFFC00)==0x5AC00400) {
		decode_fields32(ENC_REV16_32_DP_1SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			ENDOFINSTRUCTION;
		}
		else if(dec->opc==1) {
			dec->container_size = 0x10;
		}
		else if(dec->opc==2) {
			dec->container_size = 0x20;
		}
		else if(dec->opc==3) {
			if(dec->sf==0) {
				UNDEFINED;
			}
			dec->container_size = 0x40;
		}
		if(dec->sf==0) OK(ENC_REV16_32_DP_1SRC);
		if(dec->sf==1) OK(ENC_REV16_64_DP_1SRC);
	}
	return rc;
}

/* rev32_advsimd.xml */
int REV32_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class REV32_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=xx|10000|0000|o0=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E200800) {
		decode_fields32(ENC_REV32_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->op = ((dec->o0<<1)|dec->U);
		if((UINT(dec->op)+UINT(dec->size)) >= (3)) {
			UNDEFINED;
		}
		if(dec->op==2) {
			dec->container_size = 0x10;
		}
		else if(dec->op==1) {
			dec->container_size = 0x20;
		}
		else if(!dec->op) {
			dec->container_size = 0x40;
		}
		dec->containers = ((dec->container_size) ? ((dec->datasize) / (dec->container_size)) : 0);
		dec->elements_per_container = ((dec->esize) ? ((dec->container_size) / (dec->esize)) : 0);
		OK(ENC_REV32_ASIMDMISC_R);
	}
	return rc;
}

/* rev32_int.xml */
int REV32_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class REV32_64_dp_1src */
	/* sf=1|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xDAC00800) {
		decode_fields32(ENC_REV32_64_DP_1SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			ENDOFINSTRUCTION;
		}
		else if(dec->opc==1) {
			dec->container_size = 0x10;
		}
		else if(dec->opc==2) {
			dec->container_size = 0x20;
		}
		else if(dec->opc==3) {
			if(dec->sf==0) {
				UNDEFINED;
			}
			dec->container_size = 0x40;
		}
		OK(ENC_REV32_64_DP_1SRC);
	}
	return rc;
}

/* rev64_rev.xml */
int REV64_REV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00000|opcode[5:2]=0000|opc=11|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xDAC00C00) {
		decode_fields32(ENC_REV64_REV_64_DP_1SRC, dec);
		OK(ENC_REV64_REV_64_DP_1SRC);
	}
	return rc;
}

/* rev64_advsimd.xml */
int REV64_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class REV64_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|0000|o0=0|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE200800) {
		decode_fields32(ENC_REV64_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->op = ((dec->o0<<1)|dec->U);
		if((UINT(dec->op)+UINT(dec->size)) >= (3)) {
			UNDEFINED;
		}
		if(dec->op==2) {
			dec->container_size = 0x10;
		}
		else if(dec->op==1) {
			dec->container_size = 0x20;
		}
		else if(!dec->op) {
			dec->container_size = 0x40;
		}
		dec->containers = ((dec->container_size) ? ((dec->datasize) / (dec->container_size)) : 0);
		dec->elements_per_container = ((dec->esize) ? ((dec->container_size) / (dec->esize)) : 0);
		OK(ENC_REV64_ASIMDMISC_R);
	}
	return rc;
}

/* rmif.xml */
int RMIF(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RMIF_only_rmif */
	/* sf=1|op=0|S=1|11010000|imm6=xxxxxx|00001|Rn=xxxxx|o2=0|mask=xxxx */
	if((INSWORD & 0xFFE07C10)==0xBA000400) {
		decode_fields32(ENC_RMIF_ONLY_RMIF, dec);
		if(!HaveFlagManipulateExt() || dec->sf!=1) {
			UNDEFINED;
		}
		dec->lsb = UINT(dec->imm6);
		dec->n = UINT(dec->Rn);
		OK(ENC_RMIF_ONLY_RMIF);
	}
	return rc;
}

/* rorv.xml */
int RORV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=11|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02C00) {
		decode_fields32(ENC_RORV_32_DP_2SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->shift_type = DecodeShift(dec->op2);
		/* unconditional alias */
		if(ROR_RORV(ctx, dec)==0) return 0;
		if(dec->sf==0) OK(ENC_RORV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_RORV_64_DP_2SRC);
	}
	return rc;
}

/* ror_extr.xml */
int ROR_EXTR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op21=00|100111|N=x|o0=0|Rm=xxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FA00000)==0x13800000) {
		decode_fields32(ENC_ROR_EXTR_32_EXTRACT, dec);
		if(dec->sf==0 && dec->N==0 && !(dec->imms&0x20)) OK(ENC_ROR_EXTR_32_EXTRACT);
		if(dec->sf==1 && dec->N==1) OK(ENC_ROR_EXTR_64_EXTRACT);
	}
	return rc;
}

/* ror_rorv.xml */
int ROR_RORV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:2>=0010|op2=11|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC02C00) {
		decode_fields32(ENC_ROR_RORV_32_DP_2SRC, dec);
		if(dec->sf==0) OK(ENC_ROR_RORV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_ROR_RORV_64_DP_2SRC);
	}
	return rc;
}

/* rshrn_advsimd.xml */
int RSHRN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RSHRN_asimdshf_N */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|1000|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF008C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_RSHRN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		OK(ENC_RSHRN_ASIMDSHF_N);
	}
	return rc;
}

/* rsubhn_advsimd.xml */
int RSUBHN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class RSUBHN_asimddiff_N */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|01|o1=1|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E206000) {
		decode_fields32(ENC_RSUBHN_ASIMDDIFF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->round = (dec->U==1);
		OK(ENC_RSUBHN_ASIMDDIFF_N);
	}
	return rc;
}

/* sabal_advsimd.xml */
int SABAL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SABAL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|01|op=0|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE205000) {
		decode_fields32(ENC_SABAL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->accumulate = (dec->op==0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SABAL_ASIMDDIFF_L);
	}
	return rc;
}

/* saba_advsimd.xml */
int SABA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SABA_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|0111|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE207C00) {
		decode_fields32(ENC_SABA_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->accumulate = (dec->ac==1);
		OK(ENC_SABA_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sabdl_advsimd.xml */
int SABDL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SABDL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|01|op=1|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE207000) {
		decode_fields32(ENC_SABDL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->accumulate = (dec->op==0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SABDL_ASIMDDIFF_L);
	}
	return rc;
}

/* sabd_advsimd.xml */
int SABD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SABD_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|0111|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE207400) {
		decode_fields32(ENC_SABD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->accumulate = (dec->ac==1);
		OK(ENC_SABD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sadalp_advsimd.xml */
int SADALP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SADALP_asimdmisc_P */
	/* 0|Q=x|U=0|01110|size=xx|10000|00|op=1|10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE206800) {
		decode_fields32(ENC_SADALP_ASIMDMISC_P, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((((2) * (dec->esize))) ? ((dec->datasize) / (((2) * (dec->esize)))) : 0);
		dec->acc = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SADALP_ASIMDMISC_P);
	}
	return rc;
}

/* saddlp_advsimd.xml */
int SADDLP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SADDLP_asimdmisc_P */
	/* 0|Q=x|U=0|01110|size=xx|10000|00|op=0|10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE202800) {
		decode_fields32(ENC_SADDLP_ASIMDMISC_P, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((((2) * (dec->esize))) ? ((dec->datasize) / (((2) * (dec->esize)))) : 0);
		dec->acc = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SADDLP_ASIMDMISC_P);
	}
	return rc;
}

/* saddlv_advsimd.xml */
int SADDLV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SADDLV_asimdall_only */
	/* 0|Q=x|U=0|01110|size=xx|11000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE303800) {
		decode_fields32(ENC_SADDLV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SADDLV_ASIMDALL_ONLY);
	}
	return rc;
}

/* saddl_advsimd.xml */
int SADDL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SADDL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|00|o1=0|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE200000) {
		decode_fields32(ENC_SADDL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SADDL_ASIMDDIFF_L);
	}
	return rc;
}

/* saddw_advsimd.xml */
int SADDW_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SADDW_asimddiff_W */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|00|o1=0|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE201000) {
		decode_fields32(ENC_SADDW_ASIMDDIFF_W, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SADDW_ASIMDDIFF_W);
	}
	return rc;
}

/* sb.xml */
int SB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SB_only_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=(0)(0)(0)(0)|1|opc=11|Rt=11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD50330FF) {
		decode_fields32(ENC_SB_ONLY_BARRIERS, dec);
		if(!HaveSBExt()) {
			UNDEFINED;
		}
		OK(ENC_SB_ONLY_BARRIERS);
	}
	return rc;
}

/* sbc.xml */
int SBC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=1|S=0|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x5A000000) {
		decode_fields32(ENC_SBC_32_ADDSUB_CARRY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		/* regular aliases */
		if(dec->Rn==0x1f) return NGC_SBC(ctx, dec);
		if(dec->sf==0) OK(ENC_SBC_32_ADDSUB_CARRY);
		if(dec->sf==1) OK(ENC_SBC_64_ADDSUB_CARRY);
	}
	return rc;
}

/* sbcs.xml */
int SBCS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|11010000|Rm=xxxxx|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x7A000000) {
		decode_fields32(ENC_SBCS_32_ADDSUB_CARRY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		/* regular aliases */
		if(dec->Rn==0x1f) return NGCS_SBCS(ctx, dec);
		if(dec->sf==0) OK(ENC_SBCS_32_ADDSUB_CARRY);
		if(dec->sf==1) OK(ENC_SBCS_64_ADDSUB_CARRY);
	}
	return rc;
}

/* sbfiz_sbfm.xml */
int SBFIZ_SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x13000000) {
		decode_fields32(ENC_SBFIZ_SBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_SBFIZ_SBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_SBFIZ_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* sbfm.xml */
int SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x13000000) {
		decode_fields32(ENC_SBFM_32M_BITFIELD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->inzero = TRUE;
			dec->extend = TRUE;
		}
		else if(dec->opc==1) {
			dec->inzero = FALSE;
			dec->extend = FALSE;
		}
		else if(dec->opc==2) {
			dec->inzero = TRUE;
			dec->extend = FALSE;
		}
		else if(dec->opc==3) {
			UNDEFINED;
		}
		if(dec->sf==1 && dec->N!=1) {
			UNDEFINED;
		}
		if(dec->sf==0 && (dec->N!=0 || SLICE(dec->immr,5,5)!=0 || SLICE(dec->imms,5,5)!=0)) {
			UNDEFINED;
		}
		dec->R = UINT(dec->immr);
		dec->S = UINT(dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->wmask = dbmrt.wmask;
		dec->tmask = dbmrt.tmask;
		/* regular aliases */
		bool encoding32 = dec->sf==0 && dec->N==0;
		bool encoding64 = dec->sf==1 && dec->N==1;
		if((dec->imms==0x1f && EncodingLabeled32Bit()) || (dec->imms==0x3f && EncodingLabeled64Bit())) return ASR_SBFM(ctx, dec);
		if(UINT(dec->imms)<UINT(dec->immr)) return SBFIZ_SBFM(ctx, dec);
		if(BFXPreferred(dec->sf,SLICE(dec->opc,1,1),dec->imms,dec->immr)) return SBFX_SBFM(ctx, dec);
		if(dec->immr==0 && dec->imms==7) return SXTB_SBFM(ctx, dec);
		if(dec->immr==0 && dec->imms==15) return SXTH_SBFM(ctx, dec);
		if(dec->immr==0 && dec->imms==0x1f) return SXTW_SBFM(ctx, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_SBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* sbfx_sbfm.xml */
int SBFX_SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=x|opc=00|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x13000000) {
		decode_fields32(ENC_SBFX_SBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_SBFX_SBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_SBFX_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* scvtf_advsimd_fix.xml */
int SCVTF_advsimd_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SCVTF_asisdshf_C */
	/* 01|U=0|111110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F00E400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SCVTF_ASISDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRoundingMode(ctx->FPCR);
		OK(ENC_SCVTF_ASISDSHF_C);
	}
	/* class SCVTF_asimdshf_C */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF00E400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SCVTF_ASIMDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRoundingMode(ctx->FPCR);
		OK(ENC_SCVTF_ASIMDSHF_C);
	}
	return rc;
}

/* scvtf_advsimd_int.xml */
int SCVTF_advsimd_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SCVTF_asisdmiscfp16_R */
	/* 01|U=0|11110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E79D800) {
		decode_fields32(ENC_SCVTF_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SCVTF_ASISDMISCFP16_R);
	}
	/* class SCVTF_asisdmisc_R */
	/* 01|U=0|11110|0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x5E21D800) {
		decode_fields32(ENC_SCVTF_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SCVTF_ASISDMISC_R);
	}
	/* class SCVTF_asimdmiscfp16_R */
	/* 0|Q=x|U=0|01110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0xE79D800) {
		decode_fields32(ENC_SCVTF_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SCVTF_ASIMDMISCFP16_R);
	}
	/* class SCVTF_asimdmisc_R */
	/* 0|Q=x|U=0|01110|0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xE21D800) {
		decode_fields32(ENC_SCVTF_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SCVTF_ASIMDMISC_R);
	}
	return rc;
}

/* scvtf_float_fix.xml */
int SCVTF_float_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|0|rmode=00|opcode=010|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3F0000)==0x1E020000) {
		decode_fields32(ENC_SCVTF_H32_FLOAT2FIX, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(dec->sf==0 && SLICE(dec->scale,5,5)==0) {
			UNDEFINED;
		}
		dec->fracbits = 0x40-UINT(dec->scale);
		if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==3) {
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_SCVTF_H32_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_SCVTF_S32_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_SCVTF_D32_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_SCVTF_H64_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_SCVTF_S64_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_SCVTF_D64_FLOAT2FIX);
	}
	return rc;
}

/* scvtf_float_int.xml */
int SCVTF_float_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=010|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E220000) {
		decode_fields32(ENC_SCVTF_H32_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_SCVTF_H32_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_SCVTF_S32_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_SCVTF_D32_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_SCVTF_H64_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_SCVTF_S64_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_SCVTF_D64_FLOAT2INT);
	}
	return rc;
}

/* sdiv.xml */
int SDIV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:1>=00001|o1=1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC00C00) {
		decode_fields32(ENC_SDIV_32_DP_2SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->unsigned_ = (dec->o1==0);
		if(dec->sf==0) OK(ENC_SDIV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_SDIV_64_DP_2SRC);
	}
	return rc;
}

/* sdot_advsimd_elt.xml */
int SDOT_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SDOT_asimdelem_D */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1110|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF00E000) {
		decode_fields32(ENC_SDOT_ASIMDELEM_D, dec);
		if(!HaveDOTPExt()) {
			UNDEFINED;
		}
		if(dec->size!=2) {
			UNDEFINED;
		}
		dec->signed_ = (dec->U==0);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->M<<4)|dec->Rm));
		dec->index = UINT(((dec->H<<1)|dec->L));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_SDOT_ASIMDELEM_D);
	}
	return rc;
}

/* sdot_advsimd_vec.xml */
int SDOT_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SDOT_asimdsame2_D */
	/* 0|Q=x|U=0|01110|size=xx|0|Rm=xxxxx|1|opcode=0010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE009400) {
		decode_fields32(ENC_SDOT_ASIMDSAME2_D, dec);
		if(!HaveDOTPExt()) {
			UNDEFINED;
		}
		if(dec->size!=2) {
			UNDEFINED;
		}
		dec->signed_ = (dec->U==0);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_SDOT_ASIMDSAME2_D);
	}
	return rc;
}

/* setf.xml */
int SETF(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=0|op=0|S=1|11010000|opcode2=000000|sz=x|0010|Rn=xxxxx|o3=0|mask=1101 */
	if((INSWORD & 0xFFFFBC1F)==0x3A00080D) {
		decode_fields32(ENC_SETF8_ONLY_SETF, dec);
		if(!HaveFlagManipulateExt() || dec->sf!=0) {
			UNDEFINED;
		}
		dec->msb = (dec->sz==1) ? 15 : 7;
		dec->n = UINT(dec->Rn);
		if(dec->sz==0) OK(ENC_SETF8_ONLY_SETF);
		if(dec->sz==1) OK(ENC_SETF16_ONLY_SETF);
	}
	return rc;
}

/* sev.xml */
int SEV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SEV_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=100|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503209F) {
		decode_fields32(ENC_SEV_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_SEV_HI_HINTS);
	}
	return rc;
}

/* sevl.xml */
int SEVL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SEVL_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=101|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD50320BF) {
		decode_fields32(ENC_SEVL_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_SEVL_HI_HINTS);
	}
	return rc;
}

/* sha1c_advsimd.xml */
int SHA1C_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA1C_QSV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|opcode=000|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E000000) {
		decode_fields32(ENC_SHA1C_QSV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA1Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA1C_QSV_CRYPTOSHA3);
	}
	return rc;
}

/* sha1h_advsimd.xml */
int SHA1H_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA1H_SS_cryptosha2 */
	/* 01011110|size=00|10100|opcode=00000|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E280800) {
		decode_fields32(ENC_SHA1H_SS_CRYPTOSHA2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveSHA1Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA1H_SS_CRYPTOSHA2);
	}
	return rc;
}

/* sha1m_advsimd.xml */
int SHA1M_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA1M_QSV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|opcode=010|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E002000) {
		decode_fields32(ENC_SHA1M_QSV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA1Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA1M_QSV_CRYPTOSHA3);
	}
	return rc;
}

/* sha1p_advsimd.xml */
int SHA1P_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA1P_QSV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|opcode=001|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E001000) {
		decode_fields32(ENC_SHA1P_QSV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA1Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA1P_QSV_CRYPTOSHA3);
	}
	return rc;
}

/* sha1su0_advsimd.xml */
int SHA1SU0_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA1SU0_VVV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|opcode=011|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E003000) {
		decode_fields32(ENC_SHA1SU0_VVV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA1Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA1SU0_VVV_CRYPTOSHA3);
	}
	return rc;
}

/* sha1su1_advsimd.xml */
int SHA1SU1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA1SU1_VV_cryptosha2 */
	/* 01011110|size=00|10100|opcode=00001|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E281800) {
		decode_fields32(ENC_SHA1SU1_VV_CRYPTOSHA2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveSHA1Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA1SU1_VV_CRYPTOSHA2);
	}
	return rc;
}

/* sha256h2_advsimd.xml */
int SHA256H2_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA256H2_QQV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|10|P=1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E005000) {
		decode_fields32(ENC_SHA256H2_QQV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA256Ext()) {
			UNDEFINED;
		}
		dec->part1 = (dec->P==0);
		OK(ENC_SHA256H2_QQV_CRYPTOSHA3);
	}
	return rc;
}

/* sha256h_advsimd.xml */
int SHA256H_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA256H_QQV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|10|P=0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E004000) {
		decode_fields32(ENC_SHA256H_QQV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA256Ext()) {
			UNDEFINED;
		}
		dec->part1 = (dec->P==0);
		OK(ENC_SHA256H_QQV_CRYPTOSHA3);
	}
	return rc;
}

/* sha256su0_advsimd.xml */
int SHA256SU0_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA256SU0_VV_cryptosha2 */
	/* 01011110|size=00|10100|opcode=00010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x5E282800) {
		decode_fields32(ENC_SHA256SU0_VV_CRYPTOSHA2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HaveSHA256Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA256SU0_VV_CRYPTOSHA2);
	}
	return rc;
}

/* sha256su1_advsimd.xml */
int SHA256SU1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA256SU1_VVV_cryptosha3 */
	/* 01011110|size=00|0|Rm=xxxxx|0|opcode=110|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5E006000) {
		decode_fields32(ENC_SHA256SU1_VVV_CRYPTOSHA3, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(!HaveSHA256Ext()) {
			UNDEFINED;
		}
		OK(ENC_SHA256SU1_VVV_CRYPTOSHA3);
	}
	return rc;
}

/* sha512h2_advsimd.xml */
int SHA512H2_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA512H2_QQV_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE608400) {
		decode_fields32(ENC_SHA512H2_QQV_CRYPTOSHA512_3, dec);
		if(!HaveSHA512Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_SHA512H2_QQV_CRYPTOSHA512_3);
	}
	return rc;
}

/* sha512h_advsimd.xml */
int SHA512H_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA512H_QQV_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE608000) {
		decode_fields32(ENC_SHA512H_QQV_CRYPTOSHA512_3, dec);
		if(!HaveSHA512Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_SHA512H_QQV_CRYPTOSHA512_3);
	}
	return rc;
}

/* sha512su0_advsimd.xml */
int SHA512SU0_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA512SU0_VV2_cryptosha512_2 */
	/* 11001110110000001000|opcode=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xCEC08000) {
		decode_fields32(ENC_SHA512SU0_VV2_CRYPTOSHA512_2, dec);
		if(!HaveSHA512Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		OK(ENC_SHA512SU0_VV2_CRYPTOSHA512_2);
	}
	return rc;
}

/* sha512su1_advsimd.xml */
int SHA512SU1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHA512SU1_VVV2_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=0|00|opcode=10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE608800) {
		decode_fields32(ENC_SHA512SU1_VVV2_CRYPTOSHA512_3, dec);
		if(!HaveSHA512Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_SHA512SU1_VVV2_CRYPTOSHA512_3);
	}
	return rc;
}

/* shadd_advsimd.xml */
int SHADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHADD_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE200400) {
		decode_fields32(ENC_SHADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SHADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* shll_advsimd.xml */
int SHLL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHLL_asimdmisc_S */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=10011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E213800) {
		decode_fields32(ENC_SHLL_ASIMDMISC_S, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = dec->esize;
		dec->unsigned_ = FALSE;
		OK(ENC_SHLL_ASIMDMISC_S);
	}
	return rc;
}

/* shl_advsimd.xml */
int SHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHL_asisdshf_R */
	/* 01|U=0|111110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F005400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SHL_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		OK(ENC_SHL_ASISDSHF_R);
	}
	/* class SHL_asimdshf_R */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF005400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SHL_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		OK(ENC_SHL_ASIMDSHF_R);
	}
	return rc;
}

/* shrn_advsimd.xml */
int SHRN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHRN_asimdshf_N */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|1000|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF008400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SHRN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		OK(ENC_SHRN_ASIMDSHF_N);
	}
	return rc;
}

/* shsub_advsimd.xml */
int SHSUB_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SHSUB_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE202400) {
		decode_fields32(ENC_SHSUB_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SHSUB_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sli_advsimd.xml */
int SLI_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SLI_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F005400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SLI_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		OK(ENC_SLI_ASISDSHF_R);
	}
	/* class SLI_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=01010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F005400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SLI_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		OK(ENC_SLI_ASIMDSHF_R);
	}
	return rc;
}

/* sm3partw1_advsimd.xml */
int SM3PARTW1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3PARTW1_VVV4_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=1|00|opcode=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE60C000) {
		decode_fields32(ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_SM3PARTW1_VVV4_CRYPTOSHA512_3);
	}
	return rc;
}

/* sm3partw2_advsimd.xml */
int SM3PARTW2_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3PARTW2_VVV4_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=1|00|opcode=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE60C400) {
		decode_fields32(ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_SM3PARTW2_VVV4_CRYPTOSHA512_3);
	}
	return rc;
}

/* sm3ss1_advsimd.xml */
int SM3SS1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3SS1_VVV4_crypto4 */
	/* 110011100|Op0=10|Rm=xxxxx|0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0xCE400000) {
		decode_fields32(ENC_SM3SS1_VVV4_CRYPTO4, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		OK(ENC_SM3SS1_VVV4_CRYPTO4);
	}
	return rc;
}

/* sm3tt1a_advsimd.xml */
int SM3TT1A_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3TT1A_VVV4_crypto3_imm2 */
	/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0CC00)==0xCE408000) {
		decode_fields32(ENC_SM3TT1A_VVV4_CRYPTO3_IMM2, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->i = UINT(dec->imm2);
		OK(ENC_SM3TT1A_VVV4_CRYPTO3_IMM2);
	}
	return rc;
}

/* sm3tt1b_advsimd.xml */
int SM3TT1B_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3TT1B_VVV4_crypto3_imm2 */
	/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0CC00)==0xCE408400) {
		decode_fields32(ENC_SM3TT1B_VVV4_CRYPTO3_IMM2, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->i = UINT(dec->imm2);
		OK(ENC_SM3TT1B_VVV4_CRYPTO3_IMM2);
	}
	return rc;
}

/* sm3tt2a_advsimd.xml */
int SM3TT2A_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3TT2A_VVV4_crypto3_imm2 */
	/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0CC00)==0xCE408800) {
		decode_fields32(ENC_SM3TT2A_VVV4_CRYPTO3_IMM2, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->i = UINT(dec->imm2);
		OK(ENC_SM3TT2A_VVV4_CRYPTO3_IMM2);
	}
	return rc;
}

/* sm3tt2b_advsimd.xml */
int SM3TT2B_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM3TT2B_VVV_crypto3_imm2 */
	/* 11001110010|Rm=xxxxx|10|imm2=xx|opcode=11|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0CC00)==0xCE408C00) {
		decode_fields32(ENC_SM3TT2B_VVV_CRYPTO3_IMM2, dec);
		if(!HaveSM3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->i = UINT(dec->imm2);
		OK(ENC_SM3TT2B_VVV_CRYPTO3_IMM2);
	}
	return rc;
}

/* sm4ekey_advsimd.xml */
int SM4EKEY_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM4EKEY_VVV4_cryptosha512_3 */
	/* 11001110011|Rm=xxxxx|1|O=1|00|opcode=10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xCE60C800) {
		decode_fields32(ENC_SM4EKEY_VVV4_CRYPTOSHA512_3, dec);
		if(!HaveSM4Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_SM4EKEY_VVV4_CRYPTOSHA512_3);
	}
	return rc;
}

/* sm4e_advsimd.xml */
int SM4E_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SM4E_VV4_cryptosha512_2 */
	/* 11001110110000001000|opcode=01|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xCEC08400) {
		decode_fields32(ENC_SM4E_VV4_CRYPTOSHA512_2, dec);
		if(!HaveSM4Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		OK(ENC_SM4E_VV4_CRYPTOSHA512_2);
	}
	return rc;
}

/* smaddl.xml */
int SMADDL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMADDL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=0|01|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0x9B200000) {
		decode_fields32(ENC_SMADDL_64WA_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = 0x40;
		dec->datasize = 0x20;
		dec->sub_op = (dec->o0==1);
		dec->unsigned_ = (dec->U==1);
		/* regular aliases */
		if(dec->Ra==0x1f) return SMULL_SMADDL(ctx, dec);
		OK(ENC_SMADDL_64WA_DP_3SRC);
	}
	return rc;
}

/* smaxp_advsimd.xml */
int SMAXP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMAXP_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|1010|o1=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20A400) {
		decode_fields32(ENC_SMAXP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_SMAXP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* smaxv_advsimd.xml */
int SMAXV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMAXV_asimdall_only */
	/* 0|Q=x|U=0|01110|size=xx|11000|op=0|1010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE30A800) {
		decode_fields32(ENC_SMAXV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->min = (dec->op==1);
		OK(ENC_SMAXV_ASIMDALL_ONLY);
	}
	return rc;
}

/* smax_advsimd.xml */
int SMAX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMAX_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|0110|o1=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE206400) {
		decode_fields32(ENC_SMAX_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_SMAX_ASIMDSAME_ONLY);
	}
	return rc;
}

/* smc.xml */
int SMC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMC_EX_exception */
	/* 11010100|opc=000|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=11 */
	if((INSWORD & 0xFFE0001F)==0xD4000003) {
		decode_fields32(ENC_SMC_EX_EXCEPTION, dec);
		OK(ENC_SMC_EX_EXCEPTION);
	}
	return rc;
}

/* sminp_advsimd.xml */
int SMINP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMINP_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|1010|o1=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20AC00) {
		decode_fields32(ENC_SMINP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_SMINP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sminv_advsimd.xml */
int SMINV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMINV_asimdall_only */
	/* 0|Q=x|U=0|01110|size=xx|11000|op=1|1010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE31A800) {
		decode_fields32(ENC_SMINV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->min = (dec->op==1);
		OK(ENC_SMINV_ASIMDALL_ONLY);
	}
	return rc;
}

/* smin_advsimd.xml */
int SMIN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMIN_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|0110|o1=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE206C00) {
		decode_fields32(ENC_SMIN_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_SMIN_ASIMDSAME_ONLY);
	}
	return rc;
}

/* smlal_advsimd_elt.xml */
int SMLAL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMLAL_asimdelem_L */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=0|10|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF002000) {
		decode_fields32(ENC_SMLAL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->sub_op = (dec->o2==1);
		OK(ENC_SMLAL_ASIMDELEM_L);
	}
	return rc;
}

/* smlal_advsimd_vec.xml */
int SMLAL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMLAL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|10|o1=0|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE208000) {
		decode_fields32(ENC_SMLAL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SMLAL_ASIMDDIFF_L);
	}
	return rc;
}

/* smlsl_advsimd_elt.xml */
int SMLSL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMLSL_asimdelem_L */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=1|10|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF006000) {
		decode_fields32(ENC_SMLSL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->sub_op = (dec->o2==1);
		OK(ENC_SMLSL_ASIMDELEM_L);
	}
	return rc;
}

/* smlsl_advsimd_vec.xml */
int SMLSL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMLSL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|10|o1=1|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20A000) {
		decode_fields32(ENC_SMLSL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SMLSL_ASIMDDIFF_L);
	}
	return rc;
}

/* smmla_advsimd_vec.xml */
int SMMLA_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMMLA_asimdsame2_G */
	/* 0|Q=1|U=0|01110|size=10|0|Rm=xxxxx|1|010|B=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4E80A400) {
		decode_fields32(ENC_SMMLA_ASIMDSAME2_G, dec);
		if(!HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		if(!((dec->B<<1)|dec->U)) {
			dec->op1_unsigned = FALSE;
			dec->op2_unsigned = FALSE;
		}
		else if(((dec->B<<1)|dec->U)==1) {
			dec->op1_unsigned = TRUE;
			dec->op2_unsigned = TRUE;
		}
		else if(((dec->B<<1)|dec->U)==2) {
			dec->op1_unsigned = TRUE;
			dec->op2_unsigned = FALSE;
		}
		else if(((dec->B<<1)|dec->U)==3) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		OK(ENC_SMMLA_ASIMDSAME2_G);
	}
	return rc;
}

/* smnegl_smsubl.xml */
int SMNEGL_SMSUBL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMSUBL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=0|01|Rm=xxxxx|o0=1|Ra=11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9B20FC00) {
		decode_fields32(ENC_SMNEGL_SMSUBL_64WA_DP_3SRC, dec);
		OK(ENC_SMNEGL_SMSUBL_64WA_DP_3SRC);
	}
	return rc;
}

/* smov_advsimd.xml */
int SMOV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4<3:2>=01|imm4=01|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE002C00) {
		decode_fields32(ENC_SMOV_ASIMDINS_W_W, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->Q<<5)|dec->imm5)&1) {
			dec->size = 0;
		}
		else if((((dec->Q<<5)|dec->imm5)&3)==2) {
			dec->size = 1;
		}
		else if((((dec->Q<<5)|dec->imm5)&0x27)==0x24) {
			dec->size = 2;
		}
		else {
			UNDEFINED;
		}
		dec->idxdsize = (SLICE(dec->imm5,4,4)==1) ? 0x80 : 0x40;
		dec->index = UINT(SLICE(dec->imm5,4,dec->size+1));
		dec->esize = (8) << (dec->size);
		dec->datasize = (dec->Q==1) ? 0x40 : 0x20;
		if(dec->Q==0) OK(ENC_SMOV_ASIMDINS_W_W);
		if(dec->Q==1) OK(ENC_SMOV_ASIMDINS_X_X);
	}
	return rc;
}

/* smsubl.xml */
int SMSUBL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMSUBL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=0|01|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0x9B208000) {
		decode_fields32(ENC_SMSUBL_64WA_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = 0x40;
		dec->datasize = 0x20;
		dec->sub_op = (dec->o0==1);
		dec->unsigned_ = (dec->U==1);
		/* regular aliases */
		if(dec->Ra==0x1f) return SMNEGL_SMSUBL(ctx, dec);
		OK(ENC_SMSUBL_64WA_DP_3SRC);
	}
	return rc;
}

/* smulh.xml */
int SMULH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMULH_64_dp_3src */
	/* sf=1|op54=00|11011|U=0|10|Rm=xxxxx|o0=0|Ra=(1)(1)(1)(1)(1)|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0x9B400000) {
		decode_fields32(ENC_SMULH_64_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = 0x40;
		dec->datasize = dec->destsize;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SMULH_64_DP_3SRC);
	}
	return rc;
}

/* smull_smaddl.xml */
int SMULL_SMADDL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMADDL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=0|01|Rm=xxxxx|o0=0|Ra=11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9B207C00) {
		decode_fields32(ENC_SMULL_SMADDL_64WA_DP_3SRC, dec);
		OK(ENC_SMULL_SMADDL_64WA_DP_3SRC);
	}
	return rc;
}

/* smull_advsimd_elt.xml */
int SMULL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMULL_asimdelem_L */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1010|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF00A000) {
		decode_fields32(ENC_SMULL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SMULL_ASIMDELEM_L);
	}
	return rc;
}

/* smull_advsimd_vec.xml */
int SMULL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SMULL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=1100|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20C000) {
		decode_fields32(ENC_SMULL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SMULL_ASIMDDIFF_L);
	}
	return rc;
}

/* sqabs_advsimd.xml */
int SQABS_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQABS_asisdmisc_R */
	/* 01|U=0|11110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E207800) {
		decode_fields32(ENC_SQABS_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->neg = (dec->U==1);
		OK(ENC_SQABS_ASISDMISC_R);
	}
	/* class SQABS_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE207800) {
		decode_fields32(ENC_SQABS_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_SQABS_ASIMDMISC_R);
	}
	return rc;
}

/* sqadd_advsimd.xml */
int SQADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQADD_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E200C00) {
		decode_fields32(ENC_SQADD_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQADD_ASISDSAME_ONLY);
	}
	/* class SQADD_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE200C00) {
		decode_fields32(ENC_SQADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sqdmlal_advsimd_elt.xml */
int SQDMLAL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMLAL_asisdelem_L */
	/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|0|o2=0|11|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x5F003000) {
		decode_fields32(ENC_SQDMLAL_ASISDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->sub_op = (dec->o2==1);
		OK(ENC_SQDMLAL_ASISDELEM_L);
	}
	/* class SQDMLAL_asimdelem_L */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=0|11|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF003000) {
		decode_fields32(ENC_SQDMLAL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_SQDMLAL_ASIMDELEM_L);
	}
	return rc;
}

/* sqdmlal_advsimd_vec.xml */
int SQDMLAL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMLAL_asisddiff_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|10|o1=0|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E209000) {
		decode_fields32(ENC_SQDMLAL_ASISDDIFF_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->sub_op = (dec->o1==1);
		OK(ENC_SQDMLAL_ASISDDIFF_ONLY);
	}
	/* class SQDMLAL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|10|o1=0|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE209000) {
		decode_fields32(ENC_SQDMLAL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		OK(ENC_SQDMLAL_ASIMDDIFF_L);
	}
	return rc;
}

/* sqdmlsl_advsimd_elt.xml */
int SQDMLSL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMLSL_asisdelem_L */
	/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|0|o2=1|11|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x5F007000) {
		decode_fields32(ENC_SQDMLSL_ASISDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->sub_op = (dec->o2==1);
		OK(ENC_SQDMLSL_ASISDELEM_L);
	}
	/* class SQDMLSL_asimdelem_L */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=1|11|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF007000) {
		decode_fields32(ENC_SQDMLSL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o2==1);
		OK(ENC_SQDMLSL_ASIMDELEM_L);
	}
	return rc;
}

/* sqdmlsl_advsimd_vec.xml */
int SQDMLSL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMLSL_asisddiff_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|10|o1=1|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E20B000) {
		decode_fields32(ENC_SQDMLSL_ASISDDIFF_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->sub_op = (dec->o1==1);
		OK(ENC_SQDMLSL_ASISDDIFF_ONLY);
	}
	/* class SQDMLSL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|10|o1=1|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20B000) {
		decode_fields32(ENC_SQDMLSL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		OK(ENC_SQDMLSL_ASIMDDIFF_L);
	}
	return rc;
}

/* sqdmulh_advsimd_elt.xml */
int SQDMULH_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMULH_asisdelem_R */
	/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|110|op=0|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x5F00C000) {
		decode_fields32(ENC_SQDMULH_ASISDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->round = (dec->op==1);
		OK(ENC_SQDMULH_ASISDELEM_R);
	}
	/* class SQDMULH_asimdelem_R */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|110|op=0|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF00C000) {
		decode_fields32(ENC_SQDMULH_ASIMDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->round = (dec->op==1);
		OK(ENC_SQDMULH_ASIMDELEM_R);
	}
	return rc;
}

/* sqdmulh_advsimd_vec.xml */
int SQDMULH_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMULH_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E20B400) {
		decode_fields32(ENC_SQDMULH_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = (dec->U==1);
		OK(ENC_SQDMULH_ASISDSAME_ONLY);
	}
	/* class SQDMULH_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20B400) {
		decode_fields32(ENC_SQDMULH_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = (dec->U==1);
		OK(ENC_SQDMULH_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sqdmull_advsimd_elt.xml */
int SQDMULL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMULL_asisdelem_L */
	/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|opcode=1011|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x5F00B000) {
		decode_fields32(ENC_SQDMULL_ASISDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		OK(ENC_SQDMULL_ASISDELEM_L);
	}
	/* class SQDMULL_asimdelem_L */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1011|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF00B000) {
		decode_fields32(ENC_SQDMULL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_SQDMULL_ASIMDELEM_L);
	}
	return rc;
}

/* sqdmull_advsimd_vec.xml */
int SQDMULL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQDMULL_asisddiff_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=1101|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E20D000) {
		decode_fields32(ENC_SQDMULL_ASISDDIFF_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		OK(ENC_SQDMULL_ASISDDIFF_ONLY);
	}
	/* class SQDMULL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=1101|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE20D000) {
		decode_fields32(ENC_SQDMULL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==0 || dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_SQDMULL_ASIMDDIFF_L);
	}
	return rc;
}

/* sqneg_advsimd.xml */
int SQNEG_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQNEG_asisdmisc_R */
	/* 01|U=1|11110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E207800) {
		decode_fields32(ENC_SQNEG_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->neg = (dec->U==1);
		OK(ENC_SQNEG_ASISDMISC_R);
	}
	/* class SQNEG_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=00111|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E207800) {
		decode_fields32(ENC_SQNEG_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->neg = (dec->U==1);
		OK(ENC_SQNEG_ASIMDMISC_R);
	}
	return rc;
}

/* sqrdmlah_advsimd_elt.xml */
int SQRDMLAH_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRDMLAH_asisdelem_R */
	/* 01|U=1|11111|size=xx|L=x|M=x|Rm=xxxx|11|S=0|1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x7F00D000) {
		decode_fields32(ENC_SQRDMLAH_ASISDELEM_R, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLAH_ASISDELEM_R);
	}
	/* class SQRDMLAH_asimdelem_R */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|11|S=0|1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F00D000) {
		decode_fields32(ENC_SQRDMLAH_ASIMDELEM_R, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLAH_ASIMDELEM_R);
	}
	return rc;
}

/* sqrdmlah_advsimd_vec.xml */
int SQRDMLAH_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRDMLAH_asisdsame2_only */
	/* 01|U=1|11110|size=xx|0|Rm=xxxxx|1|000|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E008400) {
		decode_fields32(ENC_SQRDMLAH_ASISDSAME2_ONLY, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLAH_ASISDSAME2_ONLY);
	}
	/* class SQRDMLAH_asimdsame2_only */
	/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|000|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E008400) {
		decode_fields32(ENC_SQRDMLAH_ASIMDSAME2_ONLY, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLAH_ASIMDSAME2_ONLY);
	}
	return rc;
}

/* sqrdmlsh_advsimd_elt.xml */
int SQRDMLSH_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRDMLSH_asisdelem_R */
	/* 01|U=1|11111|size=xx|L=x|M=x|Rm=xxxx|11|S=1|1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x7F00F000) {
		decode_fields32(ENC_SQRDMLSH_ASISDELEM_R, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLSH_ASISDELEM_R);
	}
	/* class SQRDMLSH_asimdelem_R */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|11|S=1|1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F00F000) {
		decode_fields32(ENC_SQRDMLSH_ASIMDELEM_R, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLSH_ASIMDELEM_R);
	}
	return rc;
}

/* sqrdmlsh_advsimd_vec.xml */
int SQRDMLSH_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRDMLSH_asisdsame2_only */
	/* 01|U=1|11110|size=xx|0|Rm=xxxxx|1|000|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E008C00) {
		decode_fields32(ENC_SQRDMLSH_ASISDSAME2_ONLY, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLSH_ASISDSAME2_ONLY);
	}
	/* class SQRDMLSH_asimdsame2_only */
	/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|000|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E008C00) {
		decode_fields32(ENC_SQRDMLSH_ASIMDSAME2_ONLY, dec);
		if(!HaveQRDMLAHExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = TRUE;
		dec->sub_op = (dec->S==1);
		OK(ENC_SQRDMLSH_ASIMDSAME2_ONLY);
	}
	return rc;
}

/* sqrdmulh_advsimd_elt.xml */
int SQRDMULH_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRDMULH_asisdelem_R */
	/* 01|U=0|11111|size=xx|L=x|M=x|Rm=xxxx|110|op=1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF00F400)==0x5F00D000) {
		decode_fields32(ENC_SQRDMULH_ASISDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->round = (dec->op==1);
		OK(ENC_SQRDMULH_ASISDELEM_R);
	}
	/* class SQRDMULH_asimdelem_R */
	/* 0|Q=x|U=0|01111|size=xx|L=x|M=x|Rm=xxxx|110|op=1|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0xF00D000) {
		decode_fields32(ENC_SQRDMULH_ASIMDELEM_R, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->round = (dec->op==1);
		OK(ENC_SQRDMULH_ASIMDELEM_R);
	}
	return rc;
}

/* sqrdmulh_advsimd_vec.xml */
int SQRDMULH_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRDMULH_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E20B400) {
		decode_fields32(ENC_SQRDMULH_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->rounding = (dec->U==1);
		OK(ENC_SQRDMULH_ASISDSAME_ONLY);
	}
	/* class SQRDMULH_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10110|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E20B400) {
		decode_fields32(ENC_SQRDMULH_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3 || dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->rounding = (dec->U==1);
		OK(ENC_SQRDMULH_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sqrshl_advsimd.xml */
int SQRSHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRSHL_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E205C00) {
		decode_fields32(ENC_SQRSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_SQRSHL_ASISDSAME_ONLY);
	}
	/* class SQRSHL_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE205C00) {
		decode_fields32(ENC_SQRSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_SQRSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sqrshrn_advsimd.xml */
int SQRSHRN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRSHRN_asisdshf_N */
	/* 01|U=0|111110|immh!=0000|immb=xxx|1001|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F009C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQRSHRN_ASISDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQRSHRN_ASISDSHF_N);
	}
	/* class SQRSHRN_asimdshf_N */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|1001|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF009C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQRSHRN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQRSHRN_ASIMDSHF_N);
	}
	return rc;
}

/* sqrshrun_advsimd.xml */
int SQRSHRUN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQRSHRUN_asisdshf_N */
	/* 01|U=1|111110|immh!=0000|immb=xxx|1000|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F008C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQRSHRUN_ASISDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		OK(ENC_SQRSHRUN_ASISDSHF_N);
	}
	/* class SQRSHRUN_asimdshf_N */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|1000|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F008C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQRSHRUN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		OK(ENC_SQRSHRUN_ASIMDSHF_N);
	}
	return rc;
}

/* sqshlu_advsimd.xml */
int SQSHLU_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQSHLU_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|011|op=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F006400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHLU_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		if(!((dec->op<<1)|dec->U)) {
			UNDEFINED;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = TRUE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = FALSE;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->src_unsigned = TRUE;
			dec->dst_unsigned = TRUE;
		}
		OK(ENC_SQSHLU_ASISDSHF_R);
	}
	/* class SQSHLU_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|011|op=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F006400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHLU_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		if(!((dec->op<<1)|dec->U)) {
			UNDEFINED;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = TRUE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = FALSE;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->src_unsigned = TRUE;
			dec->dst_unsigned = TRUE;
		}
		OK(ENC_SQSHLU_ASIMDSHF_R);
	}
	return rc;
}

/* sqshl_advsimd_imm.xml */
int SQSHL_advsimd_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQSHL_asisdshf_R */
	/* 01|U=0|111110|immh!=0000|immb=xxx|011|op=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F007400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHL_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		if(!((dec->op<<1)|dec->U)) {
			UNDEFINED;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = TRUE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = FALSE;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->src_unsigned = TRUE;
			dec->dst_unsigned = TRUE;
		}
		OK(ENC_SQSHL_ASISDSHF_R);
	}
	/* class SQSHL_asimdshf_R */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|011|op=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF007400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHL_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		if(!((dec->op<<1)|dec->U)) {
			UNDEFINED;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = TRUE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = FALSE;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->src_unsigned = TRUE;
			dec->dst_unsigned = TRUE;
		}
		OK(ENC_SQSHL_ASIMDSHF_R);
	}
	return rc;
}

/* sqshl_advsimd_reg.xml */
int SQSHL_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQSHL_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E204C00) {
		decode_fields32(ENC_SQSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_SQSHL_ASISDSAME_ONLY);
	}
	/* class SQSHL_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE204C00) {
		decode_fields32(ENC_SQSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_SQSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sqshrn_advsimd.xml */
int SQSHRN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQSHRN_asisdshf_N */
	/* 01|U=0|111110|immh!=0000|immb=xxx|1001|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F009400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHRN_ASISDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQSHRN_ASISDSHF_N);
	}
	/* class SQSHRN_asimdshf_N */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|1001|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF009400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHRN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQSHRN_ASIMDSHF_N);
	}
	return rc;
}

/* sqshrun_advsimd.xml */
int SQSHRUN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQSHRUN_asisdshf_N */
	/* 01|U=1|111110|immh!=0000|immb=xxx|1000|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F008400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHRUN_ASISDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		OK(ENC_SQSHRUN_ASISDSHF_N);
	}
	/* class SQSHRUN_asimdshf_N */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|1000|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F008400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SQSHRUN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		OK(ENC_SQSHRUN_ASIMDSHF_N);
	}
	return rc;
}

/* sqsub_advsimd.xml */
int SQSUB_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQSUB_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E202C00) {
		decode_fields32(ENC_SQSUB_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQSUB_ASISDSAME_ONLY);
	}
	/* class SQSUB_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE202C00) {
		decode_fields32(ENC_SQSUB_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQSUB_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sqxtn_advsimd.xml */
int SQXTN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQXTN_asisdmisc_N */
	/* 01|U=0|11110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E214800) {
		decode_fields32(ENC_SQXTN_ASISDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->part = 0;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQXTN_ASISDMISC_N);
	}
	/* class SQXTN_asimdmisc_N */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE214800) {
		decode_fields32(ENC_SQXTN_ASIMDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SQXTN_ASIMDMISC_N);
	}
	return rc;
}

/* sqxtun_advsimd.xml */
int SQXTUN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SQXTUN_asisdmisc_N */
	/* 01|U=1|11110|size=xx|10000|opcode=10010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E212800) {
		decode_fields32(ENC_SQXTUN_ASISDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->part = 0;
		dec->elements = 1;
		OK(ENC_SQXTUN_ASISDMISC_N);
	}
	/* class SQXTUN_asimdmisc_N */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=10010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E212800) {
		decode_fields32(ENC_SQXTUN_ASIMDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_SQXTUN_ASIMDMISC_N);
	}
	return rc;
}

/* srhadd_advsimd.xml */
int SRHADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SRHADD_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|opcode=00010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE201400) {
		decode_fields32(ENC_SRHADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SRHADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sri_advsimd.xml */
int SRI_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SRI_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=01000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F004400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SRI_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		OK(ENC_SRI_ASISDSHF_R);
	}
	/* class SRI_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=01000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F004400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SRI_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		OK(ENC_SRI_ASIMDSHF_R);
	}
	return rc;
}

/* srshl_advsimd.xml */
int SRSHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SRSHL_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E205400) {
		decode_fields32(ENC_SRSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_SRSHL_ASISDSAME_ONLY);
	}
	/* class SRSHL_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE205400) {
		decode_fields32(ENC_SRSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_SRSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* srshr_advsimd.xml */
int SRSHR_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SRSHR_asisdshf_R */
	/* 01|U=0|111110|immh!=0000|immb=xxx|00|o1=1|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F002400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SRSHR_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SRSHR_ASISDSHF_R);
	}
	/* class SRSHR_asimdshf_R */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|00|o1=1|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF002400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SRSHR_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SRSHR_ASIMDSHF_R);
	}
	return rc;
}

/* srsra_advsimd.xml */
int SRSRA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SRSRA_asisdshf_R */
	/* 01|U=0|111110|immh!=0000|immb=xxx|00|o1=1|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F003400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SRSRA_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SRSRA_ASISDSHF_R);
	}
	/* class SRSRA_asimdshf_R */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|00|o1=1|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF003400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SRSRA_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SRSRA_ASIMDSHF_R);
	}
	return rc;
}

/* ssbb.xml */
int SSBB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSBB_only_barriers */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0011|CRm=0000|1|opc=00|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503309F) {
		decode_fields32(ENC_SSBB_ONLY_BARRIERS, dec);
		OK(ENC_SSBB_ONLY_BARRIERS);
	}
	return rc;
}

/* sshll_advsimd.xml */
int SSHLL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSHLL_asimdshf_L */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF00A400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SSHLL_ASIMDSHF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		dec->unsigned_ = (dec->U==1);
		/* regular aliases */
		if(dec->immb==0 && BitCount(dec->immh)==1) return SXTL_SSHLL_advsimd(ctx, dec);
		OK(ENC_SSHLL_ASIMDSHF_L);
	}
	return rc;
}

/* sshl_advsimd.xml */
int SSHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSHL_asisdsame_only */
	/* 01|U=0|11110|size=xx|1|Rm=xxxxx|010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5E204400) {
		decode_fields32(ENC_SSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_SSHL_ASISDSAME_ONLY);
	}
	/* class SSHL_asimdsame_only */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE204400) {
		decode_fields32(ENC_SSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_SSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sshr_advsimd.xml */
int SSHR_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSHR_asisdshf_R */
	/* 01|U=0|111110|immh!=0000|immb=xxx|00|o1=0|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F000400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SSHR_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SSHR_ASISDSHF_R);
	}
	/* class SSHR_asimdshf_R */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|00|o1=0|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF000400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SSHR_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SSHR_ASIMDSHF_R);
	}
	return rc;
}

/* ssra_advsimd.xml */
int SSRA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSRA_asisdshf_R */
	/* 01|U=0|111110|immh!=0000|immb=xxx|00|o1=0|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x5F001400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SSRA_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SSRA_ASISDSHF_R);
	}
	/* class SSRA_asimdshf_R */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=xxx|00|o1=0|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0xF001400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SSRA_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_SSRA_ASIMDSHF_R);
	}
	return rc;
}

/* ssubl_advsimd.xml */
int SSUBL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSUBL_asimddiff_L */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|00|o1=1|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE202000) {
		decode_fields32(ENC_SSUBL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SSUBL_ASIMDDIFF_L);
	}
	return rc;
}

/* ssubw_advsimd.xml */
int SSUBW_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSUBW_asimddiff_W */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|00|o1=1|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE203000) {
		decode_fields32(ENC_SSUBW_ASIMDDIFF_W, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SSUBW_ASIMDDIFF_W);
	}
	return rc;
}

/* st1_advsimd_mult.xml */
int ST1_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011000|L=0|000000|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xC002000) {
		decode_fields32(ENC_ST1_ASISDLSE_R1_1V, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==7) OK(ENC_ST1_ASISDLSE_R1_1V);
		if(dec->opcode==10) OK(ENC_ST1_ASISDLSE_R2_2V);
		if(dec->opcode==6) OK(ENC_ST1_ASISDLSE_R3_3V);
		if(dec->opcode==2) OK(ENC_ST1_ASISDLSE_R4_4V);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=xx1x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xC802000) {
		decode_fields32(ENC_ST1_ASISDLSEP_I1_I1, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==7) OK(ENC_ST1_ASISDLSEP_I1_I1);
		if(dec->Rm!=0x1f && dec->opcode==7) OK(ENC_ST1_ASISDLSEP_R1_R1);
		if(dec->Rm==0x1f && dec->opcode==10) OK(ENC_ST1_ASISDLSEP_I2_I2);
		if(dec->Rm!=0x1f && dec->opcode==10) OK(ENC_ST1_ASISDLSEP_R2_R2);
		if(dec->Rm==0x1f && dec->opcode==6) OK(ENC_ST1_ASISDLSEP_I3_I3);
		if(dec->Rm!=0x1f && dec->opcode==6) OK(ENC_ST1_ASISDLSEP_R3_R3);
		if(dec->Rm==0x1f && dec->opcode==2) OK(ENC_ST1_ASISDLSEP_I4_I4);
		if(dec->Rm!=0x1f && dec->opcode==2) OK(ENC_ST1_ASISDLSEP_R4_R4);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* st1_advsimd_sngl.xml */
int ST1_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=0|R=0|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD000000) {
		decode_fields32(ENC_ST1_ASISDLSO_B1_1B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==0) OK(ENC_ST1_ASISDLSO_B1_1B);
		if(dec->opcode==2 && !(dec->size&1)) OK(ENC_ST1_ASISDLSO_H1_1H);
		if(dec->opcode==4 && dec->size==0) OK(ENC_ST1_ASISDLSO_S1_1S);
		if(dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_ST1_ASISDLSO_D1_1D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=0|R=0|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xD800000) {
		decode_fields32(ENC_ST1_ASISDLSOP_B1_I1B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==0) OK(ENC_ST1_ASISDLSOP_B1_I1B);
		if(dec->Rm!=0x1f && dec->opcode==0) OK(ENC_ST1_ASISDLSOP_BX1_R1B);
		if(dec->Rm==0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_ST1_ASISDLSOP_H1_I1H);
		if(dec->Rm!=0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_ST1_ASISDLSOP_HX1_R1H);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->size==0) OK(ENC_ST1_ASISDLSOP_S1_I1S);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->size==0) OK(ENC_ST1_ASISDLSOP_SX1_R1S);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_ST1_ASISDLSOP_D1_I1D);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_ST1_ASISDLSOP_DX1_R1D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* st2g.xml */
int ST2G(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ST2G_64Spost_ldsttags */
	/* 11011001|opc=10|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9A00400) {
		decode_fields32(ENC_ST2G_64SPOST_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = TRUE;
		dec->zero_data = FALSE;
		OK(ENC_ST2G_64SPOST_LDSTTAGS);
	}
	/* class ST2G_64Spre_ldsttags */
	/* 11011001|opc=10|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9A00C00) {
		decode_fields32(ENC_ST2G_64SPRE_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = FALSE;
		dec->zero_data = FALSE;
		OK(ENC_ST2G_64SPRE_LDSTTAGS);
	}
	/* class ST2G_64Soffset_ldsttags */
	/* 11011001|opc=10|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9A00800) {
		decode_fields32(ENC_ST2G_64SOFFSET_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = FALSE;
		dec->postindex = FALSE;
		dec->zero_data = FALSE;
		OK(ENC_ST2G_64SOFFSET_LDSTTAGS);
	}
	return rc;
}

/* st2_advsimd_mult.xml */
int ST2_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ST2_asisdlse_R2 */
	/* 0|Q=x|0011000|L=0|000000|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xC008000) {
		decode_fields32(ENC_ST2_ASISDLSE_R2, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_ST2_ASISDLSE_R2);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=1000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xC808000) {
		decode_fields32(ENC_ST2_ASISDLSEP_I2_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_ST2_ASISDLSEP_I2_I);
		if(dec->Rm!=0x1f) OK(ENC_ST2_ASISDLSEP_R2_R);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* st2_advsimd_sngl.xml */
int ST2_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=0|R=1|00000|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD200000) {
		decode_fields32(ENC_ST2_ASISDLSO_B2_2B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==0) OK(ENC_ST2_ASISDLSO_B2_2B);
		if(dec->opcode==2 && !(dec->size&1)) OK(ENC_ST2_ASISDLSO_H2_2H);
		if(dec->opcode==4 && dec->size==0) OK(ENC_ST2_ASISDLSO_S2_2S);
		if(dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_ST2_ASISDLSO_D2_2D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=0|R=1|Rm=xxxxx|opcode=xx0|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xDA00000) {
		decode_fields32(ENC_ST2_ASISDLSOP_B2_I2B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==0) OK(ENC_ST2_ASISDLSOP_B2_I2B);
		if(dec->Rm!=0x1f && dec->opcode==0) OK(ENC_ST2_ASISDLSOP_BX2_R2B);
		if(dec->Rm==0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_ST2_ASISDLSOP_H2_I2H);
		if(dec->Rm!=0x1f && dec->opcode==2 && !(dec->size&1)) OK(ENC_ST2_ASISDLSOP_HX2_R2H);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->size==0) OK(ENC_ST2_ASISDLSOP_S2_I2S);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->size==0) OK(ENC_ST2_ASISDLSOP_SX2_R2S);
		if(dec->Rm==0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_ST2_ASISDLSOP_D2_I2D);
		if(dec->Rm!=0x1f && dec->opcode==4 && dec->S==0 && dec->size==1) OK(ENC_ST2_ASISDLSOP_DX2_R2D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* st3_advsimd_mult.xml */
int ST3_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ST3_asisdlse_R3 */
	/* 0|Q=x|0011000|L=0|000000|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xC004000) {
		decode_fields32(ENC_ST3_ASISDLSE_R3, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_ST3_ASISDLSE_R3);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=0100|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xC804000) {
		decode_fields32(ENC_ST3_ASISDLSEP_I3_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_ST3_ASISDLSEP_I3_I);
		if(dec->Rm!=0x1f) OK(ENC_ST3_ASISDLSEP_R3_R);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* st3_advsimd_sngl.xml */
int ST3_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=0|R=0|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD002000) {
		decode_fields32(ENC_ST3_ASISDLSO_B3_3B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==1) OK(ENC_ST3_ASISDLSO_B3_3B);
		if(dec->opcode==3 && !(dec->size&1)) OK(ENC_ST3_ASISDLSO_H3_3H);
		if(dec->opcode==5 && dec->size==0) OK(ENC_ST3_ASISDLSO_S3_3S);
		if(dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_ST3_ASISDLSO_D3_3D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=0|R=0|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xD802000) {
		decode_fields32(ENC_ST3_ASISDLSOP_B3_I3B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==1) OK(ENC_ST3_ASISDLSOP_B3_I3B);
		if(dec->Rm!=0x1f && dec->opcode==1) OK(ENC_ST3_ASISDLSOP_BX3_R3B);
		if(dec->Rm==0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_ST3_ASISDLSOP_H3_I3H);
		if(dec->Rm!=0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_ST3_ASISDLSOP_HX3_R3H);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->size==0) OK(ENC_ST3_ASISDLSOP_S3_I3S);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->size==0) OK(ENC_ST3_ASISDLSOP_SX3_R3S);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_ST3_ASISDLSOP_D3_I3D);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_ST3_ASISDLSOP_DX3_R3D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* st4_advsimd_mult.xml */
int ST4_advsimd_mult(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ST4_asisdlse_R4 */
	/* 0|Q=x|0011000|L=0|000000|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFFF000)==0xC000000) {
		decode_fields32(ENC_ST4_ASISDLSE_R4, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		OK(ENC_ST4_ASISDLSE_R4);
	}
	/* class as_post_index */
	/* 0|Q=x|0011001|L=0|0|Rm=xxxxx|opcode=0000|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE0F000)==0xC800000) {
		decode_fields32(ENC_ST4_ASISDLSEP_I4_I, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f) OK(ENC_ST4_ASISDLSEP_I4_I);
		if(dec->Rm!=0x1f) OK(ENC_ST4_ASISDLSEP_R4_R);
	}
	/* post-decode pcode */
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (UINT(dec->size));
	dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
	if(!dec->opcode) {
		dec->rpt = 1;
		dec->selem = 4;
	}
	else if(dec->opcode==2) {
		dec->rpt = 4;
		dec->selem = 1;
	}
	else if(dec->opcode==4) {
		dec->rpt = 1;
		dec->selem = 3;
	}
	else if(dec->opcode==6) {
		dec->rpt = 3;
		dec->selem = 1;
	}
	else if(dec->opcode==7) {
		dec->rpt = 1;
		dec->selem = 1;
	}
	else if(dec->opcode==8) {
		dec->rpt = 1;
		dec->selem = 2;
	}
	else if(dec->opcode==10) {
		dec->rpt = 2;
		dec->selem = 1;
	}
	else {
		UNDEFINED;
	}
	if(((dec->size<<1)|dec->Q)==6 && dec->selem!=1) {
		UNDEFINED;
	}
	return rc;
}

/* st4_advsimd_sngl.xml */
int ST4_advsimd_sngl(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class as_no_post_index */
	/* 0|Q=x|0011010|L=0|R=1|00000|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFFF2000)==0xD202000) {
		decode_fields32(ENC_ST4_ASISDLSO_B4_4B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = 0;
		dec->wback = FALSE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->opcode==1) OK(ENC_ST4_ASISDLSO_B4_4B);
		if(dec->opcode==3 && !(dec->size&1)) OK(ENC_ST4_ASISDLSO_H4_4H);
		if(dec->opcode==5 && dec->size==0) OK(ENC_ST4_ASISDLSO_S4_4S);
		if(dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_ST4_ASISDLSO_D4_4D);
	}
	/* class as_post_index */
	/* 0|Q=x|0011011|L=0|R=1|Rm=xxxxx|opcode=xx1|S=x|size=xx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE02000)==0xDA02000) {
		decode_fields32(ENC_ST4_ASISDLSOP_B4_I4B, dec);
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->wback = TRUE;
		dec->tag_checked = dec->wback || dec->n!=0x1f;
		if(dec->Rm==0x1f && dec->opcode==1) OK(ENC_ST4_ASISDLSOP_B4_I4B);
		if(dec->Rm!=0x1f && dec->opcode==1) OK(ENC_ST4_ASISDLSOP_BX4_R4B);
		if(dec->Rm==0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_ST4_ASISDLSOP_H4_I4H);
		if(dec->Rm!=0x1f && dec->opcode==3 && !(dec->size&1)) OK(ENC_ST4_ASISDLSOP_HX4_R4H);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->size==0) OK(ENC_ST4_ASISDLSOP_S4_I4S);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->size==0) OK(ENC_ST4_ASISDLSOP_SX4_R4S);
		if(dec->Rm==0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_ST4_ASISDLSOP_D4_I4D);
		if(dec->Rm!=0x1f && dec->opcode==5 && dec->S==0 && dec->size==1) OK(ENC_ST4_ASISDLSOP_DX4_R4D);
	}
	/* post-decode pcode */
	dec->scale = UINT(SLICE(dec->opcode,2,1));
	dec->selem = UINT(((SLICE(dec->opcode,0,0)<<1)|dec->R))+1;
	dec->replicate = FALSE;
	if(dec->scale==3) {
		if(dec->L==0 || dec->S==1) {
			UNDEFINED;
		}
		dec->scale = UINT(dec->size);
		dec->replicate = TRUE;
	}
	else if(dec->scale==0) {
		dec->index = UINT(((dec->Q<<3)|(dec->S<<2)|dec->size));
	}
	else if(dec->scale==1) {
		if(SLICE(dec->size,0,0)==1) {
			UNDEFINED;
		}
		dec->index = UINT(((dec->Q<<2)|(dec->S<<1)|SLICE(dec->size,1,1)));
	}
	else if(dec->scale==2) {
		if(SLICE(dec->size,1,1)==1) {
			UNDEFINED;
		}
		if(SLICE(dec->size,0,0)==0) {
			dec->index = UINT(((dec->Q<<1)|dec->S));
		}
		else {
			if(dec->S==1) {
				UNDEFINED;
			}
			dec->index = UINT(dec->Q);
			dec->scale = 3;
		}
	}
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
	dec->esize = (8) << (dec->scale);
	return rc;
}

/* staddb_ldaddb.xml */
int STADDB_LDADDB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820001F) {
		decode_fields32(ENC_STADDB_LDADDB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STADDB_LDADDB_32_MEMOP);
		if(dec->R==1) OK(ENC_STADDLB_LDADDLB_32_MEMOP);
	}
	return rc;
}

/* staddh_ldaddh.xml */
int STADDH_LDADDH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820001F) {
		decode_fields32(ENC_STADDH_LDADDH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STADDH_LDADDH_32_MEMOP);
		if(dec->R==1) OK(ENC_STADDLH_LDADDLH_32_MEMOP);
	}
	return rc;
}

/* stadd_ldadd.xml */
int STADD_LDADD(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=000|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820001F) {
		decode_fields32(ENC_STADD_LDADD_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STADD_LDADD_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STADDL_LDADDL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STADD_LDADD_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STADDL_LDADDL_64_MEMOP);
	}
	return rc;
}

/* stclrb_ldclrb.xml */
int STCLRB_LDCLRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820101F) {
		decode_fields32(ENC_STCLRB_LDCLRB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STCLRB_LDCLRB_32_MEMOP);
		if(dec->R==1) OK(ENC_STCLRLB_LDCLRLB_32_MEMOP);
	}
	return rc;
}

/* stclrh_ldclrh.xml */
int STCLRH_LDCLRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820101F) {
		decode_fields32(ENC_STCLRH_LDCLRH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STCLRH_LDCLRH_32_MEMOP);
		if(dec->R==1) OK(ENC_STCLRLH_LDCLRLH_32_MEMOP);
	}
	return rc;
}

/* stclr_ldclr.xml */
int STCLR_LDCLR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=001|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820101F) {
		decode_fields32(ENC_STCLR_LDCLR_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STCLR_LDCLR_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STCLRL_LDCLRL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STCLR_LDCLR_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STCLRL_LDCLRL_64_MEMOP);
	}
	return rc;
}

/* steorb_ldeorb.xml */
int STEORB_LDEORB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820201F) {
		decode_fields32(ENC_STEORB_LDEORB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STEORB_LDEORB_32_MEMOP);
		if(dec->R==1) OK(ENC_STEORLB_LDEORLB_32_MEMOP);
	}
	return rc;
}

/* steorh_ldeorh.xml */
int STEORH_LDEORH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820201F) {
		decode_fields32(ENC_STEORH_LDEORH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STEORH_LDEORH_32_MEMOP);
		if(dec->R==1) OK(ENC_STEORLH_LDEORLH_32_MEMOP);
	}
	return rc;
}

/* steor_ldeor.xml */
int STEOR_LDEOR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=010|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820201F) {
		decode_fields32(ENC_STEOR_LDEOR_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STEOR_LDEOR_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STEORL_LDEORL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STEOR_LDEOR_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STEORL_LDEORL_64_MEMOP);
	}
	return rc;
}

/* stg.xml */
int STG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STG_64Spost_ldsttags */
	/* 11011001|opc=00|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9200400) {
		decode_fields32(ENC_STG_64SPOST_LDSTTAGS, dec);
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = TRUE;
		dec->zero_data = FALSE;
		OK(ENC_STG_64SPOST_LDSTTAGS);
	}
	/* class STG_64Spre_ldsttags */
	/* 11011001|opc=00|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9200C00) {
		decode_fields32(ENC_STG_64SPRE_LDSTTAGS, dec);
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = FALSE;
		dec->zero_data = FALSE;
		OK(ENC_STG_64SPRE_LDSTTAGS);
	}
	/* class STG_64Soffset_ldsttags */
	/* 11011001|opc=00|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9200800) {
		decode_fields32(ENC_STG_64SOFFSET_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = FALSE;
		dec->postindex = FALSE;
		dec->zero_data = FALSE;
		OK(ENC_STG_64SOFFSET_LDSTTAGS);
	}
	return rc;
}

/* stgm.xml */
int STGM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STGM_64bulk_ldsttags */
	/* 11011001|opc=10|1|imm9=000000000|op2=00|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xD9A00000) {
		decode_fields32(ENC_STGM_64BULK_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Xt);
		dec->n = UINT(dec->Xn);
		OK(ENC_STGM_64BULK_LDSTTAGS);
	}
	return rc;
}

/* stgp.xml */
int STGP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STGP_64_ldstpair_post */
	/* opc=01|101|V=0|001|L=0|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x68800000) {
		decode_fields32(ENC_STGP_64_LDSTPAIR_POST, dec);
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->t2 = UINT(dec->Xt2);
		dec->offset = LSL(SignExtend(dec->simm7,7),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = TRUE;
		OK(ENC_STGP_64_LDSTPAIR_POST);
	}
	/* class STGP_64_ldstpair_pre */
	/* opc=01|101|V=0|011|L=0|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x69800000) {
		decode_fields32(ENC_STGP_64_LDSTPAIR_PRE, dec);
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->t2 = UINT(dec->Xt2);
		dec->offset = LSL(SignExtend(dec->simm7,7),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = FALSE;
		OK(ENC_STGP_64_LDSTPAIR_PRE);
	}
	/* class STGP_64_ldstpair_off */
	/* opc=01|101|V=0|010|L=0|simm7=xxxxxxx|Xt2=xxxxx|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x69000000) {
		decode_fields32(ENC_STGP_64_LDSTPAIR_OFF, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->t2 = UINT(dec->Xt2);
		dec->offset = LSL(SignExtend(dec->simm7,7),LOG2_TAG_GRANULE);
		dec->writeback = FALSE;
		dec->postindex = FALSE;
		OK(ENC_STGP_64_LDSTPAIR_OFF);
	}
	return rc;
}

/* stllr.xml */
int STLLR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88800000) {
		decode_fields32(ENC_STLLR_SL32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_STLLR_SL32_LDSTEXCL);
		if(dec->size==3) OK(ENC_STLLR_SL64_LDSTEXCL);
	}
	return rc;
}

/* stllrb.xml */
int STLLRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLLRB_SL32_ldstexcl */
	/* size=00|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8800000) {
		decode_fields32(ENC_STLLRB_SL32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STLLRB_SL32_LDSTEXCL);
	}
	return rc;
}

/* stllrh.xml */
int STLLRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLLRH_SL32_ldstexcl */
	/* size=01|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48800000) {
		decode_fields32(ENC_STLLRH_SL32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STLLRH_SL32_LDSTEXCL);
	}
	return rc;
}

/* stlr.xml */
int STLR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88808000) {
		decode_fields32(ENC_STLR_SL32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_STLR_SL32_LDSTEXCL);
		if(dec->size==3) OK(ENC_STLR_SL64_LDSTEXCL);
	}
	return rc;
}

/* stlrb.xml */
int STLRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLRB_SL32_ldstexcl */
	/* size=00|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8808000) {
		decode_fields32(ENC_STLRB_SL32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STLRB_SL32_LDSTEXCL);
	}
	return rc;
}

/* stlrh.xml */
int STLRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLRH_SL32_ldstexcl */
	/* size=01|001000|o2=1|L=0|o1=0|Rs=(1)(1)(1)(1)(1)|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48808000) {
		decode_fields32(ENC_STLRH_SL32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==0) ? AccType_LIMITEDORDERED : AccType_ORDERED;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STLRH_SL32_LDSTEXCL);
	}
	return rc;
}

/* stlurb.xml */
int STLURB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLURB_32_ldapstl_unscaled */
	/* size=00|011001|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x19000000) {
		decode_fields32(ENC_STLURB_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STLURB_32_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stlurh.xml */
int STLURH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLURH_32_ldapstl_unscaled */
	/* size=01|011001|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x59000000) {
		decode_fields32(ENC_STLURH_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STLURH_32_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stlur_gen.xml */
int STLUR_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=1x|011001|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0x99000000) {
		decode_fields32(ENC_STLUR_32_LDAPSTL_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_STLUR_32_LDAPSTL_UNSCALED);
		if(dec->size==3) OK(ENC_STLUR_64_LDAPSTL_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = AccType_ORDERED;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stlxp.xml */
int STLXP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* 1|sz=x|001000|o2=0|L=0|o1=1|Rs=xxxxx|o0=1|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88208000) {
		decode_fields32(ENC_STLXP_SP32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = TRUE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (0x20) << (UINT(dec->sz));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->sz==0) OK(ENC_STLXP_SP32_LDSTEXCL);
		if(dec->sz==1) OK(ENC_STLXP_SP64_LDSTEXCL);
	}
	return rc;
}

/* stlxr.xml */
int STLXR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88008000) {
		decode_fields32(ENC_STLXR_SR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_STLXR_SR32_LDSTEXCL);
		if(dec->size==3) OK(ENC_STLXR_SR64_LDSTEXCL);
	}
	return rc;
}

/* stlxrb.xml */
int STLXRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLXRB_SR32_ldstexcl */
	/* size=00|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8008000) {
		decode_fields32(ENC_STLXRB_SR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STLXRB_SR32_LDSTEXCL);
	}
	return rc;
}

/* stlxrh.xml */
int STLXRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STLXRH_SR32_ldstexcl */
	/* size=01|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=1|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48008000) {
		decode_fields32(ENC_STLXRH_SR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STLXRH_SR32_LDSTEXCL);
	}
	return rc;
}

/* stnp_fpsimd.xml */
int STNP_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_scaled_offset */
	/* opc=xx|101|V=1|000|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2C000000) {
		decode_fields32(ENC_STNP_S_LDSTNAPAIR_OFFS, dec);
		if(dec->opc==0) OK(ENC_STNP_S_LDSTNAPAIR_OFFS);
		if(dec->opc==1) OK(ENC_STNP_D_LDSTNAPAIR_OFFS);
		if(dec->opc==2) OK(ENC_STNP_Q_LDSTNAPAIR_OFFS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_VECSTREAM;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(dec->opc==3) {
		UNDEFINED;
	}
	dec->scale = 2+UINT(dec->opc);
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* stnp_gen.xml */
int STNP_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_scaled_offset */
	/* opc=x0|101|V=0|000|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x28000000) {
		decode_fields32(ENC_STNP_32_LDSTNAPAIR_OFFS, dec);
		if(dec->opc==0) OK(ENC_STNP_32_LDSTNAPAIR_OFFS);
		if(dec->opc==2) OK(ENC_STNP_64_LDSTNAPAIR_OFFS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_STREAM;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(SLICE(dec->opc,0,0)==1) {
		UNDEFINED;
	}
	dec->scale = 2+UINT(SLICE(dec->opc,1,1));
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* stp_fpsimd.xml */
int STP_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* opc=xx|101|V=1|001|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2C800000) {
		decode_fields32(ENC_STP_S_LDSTPAIR_POST, dec);
		if(dec->opc==0) OK(ENC_STP_S_LDSTPAIR_POST);
		if(dec->opc==1) OK(ENC_STP_D_LDSTPAIR_POST);
		if(dec->opc==2) OK(ENC_STP_Q_LDSTPAIR_POST);
	}
	/* class pre_indexed */
	/* opc=xx|101|V=1|011|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2D800000) {
		decode_fields32(ENC_STP_S_LDSTPAIR_PRE, dec);
		if(dec->opc==0) OK(ENC_STP_S_LDSTPAIR_PRE);
		if(dec->opc==1) OK(ENC_STP_D_LDSTPAIR_PRE);
		if(dec->opc==2) OK(ENC_STP_Q_LDSTPAIR_PRE);
	}
	/* class signed_scaled_offset */
	/* opc=xx|101|V=1|010|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3FC00000)==0x2D000000) {
		decode_fields32(ENC_STP_S_LDSTPAIR_OFF, dec);
		if(dec->opc==0) OK(ENC_STP_S_LDSTPAIR_OFF);
		if(dec->opc==1) OK(ENC_STP_D_LDSTPAIR_OFF);
		if(dec->opc==2) OK(ENC_STP_Q_LDSTPAIR_OFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(dec->opc==3) {
		UNDEFINED;
	}
	dec->scale = 2+UINT(dec->opc);
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* stp_gen.xml */
int STP_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* opc=x0|101|V=0|001|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x28800000) {
		decode_fields32(ENC_STP_32_LDSTPAIR_POST, dec);
		if(dec->opc==0) OK(ENC_STP_32_LDSTPAIR_POST);
		if(dec->opc==2) OK(ENC_STP_64_LDSTPAIR_POST);
	}
	/* class pre_indexed */
	/* opc=x0|101|V=0|011|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x29800000) {
		decode_fields32(ENC_STP_32_LDSTPAIR_PRE, dec);
		if(dec->opc==0) OK(ENC_STP_32_LDSTPAIR_PRE);
		if(dec->opc==2) OK(ENC_STP_64_LDSTPAIR_PRE);
	}
	/* class signed_scaled_offset */
	/* opc=x0|101|V=0|010|L=0|imm7=xxxxxxx|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x7FC00000)==0x29000000) {
		decode_fields32(ENC_STP_32_LDSTPAIR_OFF, dec);
		if(dec->opc==0) OK(ENC_STP_32_LDSTPAIR_OFF);
		if(dec->opc==2) OK(ENC_STP_64_LDSTPAIR_OFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->t2 = UINT(dec->Rt2);
	dec->acctype = dec->AccType_NORMAL;
	dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
	if(((dec->L<<1)|SLICE(dec->opc,0,0))==1 || dec->opc==3) {
		UNDEFINED;
	}
	dec->signed_ = (SLICE(dec->opc,0,0)!=0);
	dec->scale = 2+UINT(SLICE(dec->opc,1,1));
	dec->datasize = (8) << (dec->scale);
	dec->offset = LSL(SignExtend(dec->imm7,7),dec->scale);
	dec->tag_checked = dec->wback || dec->n!=0x1f;
	return rc;
}

/* strb_imm.xml */
int STRB_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STRB_32_ldst_immpost */
	/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38000400) {
		decode_fields32(ENC_STRB_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STRB_32_LDST_IMMPOST);
	}
	/* class STRB_32_ldst_immpre */
	/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38000C00) {
		decode_fields32(ENC_STRB_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STRB_32_LDST_IMMPRE);
	}
	/* class STRB_32_ldst_pos */
	/* size=00|111|V=0|01|opc=00|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x39000000) {
		decode_fields32(ENC_STRB_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		OK(ENC_STRB_32_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* strb_reg.xml */
int STRB_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class 32 */
	/* size=00|111|V=0|00|opc=00|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38200800) {
		decode_fields32(ENC_STRB_32B_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->option!=3) OK(ENC_STRB_32B_LDST_REGOFF);
		if(dec->option==3) OK(ENC_STRB_32BL_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* strh_imm.xml */
int STRH_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STRH_32_ldst_immpost */
	/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78000400) {
		decode_fields32(ENC_STRH_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STRH_32_LDST_IMMPOST);
	}
	/* class STRH_32_ldst_immpre */
	/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78000C00) {
		decode_fields32(ENC_STRH_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STRH_32_LDST_IMMPRE);
	}
	/* class STRH_32_ldst_pos */
	/* size=01|111|V=0|01|opc=00|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFC00000)==0x79000000) {
		decode_fields32(ENC_STRH_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		OK(ENC_STRH_32_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* strh_reg.xml */
int STRH_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STRH_32_ldst_regoff */
	/* size=01|111|V=0|00|opc=00|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78200800) {
		decode_fields32(ENC_STRH_32_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		OK(ENC_STRH_32_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* str_imm_fpsimd.xml */
int STR_imm_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* size=xx|111|V=1|00|opc=x0|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C000400) {
		decode_fields32(ENC_STR_B_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==0 && dec->opc==0) OK(ENC_STR_B_LDST_IMMPOST);
		if(dec->size==1 && dec->opc==0) OK(ENC_STR_H_LDST_IMMPOST);
		if(dec->size==2 && dec->opc==0) OK(ENC_STR_S_LDST_IMMPOST);
		if(dec->size==3 && dec->opc==0) OK(ENC_STR_D_LDST_IMMPOST);
		if(dec->size==0 && dec->opc==2) OK(ENC_STR_Q_LDST_IMMPOST);
	}
	/* class pre_indexed */
	/* size=xx|111|V=1|00|opc=x0|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C000C00) {
		decode_fields32(ENC_STR_B_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==0 && dec->opc==0) OK(ENC_STR_B_LDST_IMMPRE);
		if(dec->size==1 && dec->opc==0) OK(ENC_STR_H_LDST_IMMPRE);
		if(dec->size==2 && dec->opc==0) OK(ENC_STR_S_LDST_IMMPRE);
		if(dec->size==3 && dec->opc==0) OK(ENC_STR_D_LDST_IMMPRE);
		if(dec->size==0 && dec->opc==2) OK(ENC_STR_Q_LDST_IMMPRE);
	}
	/* class unsigned_scaled_offset */
	/* size=xx|111|V=1|01|opc=x0|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F400000)==0x3D000000) {
		decode_fields32(ENC_STR_B_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		if(dec->size==0 && dec->opc==0) OK(ENC_STR_B_LDST_POS);
		if(dec->size==1 && dec->opc==0) OK(ENC_STR_H_LDST_POS);
		if(dec->size==2 && dec->opc==0) OK(ENC_STR_S_LDST_POS);
		if(dec->size==3 && dec->opc==0) OK(ENC_STR_D_LDST_POS);
		if(dec->size==0 && dec->opc==2) OK(ENC_STR_Q_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (SLICE(dec->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* str_imm_gen.xml */
int STR_imm_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class post_indexed */
	/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|01|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8000400) {
		decode_fields32(ENC_STR_32_LDST_IMMPOST, dec);
		dec->wback = TRUE;
		dec->postindex = TRUE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_STR_32_LDST_IMMPOST);
		if(dec->size==3) OK(ENC_STR_64_LDST_IMMPOST);
	}
	/* class pre_indexed */
	/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|11|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8000C00) {
		decode_fields32(ENC_STR_32_LDST_IMMPRE, dec);
		dec->wback = TRUE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_STR_32_LDST_IMMPRE);
		if(dec->size==3) OK(ENC_STR_64_LDST_IMMPRE);
	}
	/* class unsigned_scaled_offset */
	/* size=1x|111|V=0|01|opc=00|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFC00000)==0xB9000000) {
		decode_fields32(ENC_STR_32_LDST_POS, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = LSL(ZeroExtend(dec->imm12,0x40),dec->scale);
		if(dec->size==2) OK(ENC_STR_32_LDST_POS);
		if(dec->size==3) OK(ENC_STR_64_LDST_POS);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* str_reg_fpsimd.xml */
int STR_reg_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fpsimd */
	/* size=xx|111|V=1|00|opc=x0|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C200800) {
		decode_fields32(ENC_STR_B_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->size==0 && dec->opc==0 && dec->option!=3) OK(ENC_STR_B_LDST_REGOFF);
		if(dec->size==0 && dec->opc==0 && dec->option==3) OK(ENC_STR_BL_LDST_REGOFF);
		if(dec->size==1 && dec->opc==0) OK(ENC_STR_H_LDST_REGOFF);
		if(dec->size==2 && dec->opc==0) OK(ENC_STR_S_LDST_REGOFF);
		if(dec->size==3 && dec->opc==0) OK(ENC_STR_D_LDST_REGOFF);
		if(dec->size==0 && dec->opc==2) OK(ENC_STR_Q_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (SLICE(dec->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* str_reg_gen.xml */
int STR_reg_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|opc=00|1|Rm=xxxxx|option=xxx|S=x|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8200800) {
		decode_fields32(ENC_STR_32_LDST_REGOFF, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		if(SLICE(dec->option,1,1)==0) {
			UNDEFINED;
		}
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = (dec->S==1) ? dec->scale : 0;
		if(dec->size==2) OK(ENC_STR_32_LDST_REGOFF);
		if(dec->size==3) OK(ENC_STR_64_LDST_REGOFF);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->m = UINT(dec->Rm);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH;
	return rc;
}

/* stsetb_ldsetb.xml */
int STSETB_LDSETB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820301F) {
		decode_fields32(ENC_STSETB_LDSETB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STSETB_LDSETB_32_MEMOP);
		if(dec->R==1) OK(ENC_STSETLB_LDSETLB_32_MEMOP);
	}
	return rc;
}

/* stseth_ldseth.xml */
int STSETH_LDSETH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820301F) {
		decode_fields32(ENC_STSETH_LDSETH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STSETH_LDSETH_32_MEMOP);
		if(dec->R==1) OK(ENC_STSETLH_LDSETLH_32_MEMOP);
	}
	return rc;
}

/* stset_ldset.xml */
int STSET_LDSET(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=011|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820301F) {
		decode_fields32(ENC_STSET_LDSET_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STSET_LDSET_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STSETL_LDSETL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STSET_LDSET_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STSETL_LDSETL_64_MEMOP);
	}
	return rc;
}

/* stsmaxb_ldsmaxb.xml */
int STSMAXB_LDSMAXB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820401F) {
		decode_fields32(ENC_STSMAXB_LDSMAXB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STSMAXB_LDSMAXB_32_MEMOP);
		if(dec->R==1) OK(ENC_STSMAXLB_LDSMAXLB_32_MEMOP);
	}
	return rc;
}

/* stsmaxh_ldsmaxh.xml */
int STSMAXH_LDSMAXH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820401F) {
		decode_fields32(ENC_STSMAXH_LDSMAXH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STSMAXH_LDSMAXH_32_MEMOP);
		if(dec->R==1) OK(ENC_STSMAXLH_LDSMAXLH_32_MEMOP);
	}
	return rc;
}

/* stsmax_ldsmax.xml */
int STSMAX_LDSMAX(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=100|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820401F) {
		decode_fields32(ENC_STSMAX_LDSMAX_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STSMAX_LDSMAX_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STSMAXL_LDSMAXL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STSMAX_LDSMAX_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STSMAXL_LDSMAXL_64_MEMOP);
	}
	return rc;
}

/* stsminb_ldsminb.xml */
int STSMINB_LDSMINB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820501F) {
		decode_fields32(ENC_STSMINB_LDSMINB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STSMINB_LDSMINB_32_MEMOP);
		if(dec->R==1) OK(ENC_STSMINLB_LDSMINLB_32_MEMOP);
	}
	return rc;
}

/* stsminh_ldsminh.xml */
int STSMINH_LDSMINH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820501F) {
		decode_fields32(ENC_STSMINH_LDSMINH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STSMINH_LDSMINH_32_MEMOP);
		if(dec->R==1) OK(ENC_STSMINLH_LDSMINLH_32_MEMOP);
	}
	return rc;
}

/* stsmin_ldsmin.xml */
int STSMIN_LDSMIN(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=101|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820501F) {
		decode_fields32(ENC_STSMIN_LDSMIN_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STSMIN_LDSMIN_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STSMINL_LDSMINL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STSMIN_LDSMIN_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STSMINL_LDSMINL_64_MEMOP);
	}
	return rc;
}

/* sttr.xml */
int STTR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8000800) {
		decode_fields32(ENC_STTR_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_STTR_32_LDST_UNPRIV);
		if(dec->size==3) OK(ENC_STTR_64_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* sttrb.xml */
int STTRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STTRB_32_ldst_unpriv */
	/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38000800) {
		decode_fields32(ENC_STTRB_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STTRB_32_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* sttrh.xml */
int STTRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STTRH_32_ldst_unpriv */
	/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|10|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78000800) {
		decode_fields32(ENC_STTRH_32_LDST_UNPRIV, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STTRH_32_LDST_UNPRIV);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->unpriv_at_el1 = ctx->pstate_el==EL1 && !(EL2Enabled() && HaveNVExt() && CONCAT(dec->HCR_EL2_NV,dec->HCR_EL2_NV1,1)==3);
	dec->unpriv_at_el2 = ctx->pstate_el==EL2 && HaveVirtHostExt() && CONCAT(dec->HCR_EL2_E2H,dec->HCR_EL2_TGE,1)==3;
	dec->user_access_override = HaveUAOExt() && ctx->pstate_uao==1;
	if(!dec->user_access_override && (dec->unpriv_at_el1 || dec->unpriv_at_el2)) {
		dec->acctype = dec->AccType_UNPRIV;
	}
	else {
		dec->acctype = dec->AccType_NORMAL;
	}
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			UNDEFINED;
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stumaxb_ldumaxb.xml */
int STUMAXB_LDUMAXB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820601F) {
		decode_fields32(ENC_STUMAXB_LDUMAXB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STUMAXB_LDUMAXB_32_MEMOP);
		if(dec->R==1) OK(ENC_STUMAXLB_LDUMAXLB_32_MEMOP);
	}
	return rc;
}

/* stumaxh_ldumaxh.xml */
int STUMAXH_LDUMAXH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820601F) {
		decode_fields32(ENC_STUMAXH_LDUMAXH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STUMAXH_LDUMAXH_32_MEMOP);
		if(dec->R==1) OK(ENC_STUMAXLH_LDUMAXLH_32_MEMOP);
	}
	return rc;
}

/* stumax_ldumax.xml */
int STUMAX_LDUMAX(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=110|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820601F) {
		decode_fields32(ENC_STUMAX_LDUMAX_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STUMAX_LDUMAX_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STUMAXL_LDUMAXL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STUMAX_LDUMAX_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STUMAXL_LDUMAXL_64_MEMOP);
	}
	return rc;
}

/* stuminb_lduminb.xml */
int STUMINB_LDUMINB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x3820701F) {
		decode_fields32(ENC_STUMINB_LDUMINB_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STUMINB_LDUMINB_32_MEMOP);
		if(dec->R==1) OK(ENC_STUMINLB_LDUMINLB_32_MEMOP);
	}
	return rc;
}

/* stuminh_lduminh.xml */
int STUMINH_LDUMINH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xFFA0FC1F)==0x7820701F) {
		decode_fields32(ENC_STUMINH_LDUMINH_32_MEMOP, dec);
		if(dec->R==0) OK(ENC_STUMINH_LDUMINH_32_MEMOP);
		if(dec->R==1) OK(ENC_STUMINLH_LDUMINLH_32_MEMOP);
	}
	return rc;
}

/* stumin_ldumin.xml */
int STUMIN_LDUMIN(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=0|R=x|1|Rs=xxxxx|o3=0|opc=111|00|Rn=xxxxx|Rt=11111 */
	if((INSWORD & 0xBFA0FC1F)==0xB820701F) {
		decode_fields32(ENC_STUMIN_LDUMIN_32_MEMOP, dec);
		if(dec->size==2 && dec->R==0) OK(ENC_STUMIN_LDUMIN_32_MEMOP);
		if(dec->size==2 && dec->R==1) OK(ENC_STUMINL_LDUMINL_32_MEMOP);
		if(dec->size==3 && dec->R==0) OK(ENC_STUMIN_LDUMIN_64_MEMOP);
		if(dec->size==3 && dec->R==1) OK(ENC_STUMINL_LDUMINL_64_MEMOP);
	}
	return rc;
}

/* sturb.xml */
int STURB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STURB_32_ldst_unscaled */
	/* size=00|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x38000000) {
		decode_fields32(ENC_STURB_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STURB_32_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* sturh.xml */
int STURH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STURH_32_ldst_unscaled */
	/* size=01|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0x78000000) {
		decode_fields32(ENC_STURH_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		OK(ENC_STURH_32_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stur_fpsimd.xml */
int STUR_fpsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=xx|111|V=1|00|opc=x0|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0x3F600C00)==0x3C000000) {
		decode_fields32(ENC_STUR_B_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(((SLICE(dec->opc,1,1)<<2)|dec->size));
		if(dec->scale>4) {
			UNDEFINED;
		}
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==0 && dec->opc==0) OK(ENC_STUR_B_LDST_UNSCALED);
		if(dec->size==1 && dec->opc==0) OK(ENC_STUR_H_LDST_UNSCALED);
		if(dec->size==2 && dec->opc==0) OK(ENC_STUR_S_LDST_UNSCALED);
		if(dec->size==3 && dec->opc==0) OK(ENC_STUR_D_LDST_UNSCALED);
		if(dec->size==0 && dec->opc==2) OK(ENC_STUR_Q_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_VEC;
	dec->memop = (SLICE(dec->opc,0,0)==1) ? MemOp_LOAD : MemOp_STORE;
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stur_gen.xml */
int STUR_gen(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_plus_offset */
	/* size=1x|111|V=0|00|opc=00|0|imm9=xxxxxxxxx|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE00C00)==0xB8000000) {
		decode_fields32(ENC_STUR_32_LDST_UNSCALED, dec);
		dec->wback = FALSE;
		dec->postindex = FALSE;
		dec->scale = UINT(dec->size);
		dec->offset = SignExtend(dec->imm9,9);
		if(dec->size==2) OK(ENC_STUR_32_LDST_UNSCALED);
		if(dec->size==3) OK(ENC_STUR_64_LDST_UNSCALED);
	}
	/* post-decode pcode */
	dec->n = UINT(dec->Rn);
	dec->t = UINT(dec->Rt);
	dec->acctype = dec->AccType_NORMAL;
	if(SLICE(dec->opc,1,1)==0) {
		if(SLICE(dec->opc,0,0)==1) {
			dec->memop = MemOp_LOAD;
		};
		if(dec->size==3) {
			dec->regsize = 0x40;
		};
		dec->signed_ = FALSE;
	}
	else {
		if(dec->size==3) {
			dec->memop = MemOp_PREFETCH;
			if(SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
		}
		else {
			dec->memop = MemOp_LOAD;
			if(dec->size==2 && SLICE(dec->opc,0,0)==1) {
				UNDEFINED;
			}
			if(SLICE(dec->opc,0,0)==1) {
				dec->regsize = 0x20;
			};
			dec->signed_ = TRUE;
		}
	}
	dec->datasize = (8) << (dec->scale);
	dec->tag_checked = dec->memop!=MemOp_PREFETCH && (dec->wback || dec->n!=0x1f);
	return rc;
}

/* stxp.xml */
int STXP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* 1|sz=x|001000|o2=0|L=0|o1=1|Rs=xxxxx|o0=0|Rt2=xxxxx|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88200000) {
		decode_fields32(ENC_STXP_SP32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = TRUE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (0x20) << (UINT(dec->sz));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->sz==0) OK(ENC_STXP_SP32_LDSTEXCL);
		if(dec->sz==1) OK(ENC_STXP_SP64_LDSTEXCL);
	}
	return rc;
}

/* stxr.xml */
int STXR(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class base_register */
	/* size=1x|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBFE08000)==0x88000000) {
		decode_fields32(ENC_STXR_SR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2) OK(ENC_STXR_SR32_LDSTEXCL);
		if(dec->size==3) OK(ENC_STXR_SR64_LDSTEXCL);
	}
	return rc;
}

/* stxrb.xml */
int STXRB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STXRB_SR32_ldstexcl */
	/* size=00|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x8000000) {
		decode_fields32(ENC_STXRB_SR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STXRB_SR32_LDSTEXCL);
	}
	return rc;
}

/* stxrh.xml */
int STXRH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STXRH_SR32_ldstexcl */
	/* size=01|001000|o2=0|L=0|o1=0|Rs=xxxxx|o0=0|Rt2=(1)(1)(1)(1)(1)|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFFE08000)==0x48000000) {
		decode_fields32(ENC_STXRH_SR32_LDSTEXCL, dec);
		dec->n = UINT(dec->Rn);
		dec->t = UINT(dec->Rt);
		dec->t2 = UINT(dec->Rt2);
		dec->s = UINT(dec->Rs);
		dec->acctype = (dec->o0==1) ? AccType_ORDEREDATOMIC : AccType_ATOMIC;
		dec->pair = FALSE;
		dec->memop = (dec->L==1) ? MemOp_LOAD : MemOp_STORE;
		dec->elsize = (8) << (UINT(dec->size));
		dec->regsize = (dec->elsize==0x40) ? 0x40 : 0x20;
		dec->datasize = (dec->pair) ? (dec->elsize) * (2) : dec->elsize;
		dec->tag_checked = dec->n!=0x1f;
		OK(ENC_STXRH_SR32_LDSTEXCL);
	}
	return rc;
}

/* stz2g.xml */
int STZ2G(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STZ2G_64Spost_ldsttags */
	/* 11011001|opc=11|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9E00400) {
		decode_fields32(ENC_STZ2G_64SPOST_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = TRUE;
		dec->zero_data = TRUE;
		OK(ENC_STZ2G_64SPOST_LDSTTAGS);
	}
	/* class STZ2G_64Spre_ldsttags */
	/* 11011001|opc=11|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9E00C00) {
		decode_fields32(ENC_STZ2G_64SPRE_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = FALSE;
		dec->zero_data = TRUE;
		OK(ENC_STZ2G_64SPRE_LDSTTAGS);
	}
	/* class STZ2G_64Soffset_ldsttags */
	/* 11011001|opc=11|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9E00800) {
		decode_fields32(ENC_STZ2G_64SOFFSET_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = FALSE;
		dec->postindex = FALSE;
		dec->zero_data = TRUE;
		OK(ENC_STZ2G_64SOFFSET_LDSTTAGS);
	}
	return rc;
}

/* stzg.xml */
int STZG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STZG_64Spost_ldsttags */
	/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=01|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9600400) {
		decode_fields32(ENC_STZG_64SPOST_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = TRUE;
		dec->zero_data = TRUE;
		OK(ENC_STZG_64SPOST_LDSTTAGS);
	}
	/* class STZG_64Spre_ldsttags */
	/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=11|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9600C00) {
		decode_fields32(ENC_STZG_64SPRE_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = TRUE;
		dec->postindex = FALSE;
		dec->zero_data = TRUE;
		OK(ENC_STZG_64SPRE_LDSTTAGS);
	}
	/* class STZG_64Soffset_ldsttags */
	/* 11011001|opc=01|1|imm9=xxxxxxxxx|op2=10|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFE00C00)==0xD9600800) {
		decode_fields32(ENC_STZG_64SOFFSET_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Xn);
		dec->t = UINT(dec->Xt);
		dec->offset = LSL(SignExtend(dec->imm9,9),LOG2_TAG_GRANULE);
		dec->writeback = FALSE;
		dec->postindex = FALSE;
		dec->zero_data = TRUE;
		OK(ENC_STZG_64SOFFSET_LDSTTAGS);
	}
	return rc;
}

/* stzgm.xml */
int STZGM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class STZGM_64bulk_ldsttags */
	/* 11011001|opc=00|1|imm9=000000000|op2=00|Xn=xxxxx|Xt=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0xD9200000) {
		decode_fields32(ENC_STZGM_64BULK_LDSTTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Xt);
		dec->n = UINT(dec->Xn);
		OK(ENC_STZGM_64BULK_LDSTTAGS);
	}
	return rc;
}

/* subg.xml */
int SUBG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUBG_64_addsub_immtags */
	/* sf=1|op=1|S=0|100011|o2=0|uimm6=xxxxxx|op3=(0)(0)|uimm4=xxxx|Xn=xxxxx|Xd=xxxxx */
	if((INSWORD & 0xFFC00000)==0xD1800000) {
		decode_fields32(ENC_SUBG_64_ADDSUB_IMMTAGS, dec);
		if(!HaveMTEExt()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Xd);
		dec->n = UINT(dec->Xn);
		dec->tag_offset = dec->uimm4;
		dec->offset = LSL(ZeroExtend(dec->uimm6,0x40),LOG2_TAG_GRANULE);
		dec->ADD = FALSE;
		OK(ENC_SUBG_64_ADDSUB_IMMTAGS);
	}
	return rc;
}

/* subhn_advsimd.xml */
int SUBHN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUBHN_asimddiff_N */
	/* 0|Q=x|U=0|01110|size=xx|1|Rm=xxxxx|01|o1=1|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE206000) {
		decode_fields32(ENC_SUBHN_ASIMDDIFF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->round = (dec->U==1);
		OK(ENC_SUBHN_ASIMDDIFF_N);
	}
	return rc;
}

/* subp.xml */
int SUBP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUBP_64S_dp_2src */
	/* sf=1|0|S=0|11010110|Xm=xxxxx|opcode=000000|Xn=xxxxx|Xd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9AC00000) {
		decode_fields32(ENC_SUBP_64S_DP_2SRC, dec);
		dec->d = UINT(dec->Xd);
		dec->n = UINT(dec->Xn);
		dec->m = UINT(dec->Xm);
		dec->setflags = FALSE;
		OK(ENC_SUBP_64S_DP_2SRC);
	}
	return rc;
}

/* subps.xml */
int SUBPS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUBPS_64S_dp_2src */
	/* sf=1|0|S=1|11010110|Xm=xxxxx|opcode=000000|Xn=xxxxx|Xd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0xBAC00000) {
		decode_fields32(ENC_SUBPS_64S_DP_2SRC, dec);
		dec->d = UINT(dec->Xd);
		dec->n = UINT(dec->Xn);
		dec->m = UINT(dec->Xm);
		dec->setflags = TRUE;
		/* regular aliases */
		if(dec->S==1 && dec->Xd==0x1f) return CMPP_SUBPS(ctx, dec);
		OK(ENC_SUBPS_64S_DP_2SRC);
	}
	return rc;
}

/* subs_addsub_ext.xml */
int SUBS_addsub_ext(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00000)==0x6B200000) {
		decode_fields32(ENC_SUBS_32S_ADDSUB_EXT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = UINT(dec->imm3);
		if(dec->shift>4) {
			UNDEFINED;
		}
		/* regular aliases */
		if(dec->Rd==0x1f) return CMP_SUBS_addsub_ext(ctx, dec);
		if(dec->sf==0) OK(ENC_SUBS_32S_ADDSUB_EXT);
		if(dec->sf==1) OK(ENC_SUBS_64S_ADDSUB_EXT);
	}
	return rc;
}

/* subs_addsub_imm.xml */
int SUBS_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x71000000) {
		decode_fields32(ENC_SUBS_32S_ADDSUB_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(!dec->sh) {
			dec->imm = ZeroExtend(dec->imm12,dec->datasize);
		}
		else if(dec->sh) {
			dec->imm = ZeroExtend(((dec->imm12<<12)|0),dec->datasize);
		}
		/* regular aliases */
		if(dec->Rd==0x1f) return CMP_SUBS_addsub_imm(ctx, dec);
		if(dec->sf==0) OK(ENC_SUBS_32S_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_SUBS_64S_ADDSUB_IMM);
	}
	return rc;
}

/* subs_addsub_shift.xml */
int SUBS_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|op=1|S=1|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x6B000000) {
		decode_fields32(ENC_SUBS_32_ADDSUB_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(dec->shift==3) {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		/* regular aliases */
		if(dec->Rd==0x1f) return CMP_SUBS_addsub_shift(ctx, dec);
		if(dec->Rn==0x1f) return NEGS_SUBS_addsub_shift(ctx, dec);
		if(dec->sf==0) OK(ENC_SUBS_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_SUBS_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* sub_addsub_ext.xml */
int SUB_addsub_ext(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=1|S=0|01011|opt=00|1|Rm=xxxxx|option=xxx|imm3=xxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE00000)==0x4B200000) {
		decode_fields32(ENC_SUB_32_ADDSUB_EXT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		dec->extend_type = DecodeRegExtend(dec->option);
		dec->shift = UINT(dec->imm3);
		if(dec->shift>4) {
			UNDEFINED;
		}
		if(dec->sf==0) OK(ENC_SUB_32_ADDSUB_EXT);
		if(dec->sf==1) OK(ENC_SUB_64_ADDSUB_EXT);
	}
	return rc;
}

/* sub_addsub_imm.xml */
int SUB_addsub_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=1|S=0|100010|sh=x|imm12=xxxxxxxxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x51000000) {
		decode_fields32(ENC_SUB_32_ADDSUB_IMM, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(!dec->sh) {
			dec->imm = ZeroExtend(dec->imm12,dec->datasize);
		}
		else if(dec->sh) {
			dec->imm = ZeroExtend(((dec->imm12<<12)|0),dec->datasize);
		}
		if(dec->sf==0) OK(ENC_SUB_32_ADDSUB_IMM);
		if(dec->sf==1) OK(ENC_SUB_64_ADDSUB_IMM);
	}
	return rc;
}

/* sub_addsub_shift.xml */
int SUB_addsub_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class no_s */
	/* sf=x|op=1|S=0|01011|shift=xx|0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F200000)==0x4B000000) {
		decode_fields32(ENC_SUB_32_ADDSUB_SHIFT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->sub_op = (dec->op==1);
		dec->setflags = (dec->S==1);
		if(dec->shift==3) {
			UNDEFINED;
		}
		if(dec->sf==0 && SLICE(dec->imm6,5,5)==1) {
			UNDEFINED;
		}
		dec->shift_type = DecodeShift(dec->shift);
		dec->shift_amount = UINT(dec->imm6);
		/* regular aliases */
		if(dec->Rn==0x1f) return NEG_SUB_addsub_shift(ctx, dec);
		if(dec->sf==0) OK(ENC_SUB_32_ADDSUB_SHIFT);
		if(dec->sf==1) OK(ENC_SUB_64_ADDSUB_SHIFT);
	}
	return rc;
}

/* sub_advsimd.xml */
int SUB_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUB_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E208400) {
		decode_fields32(ENC_SUB_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->sub_op = (dec->U==1);
		OK(ENC_SUB_ASISDSAME_ONLY);
	}
	/* class SUB_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=10000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E208400) {
		decode_fields32(ENC_SUB_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->U==1);
		OK(ENC_SUB_ASIMDSAME_ONLY);
	}
	return rc;
}

/* sudot_advsimd_elt.xml */
int SUDOT_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUDOT_asimdelem_D */
	/* 0|Q=x|U=0|01111|US=0|0|L=x|M=x|Rm=xxxx|opcode=1111|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF00F000) {
		decode_fields32(ENC_SUDOT_ASIMDELEM_D, dec);
		if(!HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->op1_unsigned = (dec->US==1);
		dec->op2_unsigned = (dec->US==0);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->M<<4)|dec->Rm));
		dec->d = UINT(dec->Rd);
		dec->i = UINT(((dec->H<<1)|dec->L));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((0x20) ? ((dec->datasize) / (0x20)) : 0);
		OK(ENC_SUDOT_ASIMDELEM_D);
	}
	return rc;
}

/* suqadd_advsimd.xml */
int SUQADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SUQADD_asisdmisc_R */
	/* 01|U=0|11110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5E203800) {
		decode_fields32(ENC_SUQADD_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SUQADD_ASISDMISC_R);
	}
	/* class SUQADD_asimdmisc_R */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE203800) {
		decode_fields32(ENC_SUQADD_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_SUQADD_ASIMDMISC_R);
	}
	return rc;
}

/* svc.xml */
int SVC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SVC_EX_exception */
	/* 11010100|opc=000|imm16=xxxxxxxxxxxxxxxx|op2=000|LL=01 */
	if((INSWORD & 0xFFE0001F)==0xD4000001) {
		decode_fields32(ENC_SVC_EX_EXCEPTION, dec);
		OK(ENC_SVC_EX_EXCEPTION);
	}
	return rc;
}

/* swp.xml */
int SWP(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=1x|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=1|opc=000|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xB8208000) {
		decode_fields32(ENC_SWP_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->size==2 && dec->A==0 && dec->R==0) OK(ENC_SWP_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==0) OK(ENC_SWPA_32_MEMOP);
		if(dec->size==2 && dec->A==1 && dec->R==1) OK(ENC_SWPAL_32_MEMOP);
		if(dec->size==2 && dec->A==0 && dec->R==1) OK(ENC_SWPL_32_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==0) OK(ENC_SWP_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==0) OK(ENC_SWPA_64_MEMOP);
		if(dec->size==3 && dec->A==1 && dec->R==1) OK(ENC_SWPAL_64_MEMOP);
		if(dec->size==3 && dec->A==0 && dec->R==1) OK(ENC_SWPL_64_MEMOP);
	}
	return rc;
}

/* swpb.xml */
int SWPB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=00|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=1|opc=000|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x38208000) {
		decode_fields32(ENC_SWPAB_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->A==1 && dec->R==0) OK(ENC_SWPAB_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_SWPALB_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_SWPB_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_SWPLB_32_MEMOP);
	}
	return rc;
}

/* swph.xml */
int SWPH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* size=01|111|V=0|00|A=x|R=x|1|Rs=xxxxx|o3=1|opc=000|00|Rn=xxxxx|Rt=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x78208000) {
		decode_fields32(ENC_SWPAH_32_MEMOP, dec);
		if(!HaveAtomicExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Rt);
		dec->n = UINT(dec->Rn);
		dec->s = UINT(dec->Rs);
		dec->datasize = (8) << (UINT(dec->size));
		dec->regsize = (dec->datasize==0x40) ? 0x40 : 0x20;
		dec->ldacctype = (dec->A==1 && dec->Rt!=0x1f) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->stacctype = (dec->R==1) ? AccType_ORDEREDATOMICRW : AccType_ATOMICRW;
		dec->tag_checked = dec->n!=0x1f;
		if(dec->A==1 && dec->R==0) OK(ENC_SWPAH_32_MEMOP);
		if(dec->A==1 && dec->R==1) OK(ENC_SWPALH_32_MEMOP);
		if(dec->A==0 && dec->R==0) OK(ENC_SWPH_32_MEMOP);
		if(dec->A==0 && dec->R==1) OK(ENC_SWPLH_32_MEMOP);
	}
	return rc;
}

/* sxtb_sbfm.xml */
int SXTB_SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=x|opc=00|100110|N=x|immr=000000|imms=000111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FBFFC00)==0x13001C00) {
		decode_fields32(ENC_SXTB_SBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_SXTB_SBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_SXTB_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* sxth_sbfm.xml */
int SXTH_SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=x|opc=00|100110|N=x|immr=000000|imms=001111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FBFFC00)==0x13003C00) {
		decode_fields32(ENC_SXTH_SBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_SXTH_SBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_SXTH_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* sxtl_sshll_advsimd.xml */
int SXTL_SSHLL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SSHLL_asimdshf_L */
	/* 0|Q=x|U=0|011110|immh!=0000|immb=000|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF87FC00)==0xF00A400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_SXTL_SSHLL_ASIMDSHF_L, dec);
		OK(ENC_SXTL_SSHLL_ASIMDSHF_L);
	}
	return rc;
}

/* sxtw_sbfm.xml */
int SXTW_SBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class signed_fill */
	/* sf=1|opc=00|100110|N=1|immr=000000|imms=011111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x93407C00) {
		decode_fields32(ENC_SXTW_SBFM_64M_BITFIELD, dec);
		OK(ENC_SXTW_SBFM_64M_BITFIELD);
	}
	return rc;
}

/* sys.xml */
int SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF80000)==0xD5080000) {
		decode_fields32(ENC_SYS_CR_SYSTEMINSTRS, dec);
		CheckSystemAccess(1,dec->op1,dec->CRn,dec->CRm,dec->op2,dec->Rt,dec->L);
		dec->t = UINT(dec->Rt);
		dec->sys_op0 = 1;
		dec->sys_op1 = UINT(dec->op1);
		dec->sys_op2 = UINT(dec->op2);
		dec->sys_crn = UINT(dec->CRn);
		dec->sys_crm = UINT(dec->CRm);
		dec->has_result = (dec->L==1);
		/* regular aliases */
		if(dec->CRn==7 && (dec->CRm&14)==8 && SysOp(dec->op1,7,dec->CRm,dec->op2)==Sys_AT) return AT_SYS(ctx, dec);
		if(dec->op1==3 && dec->CRn==7 && dec->CRm==3 && dec->op2==4) return CFP_SYS(ctx, dec);
		if(dec->op1==3 && dec->CRn==7 && dec->CRm==3 && dec->op2==7) return CPP_SYS(ctx, dec);
		if(dec->CRn==7 && SysOp(dec->op1,7,dec->CRm,dec->op2)==Sys_DC) return DC_SYS(ctx, dec);
		if(dec->op1==3 && dec->CRn==7 && dec->CRm==3 && dec->op2==5) return DVP_SYS(ctx, dec);
		if(dec->CRn==7 && SysOp(dec->op1,7,dec->CRm,dec->op2)==Sys_IC) return IC_SYS(ctx, dec);
		if(dec->CRn==8 && SysOp(dec->op1,8,dec->CRm,dec->op2)==Sys_TLBI) return TLBI_SYS(ctx, dec);
		OK(ENC_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* sysl.xml */
int SYSL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYSL_RC_systeminstrs */
	/* 1101010100|L=1|op0=01|op1=xxx|CRn=xxxx|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF80000)==0xD5280000) {
		decode_fields32(ENC_SYSL_RC_SYSTEMINSTRS, dec);
		CheckSystemAccess(1,dec->op1,dec->CRn,dec->CRm,dec->op2,dec->Rt,dec->L);
		dec->t = UINT(dec->Rt);
		dec->sys_op0 = 1;
		dec->sys_op1 = UINT(dec->op1);
		dec->sys_op2 = UINT(dec->op2);
		dec->sys_crn = UINT(dec->CRn);
		dec->sys_crm = UINT(dec->CRm);
		dec->has_result = (dec->L==1);
		OK(ENC_SYSL_RC_SYSTEMINSTRS);
	}
	return rc;
}

/* tbl_advsimd.xml */
int TBL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|001110|op2=00|0|Rm=xxxxx|0|len=xx|op=0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE09C00)==0xE000000) {
		decode_fields32(ENC_TBL_ASIMDTBL_L2_2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((8) ? ((dec->datasize) / (8)) : 0);
		dec->regs = UINT(dec->len)+1;
		dec->is_tbl = (dec->op==0);
		if(dec->len==1) OK(ENC_TBL_ASIMDTBL_L2_2);
		if(dec->len==2) OK(ENC_TBL_ASIMDTBL_L3_3);
		if(dec->len==3) OK(ENC_TBL_ASIMDTBL_L4_4);
		if(dec->len==0) OK(ENC_TBL_ASIMDTBL_L1_1);
	}
	return rc;
}

/* tbnz.xml */
int TBNZ(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class TBNZ_only_testbranch */
	/* b5=x|011011|op=1|b40=xxxxx|imm14=xxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0x7F000000)==0x37000000) {
		decode_fields32(ENC_TBNZ_ONLY_TESTBRANCH, dec);
		dec->t = UINT(dec->Rt);
		dec->datasize = (dec->b5==1) ? 0x40 : 0x20;
		dec->bit_pos = UINT(((dec->b5<<5)|dec->b40));
		dec->bit_val = dec->op;
		dec->offset = SignExtend((dec->imm14<<2),16);
		OK(ENC_TBNZ_ONLY_TESTBRANCH);
	}
	return rc;
}

/* tbx_advsimd.xml */
int TBX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|001110|op2=00|0|Rm=xxxxx|0|len=xx|op=1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE09C00)==0xE001000) {
		decode_fields32(ENC_TBX_ASIMDTBL_L2_2, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((8) ? ((dec->datasize) / (8)) : 0);
		dec->regs = UINT(dec->len)+1;
		dec->is_tbl = (dec->op==0);
		if(dec->len==1) OK(ENC_TBX_ASIMDTBL_L2_2);
		if(dec->len==2) OK(ENC_TBX_ASIMDTBL_L3_3);
		if(dec->len==3) OK(ENC_TBX_ASIMDTBL_L4_4);
		if(dec->len==0) OK(ENC_TBX_ASIMDTBL_L1_1);
	}
	return rc;
}

/* tbz.xml */
int TBZ(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class TBZ_only_testbranch */
	/* b5=x|011011|op=0|b40=xxxxx|imm14=xxxxxxxxxxxxxx|Rt=xxxxx */
	if((INSWORD & 0x7F000000)==0x36000000) {
		decode_fields32(ENC_TBZ_ONLY_TESTBRANCH, dec);
		dec->t = UINT(dec->Rt);
		dec->datasize = (dec->b5==1) ? 0x40 : 0x20;
		dec->bit_pos = UINT(((dec->b5<<5)|dec->b40));
		dec->bit_val = dec->op;
		dec->offset = SignExtend((dec->imm14<<2),16);
		OK(ENC_TBZ_ONLY_TESTBRANCH);
	}
	return rc;
}

/* tlbi_sys.xml */
int TLBI_SYS(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class SYS_CR_systeminstrs */
	/* 1101010100|L=0|op0=01|op1=xxx|CRn=1000|CRm=xxxx|op2=xxx|Rt=xxxxx */
	if((INSWORD & 0xFFF8F000)==0xD5088000) {
		decode_fields32(ENC_TLBI_SYS_CR_SYSTEMINSTRS, dec);
		OK(ENC_TLBI_SYS_CR_SYSTEMINSTRS);
	}
	return rc;
}

/* trn1_advsimd.xml */
int TRN1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class TRN1_asimdperm_only */
	/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=0|10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE002800) {
		decode_fields32(ENC_TRN1_ASIMDPERM_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->part = UINT(dec->op);
		dec->pairs = ((2) ? ((dec->elements) / (2)) : 0);
		OK(ENC_TRN1_ASIMDPERM_ONLY);
	}
	return rc;
}

/* trn2_advsimd.xml */
int TRN2_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class TRN2_asimdperm_only */
	/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=1|10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE006800) {
		decode_fields32(ENC_TRN2_ASIMDPERM_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->part = UINT(dec->op);
		dec->pairs = ((2) ? ((dec->elements) / (2)) : 0);
		OK(ENC_TRN2_ASIMDPERM_ONLY);
	}
	return rc;
}

/* tsb.xml */
int TSB(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class TSB_HC_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0010|op2=010|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503225F) {
		decode_fields32(ENC_TSB_HC_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_TSB_HC_HINTS);
	}
	return rc;
}

/* tst_ands_log_imm.xml */
int TST_ANDS_log_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|opc=11|100100|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7F80001F)==0x7200001F) {
		decode_fields32(ENC_TST_ANDS_32S_LOG_IMM, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_TST_ANDS_32S_LOG_IMM);
		if(dec->sf==1) OK(ENC_TST_ANDS_64S_LOG_IMM);
	}
	return rc;
}

/* tst_ands_log_shift.xml */
int TST_ANDS_log_shift(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class s */
	/* sf=x|opc=11|01010|shift=xx|N=0|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=11111 */
	if((INSWORD & 0x7F20001F)==0x6A00001F) {
		decode_fields32(ENC_TST_ANDS_32_LOG_SHIFT, dec);
		if(dec->sf==0) OK(ENC_TST_ANDS_32_LOG_SHIFT);
		if(dec->sf==1) OK(ENC_TST_ANDS_64_LOG_SHIFT);
	}
	return rc;
}

/* uabal_advsimd.xml */
int UABAL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UABAL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|01|op=0|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E205000) {
		decode_fields32(ENC_UABAL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->accumulate = (dec->op==0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UABAL_ASIMDDIFF_L);
	}
	return rc;
}

/* uaba_advsimd.xml */
int UABA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UABA_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|0111|ac=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E207C00) {
		decode_fields32(ENC_UABA_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->accumulate = (dec->ac==1);
		OK(ENC_UABA_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uabdl_advsimd.xml */
int UABDL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UABDL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|01|op=1|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E207000) {
		decode_fields32(ENC_UABDL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->accumulate = (dec->op==0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UABDL_ASIMDDIFF_L);
	}
	return rc;
}

/* uabd_advsimd.xml */
int UABD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UABD_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|0111|ac=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E207400) {
		decode_fields32(ENC_UABD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->accumulate = (dec->ac==1);
		OK(ENC_UABD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uadalp_advsimd.xml */
int UADALP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UADALP_asimdmisc_P */
	/* 0|Q=x|U=1|01110|size=xx|10000|00|op=1|10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E206800) {
		decode_fields32(ENC_UADALP_ASIMDMISC_P, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((((2) * (dec->esize))) ? ((dec->datasize) / (((2) * (dec->esize)))) : 0);
		dec->acc = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UADALP_ASIMDMISC_P);
	}
	return rc;
}

/* uaddlp_advsimd.xml */
int UADDLP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UADDLP_asimdmisc_P */
	/* 0|Q=x|U=1|01110|size=xx|10000|00|op=0|10|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E202800) {
		decode_fields32(ENC_UADDLP_ASIMDMISC_P, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((((2) * (dec->esize))) ? ((dec->datasize) / (((2) * (dec->esize)))) : 0);
		dec->acc = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UADDLP_ASIMDMISC_P);
	}
	return rc;
}

/* uaddlv_advsimd.xml */
int UADDLV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UADDLV_asimdall_only */
	/* 0|Q=x|U=1|01110|size=xx|11000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E303800) {
		decode_fields32(ENC_UADDLV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UADDLV_ASIMDALL_ONLY);
	}
	return rc;
}

/* uaddl_advsimd.xml */
int UADDL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UADDL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|00|o1=0|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E200000) {
		decode_fields32(ENC_UADDL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UADDL_ASIMDDIFF_L);
	}
	return rc;
}

/* uaddw_advsimd.xml */
int UADDW_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UADDW_asimddiff_W */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|00|o1=0|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E201000) {
		decode_fields32(ENC_UADDW_ASIMDDIFF_W, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UADDW_ASIMDDIFF_W);
	}
	return rc;
}

/* ubfiz_ubfm.xml */
int UBFIZ_UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x53000000) {
		decode_fields32(ENC_UBFIZ_UBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_UBFIZ_UBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_UBFIZ_UBFM_64M_BITFIELD);
	}
	return rc;
}

/* ubfm.xml */
int UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x53000000) {
		decode_fields32(ENC_UBFM_32M_BITFIELD, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->opc) {
			dec->inzero = TRUE;
			dec->extend = TRUE;
		}
		else if(dec->opc==1) {
			dec->inzero = FALSE;
			dec->extend = FALSE;
		}
		else if(dec->opc==2) {
			dec->inzero = TRUE;
			dec->extend = FALSE;
		}
		else if(dec->opc==3) {
			UNDEFINED;
		}
		if(dec->sf==1 && dec->N!=1) {
			UNDEFINED;
		}
		if(dec->sf==0 && (dec->N!=0 || SLICE(dec->immr,5,5)!=0 || SLICE(dec->imms,5,5)!=0)) {
			UNDEFINED;
		}
		dec->R = UINT(dec->immr);
		dec->S = UINT(dec->imms);
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(dec->N,dec->imms,dec->immr);
		dec->wmask = dbmrt.wmask;
		dec->tmask = dbmrt.tmask;
		/* regular aliases */
		bool encoding32 = dec->sf==0 && dec->N==0;
		bool encoding64 = dec->sf==1 && dec->N==1;
		if((dec->imms!=0x1f && dec->imms+1==dec->immr && EncodingLabeled32Bit()) || (dec->imms!=0x3f && dec->imms+1==dec->immr && EncodingLabeled64Bit())) return LSL_UBFM(ctx, dec);
		if((dec->imms==0x1f && EncodingLabeled32Bit()) || (dec->imms==0x3f && EncodingLabeled64Bit())) return LSR_UBFM(ctx, dec);
		if(UINT(dec->imms)<UINT(dec->immr)) return UBFIZ_UBFM(ctx, dec);
		if(BFXPreferred(dec->sf,SLICE(dec->opc,1,1),dec->imms,dec->immr)) return UBFX_UBFM(ctx, dec);
		if(dec->immr==0 && dec->imms==7) return UXTB_UBFM(ctx, dec);
		if(dec->immr==0 && dec->imms==15) return UXTH_UBFM(ctx, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_UBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_UBFM_64M_BITFIELD);
	}
	return rc;
}

/* ubfx_ubfm.xml */
int UBFX_UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=x|opc=10|100110|N=x|immr=xxxxxx|imms=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F800000)==0x53000000) {
		decode_fields32(ENC_UBFX_UBFM_32M_BITFIELD, dec);
		if(dec->sf==0 && dec->N==0) OK(ENC_UBFX_UBFM_32M_BITFIELD);
		if(dec->sf==1 && dec->N==1) OK(ENC_UBFX_UBFM_64M_BITFIELD);
	}
	return rc;
}

/* ucvtf_advsimd_fix.xml */
int UCVTF_advsimd_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UCVTF_asisdshf_C */
	/* 01|U=1|111110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F00E400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UCVTF_ASISDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRoundingMode(ctx->FPCR);
		OK(ENC_UCVTF_ASISDSHF_C);
	}
	/* class UCVTF_asimdshf_C */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=11100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F00E400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UCVTF_ASIMDSHF_C, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(!(dec->immh&14) || ((dec->immh&14)==2 && !HaveFP16Ext())) {
			UNDEFINED;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = ((dec->immh&8)==8) ? 0x40 : (((dec->immh&12)==4) ? 0x20 : 0x10);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->fracbits = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->rounding = FPRoundingMode(ctx->FPCR);
		OK(ENC_UCVTF_ASIMDSHF_C);
	}
	return rc;
}

/* ucvtf_advsimd_int.xml */
int UCVTF_advsimd_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UCVTF_asisdmiscfp16_R */
	/* 01|U=1|11110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x7E79D800) {
		decode_fields32(ENC_UCVTF_ASISDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UCVTF_ASISDMISCFP16_R);
	}
	/* class UCVTF_asisdmisc_R */
	/* 01|U=1|11110|0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFBFFC00)==0x7E21D800) {
		decode_fields32(ENC_UCVTF_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UCVTF_ASISDMISC_R);
	}
	/* class UCVTF_asimdmiscfp16_R */
	/* 0|Q=x|U=1|01110|a=0|111100|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFFFFC00)==0x2E79D800) {
		decode_fields32(ENC_UCVTF_ASIMDMISCFP16_R, dec);
		if(!HaveFP16Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = 0x10;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UCVTF_ASIMDMISCFP16_R);
	}
	/* class UCVTF_asimdmisc_R */
	/* 0|Q=x|U=1|01110|0|sz=x|10000|opcode=11101|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2E21D800) {
		decode_fields32(ENC_UCVTF_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->sz<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UCVTF_ASIMDMISC_R);
	}
	return rc;
}

/* ucvtf_float_fix.xml */
int UCVTF_float_fix(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|0|rmode=00|opcode=011|scale=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3F0000)==0x1E030000) {
		decode_fields32(ENC_UCVTF_H32_FLOAT2FIX, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			UNDEFINED;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(dec->sf==0 && SLICE(dec->scale,5,5)==0) {
			UNDEFINED;
		}
		dec->fracbits = 0x40-UINT(dec->scale);
		if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==3) {
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_UCVTF_H32_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_UCVTF_S32_FLOAT2FIX);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_UCVTF_D32_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_UCVTF_H64_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_UCVTF_S64_FLOAT2FIX);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_UCVTF_D64_FLOAT2FIX);
	}
	return rc;
}

/* ucvtf_float_int.xml */
int UCVTF_float_int(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class float */
	/* sf=x|0|S=0|11110|ftype=xx|1|rmode=00|opcode=011|000000|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7F3FFC00)==0x1E230000) {
		decode_fields32(ENC_UCVTF_H32_FLOAT2INT, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->intsize = (dec->sf==1) ? 0x40 : 0x20;
		if(!dec->ftype) {
			dec->fltsize = 0x20;
		}
		else if(dec->ftype==1) {
			dec->fltsize = 0x40;
		}
		else if(dec->ftype==2) {
			if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)!=13) {
				UNDEFINED;
			}
			dec->fltsize = 0x80;
		}
		else if(dec->ftype==3) {
			if(HaveFP16Ext()) {
				dec->fltsize = 0x10;
			}
			else {
				UNDEFINED;
			}
		}
		if(!(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)&12)) {
			dec->rounding = FPDecodeRounding(dec->rmode);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==4) {
			dec->rounding = FPRoundingMode(ctx->FPCR);
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_ItoF;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==8) {
			dec->rounding = FPRounding_TIEAWAY;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==12) {
			if(dec->fltsize!=0x10 && dec->fltsize!=dec->intsize) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 0;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==13) {
			if(dec->intsize!=0x40 || dec->fltsize!=0x80) {
				UNDEFINED;
			}
			if(SLICE(dec->opcode,0,0)==1) {
				dec->op = FPConvOp_MOV_ItoF;
			};
			dec->part = 1;
			dec->fltsize = 0x40;
		}
		else if(((SLICE(dec->opcode,2,1)<<2)|dec->rmode)==15) {
			if(!HaveFJCVTZSExt()) {
				UNDEFINED;
			}
			dec->rounding = FPRounding_ZERO;
			dec->unsigned_ = (SLICE(dec->opcode,0,0)==1);
			dec->op = FPConvOp_CVT_FtoI_JS;
		}
		else {
			UNDEFINED;
		}
		if(dec->sf==0 && dec->ftype==3) OK(ENC_UCVTF_H32_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==0) OK(ENC_UCVTF_S32_FLOAT2INT);
		if(dec->sf==0 && dec->ftype==1) OK(ENC_UCVTF_D32_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==3) OK(ENC_UCVTF_H64_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==0) OK(ENC_UCVTF_S64_FLOAT2INT);
		if(dec->sf==1 && dec->ftype==1) OK(ENC_UCVTF_D64_FLOAT2INT);
	}
	return rc;
}

/* udf_perm_undef.xml */
int UDF_perm_undef(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UDF_only_perm_undef */
	/* 0000000000000000|imm16=xxxxxxxxxxxxxxxx */
	if((INSWORD & 0xFFFF0000)==0x0) {
		decode_fields32(ENC_UDF_ONLY_PERM_UNDEF, dec);
		OK(ENC_UDF_ONLY_PERM_UNDEF);
	}
	return rc;
}

/* udiv.xml */
int UDIV(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=x|op=0|S=0|11010110|Rm=xxxxx|opcode2<5:1>=00001|o1=0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0x7FE0FC00)==0x1AC00800) {
		decode_fields32(ENC_UDIV_32_DP_2SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->datasize = (dec->sf==1) ? 0x40 : 0x20;
		dec->unsigned_ = (dec->o1==0);
		if(dec->sf==0) OK(ENC_UDIV_32_DP_2SRC);
		if(dec->sf==1) OK(ENC_UDIV_64_DP_2SRC);
	}
	return rc;
}

/* udot_advsimd_elt.xml */
int UDOT_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UDOT_asimdelem_D */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1110|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F00E000) {
		decode_fields32(ENC_UDOT_ASIMDELEM_D, dec);
		if(!HaveDOTPExt()) {
			UNDEFINED;
		}
		if(dec->size!=2) {
			UNDEFINED;
		}
		dec->signed_ = (dec->U==0);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->M<<4)|dec->Rm));
		dec->index = UINT(((dec->H<<1)|dec->L));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_UDOT_ASIMDELEM_D);
	}
	return rc;
}

/* udot_advsimd_vec.xml */
int UDOT_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UDOT_asimdsame2_D */
	/* 0|Q=x|U=1|01110|size=xx|0|Rm=xxxxx|1|opcode=0010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E009400) {
		decode_fields32(ENC_UDOT_ASIMDSAME2_D, dec);
		if(!HaveDOTPExt()) {
			UNDEFINED;
		}
		if(dec->size!=2) {
			UNDEFINED;
		}
		dec->signed_ = (dec->U==0);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_UDOT_ASIMDSAME2_D);
	}
	return rc;
}

/* uhadd_advsimd.xml */
int UHADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UHADD_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00000|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E200400) {
		decode_fields32(ENC_UHADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UHADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uhsub_advsimd.xml */
int UHSUB_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UHSUB_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E202400) {
		decode_fields32(ENC_UHSUB_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UHSUB_ASIMDSAME_ONLY);
	}
	return rc;
}

/* umaddl.xml */
int UMADDL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMADDL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=1|01|Rm=xxxxx|o0=0|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0x9BA00000) {
		decode_fields32(ENC_UMADDL_64WA_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = 0x40;
		dec->datasize = 0x20;
		dec->sub_op = (dec->o0==1);
		dec->unsigned_ = (dec->U==1);
		/* regular aliases */
		if(dec->Ra==0x1f) return UMULL_UMADDL(ctx, dec);
		OK(ENC_UMADDL_64WA_DP_3SRC);
	}
	return rc;
}

/* umaxp_advsimd.xml */
int UMAXP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMAXP_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|1010|o1=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E20A400) {
		decode_fields32(ENC_UMAXP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_UMAXP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* umaxv_advsimd.xml */
int UMAXV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMAXV_asimdall_only */
	/* 0|Q=x|U=1|01110|size=xx|11000|op=0|1010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E30A800) {
		decode_fields32(ENC_UMAXV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->min = (dec->op==1);
		OK(ENC_UMAXV_ASIMDALL_ONLY);
	}
	return rc;
}

/* umax_advsimd.xml */
int UMAX_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMAX_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|0110|o1=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E206400) {
		decode_fields32(ENC_UMAX_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_UMAX_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uminp_advsimd.xml */
int UMINP_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMINP_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|1010|o1=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E20AC00) {
		decode_fields32(ENC_UMINP_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_UMINP_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uminv_advsimd.xml */
int UMINV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMINV_asimdall_only */
	/* 0|Q=x|U=1|01110|size=xx|11000|op=1|1010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E31A800) {
		decode_fields32(ENC_UMINV_ASIMDALL_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==4) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->min = (dec->op==1);
		OK(ENC_UMINV_ASIMDALL_ONLY);
	}
	return rc;
}

/* umin_advsimd.xml */
int UMIN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMIN_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|0110|o1=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E206C00) {
		decode_fields32(ENC_UMIN_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->minimum = (dec->o1==1);
		OK(ENC_UMIN_ASIMDSAME_ONLY);
	}
	return rc;
}

/* umlal_advsimd_elt.xml */
int UMLAL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMLAL_asimdelem_L */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=0|10|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F002000) {
		decode_fields32(ENC_UMLAL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->sub_op = (dec->o2==1);
		OK(ENC_UMLAL_ASIMDELEM_L);
	}
	return rc;
}

/* umlal_advsimd_vec.xml */
int UMLAL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMLAL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|10|o1=0|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E208000) {
		decode_fields32(ENC_UMLAL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UMLAL_ASIMDDIFF_L);
	}
	return rc;
}

/* umlsl_advsimd_elt.xml */
int UMLSL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMLSL_asimdelem_L */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|0|o2=1|10|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F006000) {
		decode_fields32(ENC_UMLSL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->sub_op = (dec->o2==1);
		OK(ENC_UMLSL_ASIMDELEM_L);
	}
	return rc;
}

/* umlsl_advsimd_vec.xml */
int UMLSL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMLSL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|10|o1=1|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E20A000) {
		decode_fields32(ENC_UMLSL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UMLSL_ASIMDDIFF_L);
	}
	return rc;
}

/* ummla_advsimd_vec.xml */
int UMMLA_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMMLA_asimdsame2_G */
	/* 0|Q=1|U=1|01110|size=10|0|Rm=xxxxx|1|010|B=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x6E80A400) {
		decode_fields32(ENC_UMMLA_ASIMDSAME2_G, dec);
		if(!HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		if(!((dec->B<<1)|dec->U)) {
			dec->op1_unsigned = FALSE;
			dec->op2_unsigned = FALSE;
		}
		else if(((dec->B<<1)|dec->U)==1) {
			dec->op1_unsigned = TRUE;
			dec->op2_unsigned = TRUE;
		}
		else if(((dec->B<<1)|dec->U)==2) {
			dec->op1_unsigned = TRUE;
			dec->op2_unsigned = FALSE;
		}
		else if(((dec->B<<1)|dec->U)==3) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		OK(ENC_UMMLA_ASIMDSAME2_G);
	}
	return rc;
}

/* umnegl_umsubl.xml */
int UMNEGL_UMSUBL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMSUBL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=1|01|Rm=xxxxx|o0=1|Ra=11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9BA0FC00) {
		decode_fields32(ENC_UMNEGL_UMSUBL_64WA_DP_3SRC, dec);
		OK(ENC_UMNEGL_UMSUBL_64WA_DP_3SRC);
	}
	return rc;
}

/* umov_advsimd.xml */
int UMOV_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class advsimd */
	/* 0|Q=x|op=0|01110000|imm5=xxxxx|0|imm4<3:2>=01|imm4=11|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE003C00) {
		decode_fields32(ENC_UMOV_ASIMDINS_W_W, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if((((dec->Q<<5)|dec->imm5)&0x21)==1) {
			dec->size = 0;
		}
		else if((((dec->Q<<5)|dec->imm5)&0x23)==2) {
			dec->size = 1;
		}
		else if((((dec->Q<<5)|dec->imm5)&0x27)==4) {
			dec->size = 2;
		}
		else if((((dec->Q<<5)|dec->imm5)&0x2f)==0x28) {
			dec->size = 3;
		}
		else {
			UNDEFINED;
		}
		dec->idxdsize = (SLICE(dec->imm5,4,4)==1) ? 0x80 : 0x40;
		dec->index = UINT(SLICE(dec->imm5,4,dec->size+1));
		dec->esize = (8) << (dec->size);
		dec->datasize = (dec->Q==1) ? 0x40 : 0x20;
		/* regular aliases */
		if(((dec->imm5&15)==8) || ((dec->imm5&7)==4)) return MOV_UMOV_advsimd(ctx, dec);
		if(dec->Q==0) OK(ENC_UMOV_ASIMDINS_W_W);
		if(dec->Q==1 && (dec->imm5&15)==8) OK(ENC_UMOV_ASIMDINS_X_X);
	}
	return rc;
}

/* umsubl.xml */
int UMSUBL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMSUBL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=1|01|Rm=xxxxx|o0=1|Ra=xxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0x9BA08000) {
		decode_fields32(ENC_UMSUBL_64WA_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = 0x40;
		dec->datasize = 0x20;
		dec->sub_op = (dec->o0==1);
		dec->unsigned_ = (dec->U==1);
		/* regular aliases */
		if(dec->Ra==0x1f) return UMNEGL_UMSUBL(ctx, dec);
		OK(ENC_UMSUBL_64WA_DP_3SRC);
	}
	return rc;
}

/* umulh.xml */
int UMULH(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMULH_64_dp_3src */
	/* sf=1|op54=00|11011|U=1|10|Rm=xxxxx|o0=0|Ra=(1)(1)(1)(1)(1)|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE08000)==0x9BC00000) {
		decode_fields32(ENC_UMULH_64_DP_3SRC, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->a = UINT(dec->Ra);
		dec->destsize = 0x40;
		dec->datasize = dec->destsize;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UMULH_64_DP_3SRC);
	}
	return rc;
}

/* umull_umaddl.xml */
int UMULL_UMADDL(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMADDL_64WA_dp_3src */
	/* sf=1|op54=00|11011|U=1|01|Rm=xxxxx|o0=0|Ra=11111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x9BA07C00) {
		decode_fields32(ENC_UMULL_UMADDL_64WA_DP_3SRC, dec);
		OK(ENC_UMULL_UMADDL_64WA_DP_3SRC);
	}
	return rc;
}

/* umull_advsimd_elt.xml */
int UMULL_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMULL_asimdelem_L */
	/* 0|Q=x|U=1|01111|size=xx|L=x|M=x|Rm=xxxx|opcode=1010|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF00F400)==0x2F00A000) {
		decode_fields32(ENC_UMULL_ASIMDELEM_L, dec);
		dec->idxdsize = (dec->H==1) ? 0x80 : 0x40;
		if(dec->size==1) {
			dec->index = UINT(((dec->H<<2)|(dec->L<<1)|dec->M));
			dec->Rmhi = 0;
		}
		else if(dec->size==2) {
			dec->index = UINT(((dec->H<<1)|dec->L));
			dec->Rmhi = dec->M;
		}
		else {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->Rmhi<<4)|dec->Rm));
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UMULL_ASIMDELEM_L);
	}
	return rc;
}

/* umull_advsimd_vec.xml */
int UMULL_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UMULL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=1100|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E20C000) {
		decode_fields32(ENC_UMULL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UMULL_ASIMDDIFF_L);
	}
	return rc;
}

/* uqadd_advsimd.xml */
int UQADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQADD_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E200C00) {
		decode_fields32(ENC_UQADD_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQADD_ASISDSAME_ONLY);
	}
	/* class UQADD_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00001|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E200C00) {
		decode_fields32(ENC_UQADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uqrshl_advsimd.xml */
int UQRSHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQRSHL_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E205C00) {
		decode_fields32(ENC_UQRSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_UQRSHL_ASISDSAME_ONLY);
	}
	/* class UQRSHL_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|010|R=1|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E205C00) {
		decode_fields32(ENC_UQRSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_UQRSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uqrshrn_advsimd.xml */
int UQRSHRN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQRSHRN_asisdshf_N */
	/* 01|U=1|111110|immh!=0000|immb=xxx|1001|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F009C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UQRSHRN_ASISDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQRSHRN_ASISDSHF_N);
	}
	/* class UQRSHRN_asimdshf_N */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|1001|op=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F009C00 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UQRSHRN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQRSHRN_ASIMDSHF_N);
	}
	return rc;
}

/* uqshl_advsimd_imm.xml */
int UQSHL_advsimd_imm(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQSHL_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|011|op=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F007400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UQSHL_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		if(!((dec->op<<1)|dec->U)) {
			UNDEFINED;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = TRUE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = FALSE;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->src_unsigned = TRUE;
			dec->dst_unsigned = TRUE;
		}
		OK(ENC_UQSHL_ASISDSHF_R);
	}
	/* class UQSHL_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|011|op=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F007400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UQSHL_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		if(!((dec->op<<1)|dec->U)) {
			UNDEFINED;
		}
		else if(((dec->op<<1)|dec->U)==1) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = TRUE;
		}
		else if(((dec->op<<1)|dec->U)==2) {
			dec->src_unsigned = FALSE;
			dec->dst_unsigned = FALSE;
		}
		else if(((dec->op<<1)|dec->U)==3) {
			dec->src_unsigned = TRUE;
			dec->dst_unsigned = TRUE;
		}
		OK(ENC_UQSHL_ASIMDSHF_R);
	}
	return rc;
}

/* uqshl_advsimd_reg.xml */
int UQSHL_advsimd_reg(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQSHL_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E204C00) {
		decode_fields32(ENC_UQSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_UQSHL_ASISDSAME_ONLY);
	}
	/* class UQSHL_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|010|R=0|S=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E204C00) {
		decode_fields32(ENC_UQSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_UQSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uqshrn_advsimd.xml */
int UQSHRN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQSHRN_asisdshf_N */
	/* 01|U=1|111110|immh!=0000|immb=xxx|1001|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F009400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UQSHRN_ASISDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			UNDEFINED;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->part = 0;
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQSHRN_ASISDSHF_N);
	}
	/* class UQSHRN_asimdshf_N */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|1001|op=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F009400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UQSHRN_ASIMDSHF_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->immh<<3)|dec->immb));
		dec->round = (dec->op==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQSHRN_ASIMDSHF_N);
	}
	return rc;
}

/* uqsub_advsimd.xml */
int UQSUB_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQSUB_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E202C00) {
		decode_fields32(ENC_UQSUB_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQSUB_ASISDSAME_ONLY);
	}
	/* class UQSUB_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00101|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E202C00) {
		decode_fields32(ENC_UQSUB_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQSUB_ASIMDSAME_ONLY);
	}
	return rc;
}

/* uqxtn_advsimd.xml */
int UQXTN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UQXTN_asisdmisc_N */
	/* 01|U=1|11110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E214800) {
		decode_fields32(ENC_UQXTN_ASISDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->part = 0;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQXTN_ASISDMISC_N);
	}
	/* class UQXTN_asimdmisc_N */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=10100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E214800) {
		decode_fields32(ENC_UQXTN_ASIMDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_UQXTN_ASIMDMISC_N);
	}
	return rc;
}

/* urecpe_advsimd.xml */
int URECPE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class URECPE_asimdmisc_R */
	/* 0|Q=x|U=0|01110|1|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0xEA1C800) {
		decode_fields32(ENC_URECPE_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_URECPE_ASIMDMISC_R);
	}
	return rc;
}

/* urhadd_advsimd.xml */
int URHADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class URHADD_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|opcode=00010|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E201400) {
		decode_fields32(ENC_URHADD_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_URHADD_ASIMDSAME_ONLY);
	}
	return rc;
}

/* urshl_advsimd.xml */
int URSHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class URSHL_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E205400) {
		decode_fields32(ENC_URSHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_URSHL_ASISDSAME_ONLY);
	}
	/* class URSHL_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|010|R=1|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E205400) {
		decode_fields32(ENC_URSHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_URSHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* urshr_advsimd.xml */
int URSHR_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class URSHR_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|00|o1=1|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F002400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_URSHR_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_URSHR_ASISDSHF_R);
	}
	/* class URSHR_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|00|o1=1|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F002400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_URSHR_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_URSHR_ASIMDSHF_R);
	}
	return rc;
}

/* ursqrte_advsimd.xml */
int URSQRTE_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class URSQRTE_asimdmisc_R */
	/* 0|Q=x|U=1|01110|1|sz=x|10000|opcode=11100|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFBFFC00)==0x2EA1C800) {
		decode_fields32(ENC_URSQRTE_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->sz==1) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_URSQRTE_ASIMDMISC_R);
	}
	return rc;
}

/* ursra_advsimd.xml */
int URSRA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class URSRA_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|00|o1=1|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F003400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_URSRA_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_URSRA_ASISDSHF_R);
	}
	/* class URSRA_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|00|o1=1|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F003400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_URSRA_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_URSRA_ASIMDSHF_R);
	}
	return rc;
}

/* usdot_advsimd_elt.xml */
int USDOT_advsimd_elt(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USDOT_asimdelem_D */
	/* 0|Q=x|U=0|01111|US=1|0|L=x|M=x|Rm=xxxx|opcode=1111|H=x|0|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFC0F400)==0xF80F000) {
		decode_fields32(ENC_USDOT_ASIMDELEM_D, dec);
		if(!HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->op1_unsigned = (dec->US==1);
		dec->op2_unsigned = (dec->US==0);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(((dec->M<<4)|dec->Rm));
		dec->d = UINT(dec->Rd);
		dec->i = UINT(((dec->H<<1)|dec->L));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((0x20) ? ((dec->datasize) / (0x20)) : 0);
		OK(ENC_USDOT_ASIMDELEM_D);
	}
	return rc;
}

/* usdot_advsimd_vec.xml */
int USDOT_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USDOT_asimdsame2_D */
	/* 0|Q=x|U=0|01110|size=10|0|Rm=xxxxx|1|opcode=0011|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBFE0FC00)==0xE809C00) {
		decode_fields32(ENC_USDOT_ASIMDSAME2_D, dec);
		if(!HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((0x20) ? ((dec->datasize) / (0x20)) : 0);
		OK(ENC_USDOT_ASIMDSAME2_D);
	}
	return rc;
}

/* ushll_advsimd.xml */
int USHLL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USHLL_asimdshf_L */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F00A400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_USHLL_ASIMDSHF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(SLICE(dec->immh,3,3)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = UINT(((dec->immh<<3)|dec->immb))-dec->esize;
		dec->unsigned_ = (dec->U==1);
		/* regular aliases */
		if(dec->immb==0 && BitCount(dec->immh)==1) return UXTL_USHLL_advsimd(ctx, dec);
		OK(ENC_USHLL_ASIMDSHF_L);
	}
	return rc;
}

/* ushl_advsimd.xml */
int USHL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USHL_asisdsame_only */
	/* 01|U=1|11110|size=xx|1|Rm=xxxxx|010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x7E204400) {
		decode_fields32(ENC_USHL_ASISDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		if(dec->S==0 && dec->size!=3) {
			UNDEFINED;
		}
		OK(ENC_USHL_ASISDSAME_ONLY);
	}
	/* class USHL_asimdsame_only */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|010|R=0|S=0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E204400) {
		decode_fields32(ENC_USHL_ASIMDSAME_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		dec->rounding = (dec->R==1);
		dec->saturating = (dec->S==1);
		OK(ENC_USHL_ASIMDSAME_ONLY);
	}
	return rc;
}

/* ushr_advsimd.xml */
int USHR_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USHR_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|00|o1=0|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F000400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_USHR_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_USHR_ASISDSHF_R);
	}
	/* class USHR_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|00|o1=0|o0=0|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F000400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_USHR_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_USHR_ASIMDSHF_R);
	}
	return rc;
}

/* usmmla_advsimd_vec.xml */
int USMMLA_advsimd_vec(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USMMLA_asimdsame2_G */
	/* 0|Q=1|U=0|01110|size=10|0|Rm=xxxxx|1|010|B=1|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4E80AC00) {
		decode_fields32(ENC_USMMLA_ASIMDSAME2_G, dec);
		if(!HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		if(!((dec->B<<1)|dec->U)) {
			dec->op1_unsigned = FALSE;
			dec->op2_unsigned = FALSE;
		}
		else if(((dec->B<<1)|dec->U)==1) {
			dec->op1_unsigned = TRUE;
			dec->op2_unsigned = TRUE;
		}
		else if(((dec->B<<1)|dec->U)==2) {
			dec->op1_unsigned = TRUE;
			dec->op2_unsigned = FALSE;
		}
		else if(((dec->B<<1)|dec->U)==3) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Rd);
		OK(ENC_USMMLA_ASIMDSAME2_G);
	}
	return rc;
}

/* usqadd_advsimd.xml */
int USQADD_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USQADD_asisdmisc_R */
	/* 01|U=1|11110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x7E203800) {
		decode_fields32(ENC_USQADD_ASISDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->unsigned_ = (dec->U==1);
		OK(ENC_USQADD_ASISDMISC_R);
	}
	/* class USQADD_asimdmisc_R */
	/* 0|Q=x|U=1|01110|size=xx|10000|opcode=00011|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0x2E203800) {
		decode_fields32(ENC_USQADD_ASIMDMISC_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_USQADD_ASIMDMISC_R);
	}
	return rc;
}

/* usra_advsimd.xml */
int USRA_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USRA_asisdshf_R */
	/* 01|U=1|111110|immh!=0000|immb=xxx|00|o1=0|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF80FC00)==0x7F001400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_USRA_ASISDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(SLICE(dec->immh,3,3)!=1) {
			UNDEFINED;
		}
		dec->esize = (8) << (3);
		dec->datasize = dec->esize;
		dec->elements = 1;
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_USRA_ASISDSHF_R);
	}
	/* class USRA_asimdshf_R */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=xxx|00|o1=0|o0=1|0|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF80FC00)==0x2F001400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_USRA_ASIMDSHF_R, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->immh==0) {
			SEE /* asimdimm */;
		}
		if(((SLICE(dec->immh,3,3)<<1)|dec->Q)==2) {
			UNDEFINED;
		}
		dec->esize = (8) << (HighestSetBit(dec->immh));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->shift = ((dec->esize) * (2))-UINT(((dec->immh<<3)|dec->immb));
		dec->unsigned_ = (dec->U==1);
		dec->round = (dec->o1==1);
		dec->accumulate = (dec->o0==1);
		OK(ENC_USRA_ASIMDSHF_R);
	}
	return rc;
}

/* usubl_advsimd.xml */
int USUBL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USUBL_asimddiff_L */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|00|o1=1|0|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E202000) {
		decode_fields32(ENC_USUBL_ASIMDDIFF_L, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_USUBL_ASIMDDIFF_L);
	}
	return rc;
}

/* usubw_advsimd.xml */
int USUBW_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USUBW_asimddiff_W */
	/* 0|Q=x|U=1|01110|size=xx|1|Rm=xxxxx|00|o1=1|1|00|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0x2E203000) {
		decode_fields32(ENC_USUBW_ASIMDDIFF_W, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->sub_op = (dec->o1==1);
		dec->unsigned_ = (dec->U==1);
		OK(ENC_USUBW_ASIMDDIFF_W);
	}
	return rc;
}

/* uxtb_ubfm.xml */
int UXTB_UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=0|opc=10|100110|N=0|immr=000000|imms=000111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x53001C00) {
		decode_fields32(ENC_UXTB_UBFM_32M_BITFIELD, dec);
		OK(ENC_UXTB_UBFM_32M_BITFIELD);
	}
	return rc;
}

/* uxth_ubfm.xml */
int UXTH_UBFM(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zero_fill */
	/* sf=0|opc=10|100110|N=0|immr=000000|imms=001111|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x53003C00) {
		decode_fields32(ENC_UXTH_UBFM_32M_BITFIELD, dec);
		OK(ENC_UXTH_UBFM_32M_BITFIELD);
	}
	return rc;
}

/* uxtl_ushll_advsimd.xml */
int UXTL_USHLL_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class USHLL_asimdshf_L */
	/* 0|Q=x|U=1|011110|immh!=0000|immb=000|opcode=10100|1|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF87FC00)==0x2F00A400 && (INSWORD & 0x780000)!=0x0) {
		decode_fields32(ENC_UXTL_USHLL_ASIMDSHF_L, dec);
		OK(ENC_UXTL_USHLL_ASIMDSHF_L);
	}
	return rc;
}

/* uzp1_advsimd.xml */
int UZP1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UZP1_asimdperm_only */
	/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=0|01|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE001800) {
		decode_fields32(ENC_UZP1_ASIMDPERM_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->part = UINT(dec->op);
		OK(ENC_UZP1_ASIMDPERM_ONLY);
	}
	return rc;
}

/* uzp2_advsimd.xml */
int UZP2_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class UZP2_asimdperm_only */
	/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=1|01|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE005800) {
		decode_fields32(ENC_UZP2_ASIMDPERM_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->part = UINT(dec->op);
		OK(ENC_UZP2_ASIMDPERM_ONLY);
	}
	return rc;
}

/* wfe.xml */
int WFE(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class WFE_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=010|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503205F) {
		decode_fields32(ENC_WFE_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_WFE_HI_HINTS);
	}
	return rc;
}

/* wfi.xml */
int WFI(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class WFI_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=011|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503207F) {
		decode_fields32(ENC_WFI_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_WFI_HI_HINTS);
	}
	return rc;
}

/* xaflag.xml */
int XAFLAG(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class XAFLAG_M_pstate */
	/* 1101010100|L=0|op0=00|op1=000|CRn=0100|CRm=(0)(0)(0)(0)|op2=001|Rt =11111 */
	if((INSWORD & 0xFFFFF0FF)==0xD500403F) {
		decode_fields32(ENC_XAFLAG_M_PSTATE, dec);
		if(!HaveFlagFormatExt()) {
			UNDEFINED;
		}
		OK(ENC_XAFLAG_M_PSTATE);
	}
	return rc;
}

/* xar_advsimd.xml */
int XAR_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class XAR_VVV2_crypto3_imm6 */
	/* 11001110100|Rm=xxxxx|imm6=xxxxxx|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE00000)==0xCE800000) {
		decode_fields32(ENC_XAR_VVV2_CRYPTO3_IMM6, dec);
		if(!HaveSHA3Ext()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		OK(ENC_XAR_VVV2_CRYPTO3_IMM6);
	}
	return rc;
}

/* xpac.xml */
int XPAC(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class general */
	/* sf=1|1|S=0|11010110|opcode2=00001|opcode[5]=0|opcode[4]=1|opcode[3:1]=000|D=x|Rn=11111|Rd=xxxxx */
	if((INSWORD & 0xFFFFFBE0)==0xDAC143E0) {
		decode_fields32(ENC_XPACD_64Z_DP_1SRC, dec);
		dec->data = (dec->D==1);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(!HavePACExt()) {
			UNDEFINED;
		}
		if(dec->n!=0x1f) {
			UNDEFINED;
		}
		if(dec->D==1) OK(ENC_XPACD_64Z_DP_1SRC);
		if(dec->D==0) OK(ENC_XPACI_64Z_DP_1SRC);
	}
	/* class XPACLRI_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=111|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD50320FF) {
		decode_fields32(ENC_XPACLRI_HI_HINTS, dec);
		OK(ENC_XPACLRI_HI_HINTS);
	}
	return rc;
}

/* xtn_advsimd.xml */
int XTN_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class XTN_asimdmisc_N */
	/* 0|Q=x|U=0|01110|size=xx|10000|opcode=10010|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF3FFC00)==0xE212800) {
		decode_fields32(ENC_XTN_ASIMDMISC_N, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = 0x40;
		dec->part = UINT(dec->Q);
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		OK(ENC_XTN_ASIMDMISC_N);
	}
	return rc;
}

/* yield.xml */
int YIELD(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class YIELD_HI_hints */
	/* 1101010100|L=0|op0=00|op1=011|CRn=0010|CRm=0000|op2=001|Rt=11111 */
	if((INSWORD & 0xFFFFFFFF)==0xD503203F) {
		decode_fields32(ENC_YIELD_HI_HINTS, dec);
		if(!((dec->CRm<<3)|dec->op2)) {
			dec->op = SystemHintOp_NOP;
		}
		else if(((dec->CRm<<3)|dec->op2)==1) {
			dec->op = SystemHintOp_YIELD;
		}
		else if(((dec->CRm<<3)|dec->op2)==2) {
			dec->op = SystemHintOp_WFE;
		}
		else if(((dec->CRm<<3)|dec->op2)==3) {
			dec->op = SystemHintOp_WFI;
		}
		else if(((dec->CRm<<3)|dec->op2)==4) {
			dec->op = SystemHintOp_SEV;
		}
		else if(((dec->CRm<<3)|dec->op2)==5) {
			dec->op = SystemHintOp_SEVL;
		}
		else if(((dec->CRm<<3)|dec->op2)==6) {
			if(!HaveDGHExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_DGH;
		}
		else if(((dec->CRm<<3)|dec->op2)==7) {
			SEE /* XPACLRI */;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==8) {
			if(!dec->op2) {
				SEE /* PACIA1716 */;
			}
			else if(dec->op2==2) {
				SEE /* PACIB1716 */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIA1716 */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIB1716 */;
			}
			else {
				ENDOFINSTRUCTION;
			}
		}
		else if(((dec->CRm<<3)|dec->op2)==0x10) {
			if(!HaveRASExt()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_ESB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x11) {
			if(!HaveStatisticalProfiling()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_PSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x12) {
			if(!HaveSelfHostedTrace()) {
				ENDOFINSTRUCTION;
			}
			dec->op = SystemHintOp_TSB;
		}
		else if(((dec->CRm<<3)|dec->op2)==0x14) {
			dec->op = SystemHintOp_CSDB;
		}
		else if((((dec->CRm<<3)|dec->op2)&0x78)==0x18) {
			if(!dec->op2) {
				SEE /* PACIAZ */;
			}
			else if(dec->op2==1) {
				SEE /* PACIASP */;
			}
			else if(dec->op2==2) {
				SEE /* PACIBZ */;
			}
			else if(dec->op2==3) {
				SEE /* PACIBSP */;
			}
			else if(dec->op2==4) {
				SEE /* AUTIAZ */;
			}
			else if(dec->op2==5) {
				SEE /* AUTHASP */;
			}
			else if(dec->op2==6) {
				SEE /* AUTIBZ */;
			}
			else if(dec->op2==7) {
				SEE /* AUTIBSP */;
			}
		}
		else if((((dec->CRm<<3)|dec->op2)&0x79)==0x20) {
			dec->op = SystemHintOp_BTI;
			SetBTypeCompatible(BTypeCompatible_BTI(SLICE(dec->op2,2,1), ctx->pstate_btype));
		}
		else {
			ENDOFINSTRUCTION;
		}
		OK(ENC_YIELD_HI_HINTS);
	}
	return rc;
}

/* zip1_advsimd.xml */
int ZIP1_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ZIP1_asimdperm_only */
	/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=0|11|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE003800) {
		decode_fields32(ENC_ZIP1_ASIMDPERM_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->part = UINT(dec->op);
		dec->pairs = ((2) ? ((dec->elements) / (2)) : 0);
		OK(ENC_ZIP1_ASIMDPERM_ONLY);
	}
	return rc;
}

/* zip2_advsimd.xml */
int ZIP2_advsimd(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ZIP2_asimdperm_only */
	/* 0|Q=x|001110|size=xx|0|Rm=xxxxx|0|op=1|11|10|Rn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xBF20FC00)==0xE007800) {
		decode_fields32(ENC_ZIP2_ASIMDPERM_ONLY, dec);
		dec->d = UINT(dec->Rd);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		if(((dec->size<<1)|dec->Q)==6) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->datasize = (dec->Q==1) ? 0x80 : 0x40;
		dec->elements = ((dec->esize) ? ((dec->datasize) / (dec->esize)) : 0);
		dec->part = UINT(dec->op);
		dec->pairs = ((2) ? ((dec->elements) / (2)) : 0);
		OK(ENC_ZIP2_ASIMDPERM_ONLY);
	}
	return rc;
}

/* abs_z_p_z.xml */
int abs_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class abs_z_p_z_ */
	/* 00000100|size=xx|010|opc<2:1>=11|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x416A000) {
		decode_fields32(ENC_ABS_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_ABS_Z_P_Z_);
	}
	return rc;
}

/* add_z_p_zz.xml */
int add_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class add_z_p_zz_ */
	/* 00000100|size=xx|000|opc<2:1>=00|opc<0>=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4000000) {
		decode_fields32(ENC_ADD_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_ADD_Z_P_ZZ_);
	}
	return rc;
}

/* add_z_zi.xml */
int add_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class add_z_zi_ */
	/* 00100101|size=xx|100|opc<2:1>=00|opc<0>=0|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2520C000) {
		decode_fields32(ENC_ADD_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		OK(ENC_ADD_Z_ZI_);
	}
	return rc;
}

/* add_z_zz.xml */
int add_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class add_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|000|opc<2:1>=00|opc<0>=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4200000) {
		decode_fields32(ENC_ADD_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_ADD_Z_ZZ_);
	}
	return rc;
}

/* addpl_r_ri.xml */
int addpl_r_ri(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class addpl_r_ri_ */
	/* 000001000|op=1|1|Rn=xxxxx|01010|imm6=xxxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0F800)==0x4605000) {
		decode_fields32(ENC_ADDPL_R_RI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Rd);
		dec->imm = SInt(dec->imm6,6);
		OK(ENC_ADDPL_R_RI_);
	}
	return rc;
}

/* addvl_r_ri.xml */
int addvl_r_ri(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class addvl_r_ri_ */
	/* 000001000|op=0|1|Rn=xxxxx|01010|imm6=xxxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFE0F800)==0x4205000) {
		decode_fields32(ENC_ADDVL_R_RI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Rd);
		dec->imm = SInt(dec->imm6,6);
		OK(ENC_ADDVL_R_RI_);
	}
	return rc;
}

/* adr_z_az.xml */
int adr_z_az(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class adr_z_az_sd_same_scaled */
	/* 00000100|1|sz=x|1|Zm=xxxxx|1010|msz=xx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFA0F000)==0x4A0A000) {
		decode_fields32(ENC_ADR_Z_AZ_SD_SAME_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->osize = dec->esize;
		dec->unsigned_ = TRUE;
		dec->mbytes = (1) << (UINT(dec->msz));
		OK(ENC_ADR_Z_AZ_SD_SAME_SCALED);
	}
	/* class adr_z_az_d_s32_scaled */
	/* 00000100|opc=00|1|Zm=xxxxx|1010|msz=xx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0F000)==0x420A000) {
		decode_fields32(ENC_ADR_Z_AZ_D_S32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->osize = 0x20;
		dec->unsigned_ = FALSE;
		dec->mbytes = (1) << (UINT(dec->msz));
		OK(ENC_ADR_Z_AZ_D_S32_SCALED);
	}
	/* class adr_z_az_d_u32_scaled */
	/* 00000100|opc=01|1|Zm=xxxxx|1010|msz=xx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0F000)==0x460A000) {
		decode_fields32(ENC_ADR_Z_AZ_D_U32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->osize = 0x20;
		dec->unsigned_ = TRUE;
		dec->mbytes = (1) << (UINT(dec->msz));
		OK(ENC_ADR_Z_AZ_D_U32_SCALED);
	}
	return rc;
}

/* and_p_p_pp.xml */
int and_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class and_p_p_pp_z */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004000) {
		decode_fields32(ENC_AND_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		/* regular aliases */
		if(dec->S==1 && dec->Pn==dec->Pm) return MOVS_and_p_p_pp(ctx, dec);
		if(dec->S==0 && dec->Pn==dec->Pm) return MOV_and_p_p_pp(ctx, dec);
		OK(ENC_AND_P_P_PP_Z);
	}
	/* class ands_p_p_pp_z */
	/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25404000) {
		decode_fields32(ENC_ANDS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		/* regular aliases */
		if(dec->S==1 && dec->Pn==dec->Pm) return MOVS_and_p_p_pp(ctx, dec);
		if(dec->S==0 && dec->Pn==dec->Pm) return MOV_and_p_p_pp(ctx, dec);
		OK(ENC_ANDS_P_P_PP_Z);
	}
	return rc;
}

/* and_z_p_zz.xml */
int and_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class and_z_p_zz_ */
	/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41A0000) {
		decode_fields32(ENC_AND_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_AND_Z_P_ZZ_);
	}
	return rc;
}

/* and_z_zi.xml */
int and_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class and_z_zi_ */
	/* 00000101|opc=10|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5800000) {
		decode_fields32(ENC_AND_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->dn = UINT(dec->Zdn);
		DecodeBitMasksCheckUndefined(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0));
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0),SLICE(dec->imm13,11,6));
		dec->imm = dbmrt.wmask;
		OK(ENC_AND_Z_ZI_);
	}
	return rc;
}

/* and_z_zz.xml */
int and_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class and_z_zz_ */
	/* 00000100|opc=00|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4203000) {
		decode_fields32(ENC_AND_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_AND_Z_ZZ_);
	}
	return rc;
}

/* andv_r_p_z.xml */
int andv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class andv_r_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41A2000) {
		decode_fields32(ENC_ANDV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_ANDV_R_P_Z_);
	}
	return rc;
}

/* asr_z_p_zi.xml */
int asr_z_p_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asr_z_p_zi_ */
	/* 00000100|tszh=xx|00|opc=00|L=0|U=0|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4008000) {
		decode_fields32(ENC_ASR_Z_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->tsize<<3)|dec->imm3));
		OK(ENC_ASR_Z_P_ZI_);
	}
	return rc;
}

/* asr_z_p_zw.xml */
int asr_z_p_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asr_z_p_zw_ */
	/* 00000100|size=xx|011|R=0|L=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4188000) {
		decode_fields32(ENC_ASR_Z_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_ASR_Z_P_ZW_);
	}
	return rc;
}

/* asr_z_p_zz.xml */
int asr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asr_z_p_zz_ */
	/* 00000100|size=xx|010|R=0|L=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4108000) {
		decode_fields32(ENC_ASR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_ASR_Z_P_ZZ_);
	}
	return rc;
}

/* asr_z_zi.xml */
int asr_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asr_z_zi_ */
	/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|1001|0|U=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4209000) {
		decode_fields32(ENC_ASR_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->tsize<<3)|dec->imm3));
		OK(ENC_ASR_Z_ZI_);
	}
	return rc;
}

/* asr_z_zw.xml */
int asr_z_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asr_z_zw_ */
	/* 00000100|size=xx|1|Zm=xxxxx|1000|0|U=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4208000) {
		decode_fields32(ENC_ASR_Z_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_ASR_Z_ZW_);
	}
	return rc;
}

/* asrd_z_p_zi.xml */
int asrd_z_p_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asrd_z_p_zi_ */
	/* 00000100|tszh=xx|00|opc=01|L=0|U=0|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4048000) {
		decode_fields32(ENC_ASRD_Z_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->tsize<<3)|dec->imm3));
		OK(ENC_ASRD_Z_P_ZI_);
	}
	return rc;
}

/* asrr_z_p_zz.xml */
int asrr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class asrr_z_p_zz_ */
	/* 00000100|size=xx|010|R=1|L=0|U=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4148000) {
		decode_fields32(ENC_ASRR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_ASRR_Z_P_ZZ_);
	}
	return rc;
}

/* bfcvt_z_p_z.xml */
int bfcvt_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfcvt_z_p_z_s2bf */
	/* 01100101|opc=10|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x658AA000) {
		decode_fields32(ENC_BFCVT_Z_P_Z_S2BF, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_BFCVT_Z_P_Z_S2BF);
	}
	return rc;
}

/* bfcvtnt_z_p_z.xml */
int bfcvtnt_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfcvtnt_z_p_z_s2bf */
	/* 01100100|opc=10|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x648AA000) {
		decode_fields32(ENC_BFCVTNT_Z_P_Z_S2BF, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_BFCVTNT_Z_P_Z_S2BF);
	}
	return rc;
}

/* bfdot_z_zzz.xml */
int bfdot_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfdot_z_zzz_ */
	/* 011001000|op=1|1|Zm=xxxxx|100000|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64608000) {
		decode_fields32(ENC_BFDOT_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_BFDOT_Z_ZZZ_);
	}
	return rc;
}

/* bfdot_z_zzzi.xml */
int bfdot_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfdot_z_zzzi_ */
	/* 011001000|op=1|1|i2=xx|Zm=xxx|010000|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64604000) {
		decode_fields32(ENC_BFDOT_Z_ZZZI_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->index = UINT(dec->i2);
		OK(ENC_BFDOT_Z_ZZZI_);
	}
	return rc;
}

/* bfmlalb_z_zzz.xml */
int bfmlalb_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfmlalb_z_zzz_ */
	/* 011001001|o2=1|1|Zm=xxxxx|10|op=0|00|T=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64E08000) {
		decode_fields32(ENC_BFMLALB_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_BFMLALB_Z_ZZZ_);
	}
	return rc;
}

/* bfmlalb_z_zzzi.xml */
int bfmlalb_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfmlalb_z_zzzi_ */
	/* 011001001|o2=1|1|i3h=xx|Zm=xxx|01|op=0|0|i3l=x|T=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0F400)==0x64E04000) {
		decode_fields32(ENC_BFMLALB_Z_ZZZI_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->index = UINT(((dec->i3h<<1)|dec->i3l));
		OK(ENC_BFMLALB_Z_ZZZI_);
	}
	return rc;
}

/* bfmlalt_z_zzz.xml */
int bfmlalt_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfmlalt_z_zzz_ */
	/* 011001001|o2=1|1|Zm=xxxxx|10|op=0|00|T=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64E08400) {
		decode_fields32(ENC_BFMLALT_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_BFMLALT_Z_ZZZ_);
	}
	return rc;
}

/* bfmlalt_z_zzzi.xml */
int bfmlalt_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfmlalt_z_zzzi_ */
	/* 011001001|o2=1|1|i3h=xx|Zm=xxx|01|op=0|0|i3l=x|T=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0F400)==0x64E04400) {
		decode_fields32(ENC_BFMLALT_Z_ZZZI_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->index = UINT(((dec->i3h<<1)|dec->i3l));
		OK(ENC_BFMLALT_Z_ZZZI_);
	}
	return rc;
}

/* bfmmla_z_zzz.xml */
int bfmmla_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bfmmla_z_zzz_ */
	/* 01100100|opc=01|1|Zm=xxxxx|111001|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x6460E400) {
		decode_fields32(ENC_BFMMLA_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveBF16Ext()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_BFMMLA_Z_ZZZ_);
	}
	return rc;
}

/* bic_p_p_pp.xml */
int bic_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bic_p_p_pp_z */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004010) {
		decode_fields32(ENC_BIC_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_BIC_P_P_PP_Z);
	}
	/* class bics_p_p_pp_z */
	/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25404010) {
		decode_fields32(ENC_BICS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_BICS_P_P_PP_Z);
	}
	return rc;
}

/* bic_z_p_zz.xml */
int bic_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bic_z_p_zz_ */
	/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41B0000) {
		decode_fields32(ENC_BIC_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_BIC_Z_P_ZZ_);
	}
	return rc;
}

/* bic_z_zz.xml */
int bic_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class bic_z_zz_ */
	/* 00000100|opc=11|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4E03000) {
		decode_fields32(ENC_BIC_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_BIC_Z_ZZ_);
	}
	return rc;
}

/* brka_p_p_p.xml */
int brka_p_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class brka_p_p_p_ */
	/* 00100101|B=0|S=0|01000001|Pg=xxxx|0|Pn=xxxx|M=x|Pd=xxxx */
	if((INSWORD & 0xFFFFC200)==0x25104000) {
		decode_fields32(ENC_BRKA_P_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		dec->merging = (dec->M==1);
		dec->setflags = FALSE;
		OK(ENC_BRKA_P_P_P_);
	}
	/* class brkas_p_p_p_z */
	/* 00100101|B=0|S=1|01000001|Pg=xxxx|0|Pn=xxxx|M=0|Pd=xxxx */
	if((INSWORD & 0xFFFFC210)==0x25504000) {
		decode_fields32(ENC_BRKAS_P_P_P_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		dec->merging = FALSE;
		dec->setflags = TRUE;
		OK(ENC_BRKAS_P_P_P_Z);
	}
	return rc;
}

/* brkb_p_p_p.xml */
int brkb_p_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class brkb_p_p_p_ */
	/* 00100101|B=1|S=0|01000001|Pg=xxxx|0|Pn=xxxx|M=x|Pd=xxxx */
	if((INSWORD & 0xFFFFC200)==0x25904000) {
		decode_fields32(ENC_BRKB_P_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		dec->merging = (dec->M==1);
		dec->setflags = FALSE;
		OK(ENC_BRKB_P_P_P_);
	}
	/* class brkbs_p_p_p_z */
	/* 00100101|B=1|S=1|01000001|Pg=xxxx|0|Pn=xxxx|M=0|Pd=xxxx */
	if((INSWORD & 0xFFFFC210)==0x25D04000) {
		decode_fields32(ENC_BRKBS_P_P_P_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		dec->merging = FALSE;
		dec->setflags = TRUE;
		OK(ENC_BRKBS_P_P_P_Z);
	}
	return rc;
}

/* brkn_p_p_pp.xml */
int brkn_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class brkn_p_p_pp_ */
	/* 001001010|S=0|01100001|Pg=xxxx|0|Pn=xxxx|0|Pdm=xxxx */
	if((INSWORD & 0xFFFFC210)==0x25184000) {
		decode_fields32(ENC_BRKN_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->dm = UINT(dec->Pdm);
		dec->setflags = FALSE;
		OK(ENC_BRKN_P_P_PP_);
	}
	/* class brkns_p_p_pp_ */
	/* 001001010|S=1|01100001|Pg=xxxx|0|Pn=xxxx|0|Pdm=xxxx */
	if((INSWORD & 0xFFFFC210)==0x25584000) {
		decode_fields32(ENC_BRKNS_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->dm = UINT(dec->Pdm);
		dec->setflags = TRUE;
		OK(ENC_BRKNS_P_P_PP_);
	}
	return rc;
}

/* brkpa_p_p_pp.xml */
int brkpa_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class brkpa_p_p_pp_ */
	/* 00100101|op=0|S=0|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x2500C000) {
		decode_fields32(ENC_BRKPA_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_BRKPA_P_P_PP_);
	}
	/* class brkpas_p_p_pp_ */
	/* 00100101|op=0|S=1|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x2540C000) {
		decode_fields32(ENC_BRKPAS_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_BRKPAS_P_P_PP_);
	}
	return rc;
}

/* brkpb_p_p_pp.xml */
int brkpb_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class brkpb_p_p_pp_ */
	/* 00100101|op=0|S=0|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x2500C010) {
		decode_fields32(ENC_BRKPB_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_BRKPB_P_P_PP_);
	}
	/* class brkpbs_p_p_pp_ */
	/* 00100101|op=0|S=1|00|Pm=xxxx|11|Pg=xxxx|0|Pn=xxxx|B=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x2540C010) {
		decode_fields32(ENC_BRKPBS_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_BRKPBS_P_P_PP_);
	}
	return rc;
}

/* clasta_r_p_z.xml */
int clasta_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clasta_r_p_z_ */
	/* 00000101|size=xx|11000|B=0|101|Pg=xxx|Zm=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x530A000) {
		decode_fields32(ENC_CLASTA_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Rdn);
		dec->m = UINT(dec->Zm);
		dec->csize = (dec->esize<0x40) ? 0x20 : 0x40;
		dec->isBefore = FALSE;
		OK(ENC_CLASTA_R_P_Z_);
	}
	return rc;
}

/* clasta_v_p_z.xml */
int clasta_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clasta_v_p_z_ */
	/* 00000101|size=xx|10101|B=0|100|Pg=xxx|Zm=xxxxx|Vdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x52A8000) {
		decode_fields32(ENC_CLASTA_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Vdn);
		dec->m = UINT(dec->Zm);
		dec->isBefore = FALSE;
		OK(ENC_CLASTA_V_P_Z_);
	}
	return rc;
}

/* clasta_z_p_zz.xml */
int clasta_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clasta_z_p_zz_ */
	/* 00000101|size=xx|10100|B=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5288000) {
		decode_fields32(ENC_CLASTA_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->isBefore = FALSE;
		OK(ENC_CLASTA_Z_P_ZZ_);
	}
	return rc;
}

/* clastb_r_p_z.xml */
int clastb_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clastb_r_p_z_ */
	/* 00000101|size=xx|11000|B=1|101|Pg=xxx|Zm=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x531A000) {
		decode_fields32(ENC_CLASTB_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Rdn);
		dec->m = UINT(dec->Zm);
		dec->csize = (dec->esize<0x40) ? 0x20 : 0x40;
		dec->isBefore = TRUE;
		OK(ENC_CLASTB_R_P_Z_);
	}
	return rc;
}

/* clastb_v_p_z.xml */
int clastb_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clastb_v_p_z_ */
	/* 00000101|size=xx|10101|B=1|100|Pg=xxx|Zm=xxxxx|Vdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x52B8000) {
		decode_fields32(ENC_CLASTB_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Vdn);
		dec->m = UINT(dec->Zm);
		dec->isBefore = TRUE;
		OK(ENC_CLASTB_V_P_Z_);
	}
	return rc;
}

/* clastb_z_p_zz.xml */
int clastb_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clastb_z_p_zz_ */
	/* 00000101|size=xx|10100|B=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5298000) {
		decode_fields32(ENC_CLASTB_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->isBefore = TRUE;
		OK(ENC_CLASTB_Z_P_ZZ_);
	}
	return rc;
}

/* cls_z_p_z.xml */
int cls_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cls_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x418A000) {
		decode_fields32(ENC_CLS_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_CLS_Z_P_Z_);
	}
	return rc;
}

/* clz_z_p_z.xml */
int clz_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class clz_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x419A000) {
		decode_fields32(ENC_CLZ_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_CLZ_Z_P_Z_);
	}
	return rc;
}

/* cmpeq_p_p_zi.xml */
int cmpeq_p_p_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmpeq_p_p_zi_ */
	/* 00100101|size=xx|0|imm5=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x25008000) {
		decode_fields32(ENC_CMPEQ_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_EQ;
		dec->imm = SInt(dec->imm5,5);
		dec->unsigned_ = FALSE;
		OK(ENC_CMPEQ_P_P_ZI_);
	}
	/* class cmpgt_p_p_zi_ */
	/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x25000010) {
		decode_fields32(ENC_CMPGT_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		dec->imm = SInt(dec->imm5,5);
		dec->unsigned_ = FALSE;
		OK(ENC_CMPGT_P_P_ZI_);
	}
	/* class cmpge_p_p_zi_ */
	/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x25000000) {
		decode_fields32(ENC_CMPGE_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		dec->imm = SInt(dec->imm5,5);
		dec->unsigned_ = FALSE;
		OK(ENC_CMPGE_P_P_ZI_);
	}
	/* class cmphi_p_p_zi_ */
	/* 00100100|size=xx|1|imm7=xxxxxxx|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF202010)==0x24200010) {
		decode_fields32(ENC_CMPHI_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		dec->imm = UINT(dec->imm7);
		dec->unsigned_ = TRUE;
		OK(ENC_CMPHI_P_P_ZI_);
	}
	/* class cmphs_p_p_zi_ */
	/* 00100100|size=xx|1|imm7=xxxxxxx|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF202010)==0x24200000) {
		decode_fields32(ENC_CMPHS_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		dec->imm = UINT(dec->imm7);
		dec->unsigned_ = TRUE;
		OK(ENC_CMPHS_P_P_ZI_);
	}
	/* class cmplt_p_p_zi_ */
	/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x25002000) {
		decode_fields32(ENC_CMPLT_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LT;
		dec->imm = SInt(dec->imm5,5);
		dec->unsigned_ = FALSE;
		OK(ENC_CMPLT_P_P_ZI_);
	}
	/* class cmple_p_p_zi_ */
	/* 00100101|size=xx|0|imm5=xxxxx|op=0|0|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x25002010) {
		decode_fields32(ENC_CMPLE_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LE;
		dec->imm = SInt(dec->imm5,5);
		dec->unsigned_ = FALSE;
		OK(ENC_CMPLE_P_P_ZI_);
	}
	/* class cmplo_p_p_zi_ */
	/* 00100100|size=xx|1|imm7=xxxxxxx|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF202010)==0x24202000) {
		decode_fields32(ENC_CMPLO_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LT;
		dec->imm = UINT(dec->imm7);
		dec->unsigned_ = TRUE;
		OK(ENC_CMPLO_P_P_ZI_);
	}
	/* class cmpls_p_p_zi_ */
	/* 00100100|size=xx|1|imm7=xxxxxxx|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF202010)==0x24202010) {
		decode_fields32(ENC_CMPLS_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LE;
		dec->imm = UINT(dec->imm7);
		dec->unsigned_ = TRUE;
		OK(ENC_CMPLS_P_P_ZI_);
	}
	/* class cmpne_p_p_zi_ */
	/* 00100101|size=xx|0|imm5=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x25008010) {
		decode_fields32(ENC_CMPNE_P_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_NE;
		dec->imm = SInt(dec->imm5,5);
		dec->unsigned_ = FALSE;
		OK(ENC_CMPNE_P_P_ZI_);
	}
	return rc;
}

/* cmpeq_p_p_zw.xml */
int cmpeq_p_p_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmpeq_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24002000) {
		decode_fields32(ENC_CMPEQ_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_EQ;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPEQ_P_P_ZW_);
	}
	/* class cmpgt_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24004010) {
		decode_fields32(ENC_CMPGT_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPGT_P_P_ZW_);
	}
	/* class cmpge_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24004000) {
		decode_fields32(ENC_CMPGE_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPGE_P_P_ZW_);
	}
	/* class cmphi_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x2400C010) {
		decode_fields32(ENC_CMPHI_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		dec->unsigned_ = TRUE;
		OK(ENC_CMPHI_P_P_ZW_);
	}
	/* class cmphs_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x2400C000) {
		decode_fields32(ENC_CMPHS_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		dec->unsigned_ = TRUE;
		OK(ENC_CMPHS_P_P_ZW_);
	}
	/* class cmplt_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24006000) {
		decode_fields32(ENC_CMPLT_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LT;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPLT_P_P_ZW_);
	}
	/* class cmple_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=0|1|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24006010) {
		decode_fields32(ENC_CMPLE_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LE;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPLE_P_P_ZW_);
	}
	/* class cmplo_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x2400E000) {
		decode_fields32(ENC_CMPLO_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LT;
		dec->unsigned_ = TRUE;
		OK(ENC_CMPLO_P_P_ZW_);
	}
	/* class cmpls_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|U=1|1|lt=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x2400E010) {
		decode_fields32(ENC_CMPLS_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LE;
		dec->unsigned_ = TRUE;
		OK(ENC_CMPLS_P_P_ZW_);
	}
	/* class cmpne_p_p_zw_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24002010) {
		decode_fields32(ENC_CMPNE_P_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_NE;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPNE_P_P_ZW_);
	}
	return rc;
}

/* cmpeq_p_p_zz.xml */
int cmpeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cmpeq_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=1|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x2400A000) {
		decode_fields32(ENC_CMPEQ_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_EQ;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPEQ_P_P_ZZ_);
	}
	/* class cmpgt_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24008010) {
		decode_fields32(ENC_CMPGT_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPGT_P_P_ZZ_);
	}
	/* class cmpge_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24008000) {
		decode_fields32(ENC_CMPGE_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPGE_P_P_ZZ_);
	}
	/* class cmphi_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24000010) {
		decode_fields32(ENC_CMPHI_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		dec->unsigned_ = TRUE;
		OK(ENC_CMPHI_P_P_ZZ_);
	}
	/* class cmphs_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=0|0|o2=0|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x24000000) {
		decode_fields32(ENC_CMPHS_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		dec->unsigned_ = TRUE;
		OK(ENC_CMPHS_P_P_ZZ_);
	}
	/* class cmpne_p_p_zz_ */
	/* 00100100|size=xx|0|Zm=xxxxx|op=1|0|o2=1|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x2400A010) {
		decode_fields32(ENC_CMPNE_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_NE;
		dec->unsigned_ = FALSE;
		OK(ENC_CMPNE_P_P_ZZ_);
	}
	return rc;
}

/* cnot_z_p_z.xml */
int cnot_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cnot_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41BA000) {
		decode_fields32(ENC_CNOT_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_CNOT_Z_P_Z_);
	}
	return rc;
}

/* cnt_z_p_z.xml */
int cnt_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cnt_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=01|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41AA000) {
		decode_fields32(ENC_CNT_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_CNT_Z_P_Z_);
	}
	return rc;
}

/* cntb_r_s.xml */
int cntb_r_s(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cntb_r_s_ */
	/* 00000100|size=00|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x420E000) {
		decode_fields32(ENC_CNTB_R_S_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->d = UINT(dec->Rd);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_CNTB_R_S_);
	}
	/* class cntd_r_s_ */
	/* 00000100|size=11|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0E000) {
		decode_fields32(ENC_CNTD_R_S_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->d = UINT(dec->Rd);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_CNTD_R_S_);
	}
	/* class cnth_r_s_ */
	/* 00000100|size=01|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460E000) {
		decode_fields32(ENC_CNTH_R_S_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->d = UINT(dec->Rd);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_CNTH_R_S_);
	}
	/* class cntw_r_s_ */
	/* 00000100|size=10|10|imm4=xxxx|11100|op=0|pattern=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0E000) {
		decode_fields32(ENC_CNTW_R_S_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->d = UINT(dec->Rd);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_CNTW_R_S_);
	}
	return rc;
}

/* cntp_r_p_p.xml */
int cntp_r_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cntp_r_p_p_ */
	/* 00100101|size=xx|100|opc<2:1>=00|opc<0>=0|10|Pg=xxxx|o2=0|Pn=xxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FC200)==0x25208000) {
		decode_fields32(ENC_CNTP_R_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Rd);
		OK(ENC_CNTP_R_P_P_);
	}
	return rc;
}

/* compact_z_p_z.xml */
int compact_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class compact_z_p_z_ */
	/* 00000101|size=xx|100001100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5218000) {
		decode_fields32(ENC_COMPACT_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_COMPACT_Z_P_Z_);
	}
	return rc;
}

/* cpy_z_o_i.xml */
int cpy_z_o_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_o_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|0|M=0|sh=x|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF30C000)==0x5100000) {
		decode_fields32(ENC_CPY_Z_O_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->d = UINT(dec->Zd);
		dec->merging = FALSE;
		dec->imm = SInt(dec->imm8,8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		/* unconditional alias */
		if(MOV_cpy_z_o_i(ctx, dec)==0) return 0;
		OK(ENC_CPY_Z_O_I_);
	}
	return rc;
}

/* cpy_z_p_i.xml */
int cpy_z_p_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|0|M=1|sh=x|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF30C000)==0x5104000) {
		decode_fields32(ENC_CPY_Z_P_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->d = UINT(dec->Zd);
		dec->merging = TRUE;
		dec->imm = SInt(dec->imm8,8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		/* unconditional alias */
		if(MOV_cpy_z_p_i(ctx, dec)==0) return 0;
		OK(ENC_CPY_Z_P_I_);
	}
	return rc;
}

/* cpy_z_p_r.xml */
int cpy_z_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_r_ */
	/* 00000101|size=xx|101000101|Pg=xxx|Rn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x528A000) {
		decode_fields32(ENC_CPY_Z_P_R_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Zd);
		/* unconditional alias */
		if(MOV_cpy_z_p_r(ctx, dec)==0) return 0;
		OK(ENC_CPY_Z_P_R_);
	}
	return rc;
}

/* cpy_z_p_v.xml */
int cpy_z_p_v(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class cpy_z_p_v_ */
	/* 00000101|size=xx|100000100|Pg=xxx|Vn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5208000) {
		decode_fields32(ENC_CPY_Z_P_V_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Vn);
		dec->d = UINT(dec->Zd);
		/* unconditional alias */
		if(MOV_cpy_z_p_v(ctx, dec)==0) return 0;
		OK(ENC_CPY_Z_P_V_);
	}
	return rc;
}

/* ctermeq_rr.xml */
int ctermeq_rr(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ctermeq_rr_ */
	/* 00|100101|op=1|sz=x|1|Rm=xxxxx|001000|Rn=xxxxx|ne=0|0|0|00 */
	if((INSWORD & 0xFFA0FC1F)==0x25A02000) {
		decode_fields32(ENC_CTERMEQ_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->op = Cmp_EQ;
		OK(ENC_CTERMEQ_RR_);
	}
	/* class ctermne_rr_ */
	/* 00|100101|op=1|sz=x|1|Rm=xxxxx|001000|Rn=xxxxx|ne=1|0|0|00 */
	if((INSWORD & 0xFFA0FC1F)==0x25A02010) {
		decode_fields32(ENC_CTERMNE_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (0x20) << (UINT(dec->sz));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->op = Cmp_NE;
		OK(ENC_CTERMNE_RR_);
	}
	return rc;
}

/* decb_r_rs.xml */
int decb_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class decb_r_rs_ */
	/* 00000100|size=00|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x430E400) {
		decode_fields32(ENC_DECB_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECB_R_RS_);
	}
	/* class decd_r_rs_ */
	/* 00000100|size=11|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0E400) {
		decode_fields32(ENC_DECD_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECD_R_RS_);
	}
	/* class dech_r_rs_ */
	/* 00000100|size=01|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470E400) {
		decode_fields32(ENC_DECH_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECH_R_RS_);
	}
	/* class decw_r_rs_ */
	/* 00000100|size=10|11|imm4=xxxx|11100|D=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0E400) {
		decode_fields32(ENC_DECW_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECW_R_RS_);
	}
	return rc;
}

/* decd_z_zs.xml */
int decd_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class decd_z_zs_ */
	/* 00000100|size=11|11|imm4=xxxx|11000|D=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0C400) {
		decode_fields32(ENC_DECD_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECD_Z_ZS_);
	}
	/* class dech_z_zs_ */
	/* 00000100|size=01|11|imm4=xxxx|11000|D=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470C400) {
		decode_fields32(ENC_DECH_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECH_Z_ZS_);
	}
	/* class decw_z_zs_ */
	/* 00000100|size=10|11|imm4=xxxx|11000|D=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0C400) {
		decode_fields32(ENC_DECW_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_DECW_Z_ZS_);
	}
	return rc;
}

/* decp_r_p_r.xml */
int decp_r_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class decp_r_p_r_ */
	/* 00100101|size=xx|1011|op=0|D=1|10001|opc2=00|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252D8800) {
		decode_fields32(ENC_DECP_R_P_R_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		OK(ENC_DECP_R_P_R_);
	}
	return rc;
}

/* decp_z_p_z.xml */
int decp_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class decp_z_p_z_ */
	/* 00100101|size=xx|1011|op=0|D=1|10000|opc2=00|Pm=xxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252D8000) {
		decode_fields32(ENC_DECP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Zdn);
		OK(ENC_DECP_Z_P_Z_);
	}
	return rc;
}

/* dup_z_i.xml */
int dup_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_i_ */
	/* 00100101|size=xx|111|opc=00|011|sh=x|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2538C000) {
		decode_fields32(ENC_DUP_Z_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->d = UINT(dec->Zd);
		dec->imm = SInt(dec->imm8,8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		/* unconditional alias */
		if(MOV_dup_z_i(ctx, dec)==0) return 0;
		OK(ENC_DUP_Z_I_);
	}
	return rc;
}

/* dup_z_r.xml */
int dup_z_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_r_ */
	/* 00000101|size=xx|100000001110|Rn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5203800) {
		decode_fields32(ENC_DUP_Z_R_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Zd);
		/* unconditional alias */
		if(MOV_dup_z_r(ctx, dec)==0) return 0;
		OK(ENC_DUP_Z_R_);
	}
	return rc;
}

/* dup_z_zi.xml */
int dup_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dup_z_zi_ */
	/* 00000101|imm2=xx|1|tsz=xxxxx|001000|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5202000) {
		decode_fields32(ENC_DUP_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->imm = ((dec->imm2<<5)|dec->tsz);
		if(!dec->tsz) {
			UNDEFINED;
		}
		else if(dec->tsz==0x10) {
			dec->esize = 0x80;
			dec->index = UINT(SLICE(dec->imm,6,5));
		}
		else if((dec->tsz&15)==8) {
			dec->esize = 0x40;
			dec->index = UINT(SLICE(dec->imm,6,4));
		}
		else if((dec->tsz&7)==4) {
			dec->esize = 0x20;
			dec->index = UINT(SLICE(dec->imm,6,3));
		}
		else if((dec->tsz&3)==2) {
			dec->esize = 0x10;
			dec->index = UINT(SLICE(dec->imm,6,2));
		}
		else if(dec->tsz&1) {
			dec->esize = 8;
			dec->index = UINT(SLICE(dec->imm,6,1));
		}
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		/* regular aliases */
		if((BitCount(((dec->imm2<<5)|dec->tsz))==1) || (BitCount(((dec->imm2<<5)|dec->tsz))>1)) return MOV_dup_z_zi(ctx, dec);
		OK(ENC_DUP_Z_ZI_);
	}
	return rc;
}

/* dupm_z_i.xml */
int dupm_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class dupm_z_i_ */
	/* 00000101110000|imm13=xxxxxxxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5C00000) {
		decode_fields32(ENC_DUPM_Z_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->d = UINT(dec->Zd);
		DecodeBitMasksCheckUndefined(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0));
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0),SLICE(dec->imm13,11,6));
		dec->imm = dbmrt.wmask;
		/* regular aliases */
		if(SVEMoveMaskPreferred(dec->imm13)) return MOV_dupm_z_i(ctx, dec);
		OK(ENC_DUPM_Z_I_);
	}
	return rc;
}

/* eor_p_p_pp.xml */
int eor_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eor_p_p_pp_z */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004200) {
		decode_fields32(ENC_EOR_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		/* regular aliases */
		if(dec->Pm==dec->Pg) return NOTS_eor_p_p_pp(ctx, dec);
		if(dec->Pm==dec->Pg) return NOT_eor_p_p_pp(ctx, dec);
		OK(ENC_EOR_P_P_PP_Z);
	}
	/* class eors_p_p_pp_z */
	/* 00100101|op=0|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25404200) {
		decode_fields32(ENC_EORS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		/* regular aliases */
		if(dec->Pm==dec->Pg) return NOTS_eor_p_p_pp(ctx, dec);
		if(dec->Pm==dec->Pg) return NOT_eor_p_p_pp(ctx, dec);
		OK(ENC_EORS_P_P_PP_Z);
	}
	return rc;
}

/* eor_z_p_zz.xml */
int eor_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eor_z_p_zz_ */
	/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4190000) {
		decode_fields32(ENC_EOR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_EOR_Z_P_ZZ_);
	}
	return rc;
}

/* eor_z_zi.xml */
int eor_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eor_z_zi_ */
	/* 00000101|opc=01|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5400000) {
		decode_fields32(ENC_EOR_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->dn = UINT(dec->Zdn);
		DecodeBitMasksCheckUndefined(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0));
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0),SLICE(dec->imm13,11,6));
		dec->imm = dbmrt.wmask;
		OK(ENC_EOR_Z_ZI_);
	}
	return rc;
}

/* eor_z_zz.xml */
int eor_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eor_z_zz_ */
	/* 00000100|opc=10|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4A03000) {
		decode_fields32(ENC_EOR_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_EOR_Z_ZZ_);
	}
	return rc;
}

/* eorv_r_p_z.xml */
int eorv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class eorv_r_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4192000) {
		decode_fields32(ENC_EORV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_EORV_R_P_Z_);
	}
	return rc;
}

/* ext_z_zi.xml */
int ext_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ext_z_zi_des */
	/* 00000101001|imm8h=xxxxx|000|imm8l=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x5200000) {
		decode_fields32(ENC_EXT_Z_ZI_DES, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->position = UINT(((dec->imm8h<<3)|dec->imm8l));
		OK(ENC_EXT_Z_ZI_DES);
	}
	return rc;
}

/* fabd_z_p_zz.xml */
int fabd_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fabd_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=100|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65088000) {
		decode_fields32(ENC_FABD_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FABD_Z_P_ZZ_);
	}
	return rc;
}

/* fabs_z_p_z.xml */
int fabs_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fabs_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=10|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41CA000) {
		decode_fields32(ENC_FABS_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FABS_Z_P_Z_);
	}
	return rc;
}

/* facge_p_p_zz.xml */
int facge_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class facgt_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=1|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x6500E010) {
		decode_fields32(ENC_FACGT_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		OK(ENC_FACGT_P_P_ZZ_);
	}
	/* class facge_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=0|Pg=xxx|Zn=xxxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x6500C010) {
		decode_fields32(ENC_FACGE_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		OK(ENC_FACGE_P_P_ZZ_);
	}
	return rc;
}

/* fadd_z_p_zs.xml */
int fadd_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fadd_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=00|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x65188000) {
		decode_fields32(ENC_FADD_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? FPPointFive(0,dec->esize) : FPOne(0,dec->esize);
		OK(ENC_FADD_Z_P_ZS_);
	}
	return rc;
}

/* fadd_z_p_zz.xml */
int fadd_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fadd_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=000|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65008000) {
		decode_fields32(ENC_FADD_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FADD_Z_P_ZZ_);
	}
	return rc;
}

/* fadd_z_zz.xml */
int fadd_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fadd_z_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=00|opc<0>=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x65000000) {
		decode_fields32(ENC_FADD_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FADD_Z_ZZ_);
	}
	return rc;
}

/* fadda_v_p_z.xml */
int fadda_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fadda_v_p_z_ */
	/* 01100101|size=xx|011|opc<2:1>=00|opc<0>=0|001|Pg=xxx|Zm=xxxxx|Vdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65182000) {
		decode_fields32(ENC_FADDA_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Vdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FADDA_V_P_Z_);
	}
	return rc;
}

/* faddv_v_p_z.xml */
int faddv_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class faddv_v_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=00|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65002000) {
		decode_fields32(ENC_FADDV_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_FADDV_V_P_Z_);
	}
	return rc;
}

/* fcadd_z_p_zz.xml */
int fcadd_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcadd_z_p_zz_ */
	/* 01100100|size=xx|00000|rot=x|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3EE000)==0x64008000) {
		decode_fields32(ENC_FCADD_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->sub_i = (dec->rot==0);
		dec->sub_r = (dec->rot==1);
		OK(ENC_FCADD_Z_P_ZZ_);
	}
	return rc;
}

/* fcmeq_p_p_z0.xml */
int fcmeq_p_p_z0(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcmeq_p_p_z0_ */
	/* 01100101|size=xx|0100|eq=1|lt=0|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF3FE010)==0x65122000) {
		decode_fields32(ENC_FCMEQ_P_P_Z0_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_EQ;
		OK(ENC_FCMEQ_P_P_Z0_);
	}
	/* class fcmgt_p_p_z0_ */
	/* 01100101|size=xx|0100|eq=0|lt=0|001|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF3FE010)==0x65102010) {
		decode_fields32(ENC_FCMGT_P_P_Z0_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		OK(ENC_FCMGT_P_P_Z0_);
	}
	/* class fcmge_p_p_z0_ */
	/* 01100101|size=xx|0100|eq=0|lt=0|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF3FE010)==0x65102000) {
		decode_fields32(ENC_FCMGE_P_P_Z0_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		OK(ENC_FCMGE_P_P_Z0_);
	}
	/* class fcmlt_p_p_z0_ */
	/* 01100101|size=xx|0100|eq=0|lt=1|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF3FE010)==0x65112000) {
		decode_fields32(ENC_FCMLT_P_P_Z0_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LT;
		OK(ENC_FCMLT_P_P_Z0_);
	}
	/* class fcmle_p_p_z0_ */
	/* 01100101|size=xx|0100|eq=0|lt=1|001|Pg=xxx|Zn=xxxxx|ne=1|Pd=xxxx */
	if((INSWORD & 0xFF3FE010)==0x65112010) {
		decode_fields32(ENC_FCMLE_P_P_Z0_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_LE;
		OK(ENC_FCMLE_P_P_Z0_);
	}
	/* class fcmne_p_p_z0_ */
	/* 01100101|size=xx|0100|eq=1|lt=1|001|Pg=xxx|Zn=xxxxx|ne=0|Pd=xxxx */
	if((INSWORD & 0xFF3FE010)==0x65132000) {
		decode_fields32(ENC_FCMNE_P_P_Z0_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_NE;
		OK(ENC_FCMNE_P_P_Z0_);
	}
	return rc;
}

/* fcmeq_p_p_zz.xml */
int fcmeq_p_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcmeq_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=1|Pg=xxx|Zn=xxxxx|cmpl=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x65006000) {
		decode_fields32(ENC_FCMEQ_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_EQ;
		OK(ENC_FCMEQ_P_P_ZZ_);
	}
	/* class fcmgt_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x65004010) {
		decode_fields32(ENC_FCMGT_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GT;
		OK(ENC_FCMGT_P_P_ZZ_);
	}
	/* class fcmge_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=0|Pg=xxx|Zn=xxxxx|cmpl=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x65004000) {
		decode_fields32(ENC_FCMGE_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_GE;
		OK(ENC_FCMGE_P_P_ZZ_);
	}
	/* class fcmne_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=0|1|cmph=1|Pg=xxx|Zn=xxxxx|cmpl=1|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x65006010) {
		decode_fields32(ENC_FCMNE_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_NE;
		OK(ENC_FCMNE_P_P_ZZ_);
	}
	/* class fcmuo_p_p_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|op=1|1|o2=0|Pg=xxx|Zn=xxxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFF20E010)==0x6500C000) {
		decode_fields32(ENC_FCMUO_P_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Pd);
		dec->op = Cmp_UN;
		OK(ENC_FCMUO_P_P_ZZ_);
	}
	return rc;
}

/* fcmla_z_p_zzz.xml */
int fcmla_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcmla_z_p_zzz_ */
	/* 01100100|size=xx|0|Zm=xxxxx|0|rot=xx|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF208000)==0x64000000) {
		decode_fields32(ENC_FCMLA_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->sel_a = UINT(SLICE(dec->rot,0,0));
		dec->sel_b = UINT(NOT(SLICE(dec->rot,0,0),1));
		dec->neg_i = (SLICE(dec->rot,1,1)==1);
		dec->neg_r = (SLICE(dec->rot,0,0)!=SLICE(dec->rot,1,1));
		OK(ENC_FCMLA_Z_P_ZZZ_);
	}
	return rc;
}

/* fcmla_z_zzzi.xml */
int fcmla_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcmla_z_zzzi_h */
	/* 01100100|size=10|1|i2=xx|Zm=xxx|0001|rot=xx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0F000)==0x64A01000) {
		decode_fields32(ENC_FCMLA_Z_ZZZI_H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->sel_a = UINT(SLICE(dec->rot,0,0));
		dec->sel_b = UINT(NOT(SLICE(dec->rot,0,0),1));
		dec->neg_i = (SLICE(dec->rot,1,1)==1);
		dec->neg_r = (SLICE(dec->rot,0,0)!=SLICE(dec->rot,1,1));
		OK(ENC_FCMLA_Z_ZZZI_H);
	}
	/* class fcmla_z_zzzi_s */
	/* 01100100|size=11|1|i1=x|Zm=xxxx|0001|rot=xx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0F000)==0x64E01000) {
		decode_fields32(ENC_FCMLA_Z_ZZZI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i1);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->sel_a = UINT(SLICE(dec->rot,0,0));
		dec->sel_b = UINT(NOT(SLICE(dec->rot,0,0),1));
		dec->neg_i = (SLICE(dec->rot,1,1)==1);
		dec->neg_r = (SLICE(dec->rot,0,0)!=SLICE(dec->rot,1,1));
		OK(ENC_FCMLA_Z_ZZZI_S);
	}
	return rc;
}

/* fcpy_z_p_i.xml */
int fcpy_z_p_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcpy_z_p_i_ */
	/* 00000101|size=xx|01|Pg=xxxx|110|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF30E000)==0x510C000) {
		decode_fields32(ENC_FCPY_Z_P_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->d = UINT(dec->Zd);
		dec->imm = VFPExpandImm(dec->imm8,8);
		/* unconditional alias */
		if(FMOV_fcpy_z_p_i(ctx, dec)==0) return 0;
		OK(ENC_FCPY_Z_P_I_);
	}
	return rc;
}

/* fcvt_z_p_z.xml */
int fcvt_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcvt_z_p_z_h2s */
	/* 01100101|opc=10|0010|opc2=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6589A000) {
		decode_fields32(ENC_FCVT_Z_P_Z_H2S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x20;
		OK(ENC_FCVT_Z_P_Z_H2S);
	}
	/* class fcvt_z_p_z_h2d */
	/* 01100101|opc=11|0010|opc2=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65C9A000) {
		decode_fields32(ENC_FCVT_Z_P_Z_H2D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x40;
		OK(ENC_FCVT_Z_P_Z_H2D);
	}
	/* class fcvt_z_p_z_s2h */
	/* 01100101|opc=10|0010|opc2=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6588A000) {
		decode_fields32(ENC_FCVT_Z_P_Z_S2H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x10;
		OK(ENC_FCVT_Z_P_Z_S2H);
	}
	/* class fcvt_z_p_z_s2d */
	/* 01100101|opc=11|0010|opc2=11|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65CBA000) {
		decode_fields32(ENC_FCVT_Z_P_Z_S2D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x40;
		OK(ENC_FCVT_Z_P_Z_S2D);
	}
	/* class fcvt_z_p_z_d2h */
	/* 01100101|opc=11|0010|opc2=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65C8A000) {
		decode_fields32(ENC_FCVT_Z_P_Z_D2H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x10;
		OK(ENC_FCVT_Z_P_Z_D2H);
	}
	/* class fcvt_z_p_z_d2s */
	/* 01100101|opc=11|0010|opc2=10|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65CAA000) {
		decode_fields32(ENC_FCVT_Z_P_Z_D2S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x20;
		OK(ENC_FCVT_Z_P_Z_D2S);
	}
	return rc;
}

/* fcvtzs_z_p_z.xml */
int fcvtzs_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcvtzs_z_p_z_fp162h */
	/* 01100101|opc=01|011|opc2=01|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x655AA000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_FP162H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x10;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_FP162H);
	}
	/* class fcvtzs_z_p_z_fp162w */
	/* 01100101|opc=01|011|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x655CA000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_FP162W, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x20;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_FP162W);
	}
	/* class fcvtzs_z_p_z_fp162x */
	/* 01100101|opc=01|011|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x655EA000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_FP162X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x40;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_FP162X);
	}
	/* class fcvtzs_z_p_z_s2w */
	/* 01100101|opc=10|011|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x659CA000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_S2W, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x20;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_S2W);
	}
	/* class fcvtzs_z_p_z_s2x */
	/* 01100101|opc=11|011|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65DCA000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_S2X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x40;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_S2X);
	}
	/* class fcvtzs_z_p_z_d2w */
	/* 01100101|opc=11|011|opc2=00|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D8A000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_D2W, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x20;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_D2W);
	}
	/* class fcvtzs_z_p_z_d2x */
	/* 01100101|opc=11|011|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65DEA000) {
		decode_fields32(ENC_FCVTZS_Z_P_Z_D2X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x40;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZS_Z_P_Z_D2X);
	}
	return rc;
}

/* fcvtzu_z_p_z.xml */
int fcvtzu_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fcvtzu_z_p_z_fp162h */
	/* 01100101|opc=01|011|opc2=01|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x655BA000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_FP162H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x10;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_FP162H);
	}
	/* class fcvtzu_z_p_z_fp162w */
	/* 01100101|opc=01|011|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x655DA000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_FP162W, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x20;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_FP162W);
	}
	/* class fcvtzu_z_p_z_fp162x */
	/* 01100101|opc=01|011|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x655FA000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_FP162X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x40;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_FP162X);
	}
	/* class fcvtzu_z_p_z_s2w */
	/* 01100101|opc=10|011|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x659DA000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_S2W, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x20;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_S2W);
	}
	/* class fcvtzu_z_p_z_s2x */
	/* 01100101|opc=11|011|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65DDA000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_S2X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x40;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_S2X);
	}
	/* class fcvtzu_z_p_z_d2w */
	/* 01100101|opc=11|011|opc2=00|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D9A000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_D2W, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x20;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_D2W);
	}
	/* class fcvtzu_z_p_z_d2x */
	/* 01100101|opc=11|011|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65DFA000) {
		decode_fields32(ENC_FCVTZU_Z_P_Z_D2X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x40;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FCVTZU_Z_P_Z_D2X);
	}
	return rc;
}

/* fdiv_z_p_zz.xml */
int fdiv_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fdiv_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=110|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x650D8000) {
		decode_fields32(ENC_FDIV_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FDIV_Z_P_ZZ_);
	}
	return rc;
}

/* fdivr_z_p_zz.xml */
int fdivr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fdivr_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=110|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x650C8000) {
		decode_fields32(ENC_FDIVR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FDIVR_Z_P_ZZ_);
	}
	return rc;
}

/* fdup_z_i.xml */
int fdup_z_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fdup_z_i_ */
	/* 00100101|size=xx|111|opc=00|111|o2=0|imm8=xxxxxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x2539C000) {
		decode_fields32(ENC_FDUP_Z_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->d = UINT(dec->Zd);
		dec->imm = VFPExpandImm(dec->imm8,8);
		/* unconditional alias */
		if(FMOV_fdup_z_i(ctx, dec)==0) return 0;
		OK(ENC_FDUP_Z_I_);
	}
	return rc;
}

/* fexpa_z_z.xml */
int fexpa_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fexpa_z_z_ */
	/* 00000100|size=xx|1|opc<4:1>=0000|opc<0>=0|101110|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x420B800) {
		decode_fields32(ENC_FEXPA_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FEXPA_Z_Z_);
	}
	return rc;
}

/* fmad_z_p_zzz.xml */
int fmad_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmad_z_p_zzz_ */
	/* 01100101|size=xx|1|Za=xxxxx|1|N=0|op=0|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF20E000)==0x65208000) {
		decode_fields32(ENC_FMAD_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->a = UINT(dec->Za);
		dec->op1_neg = FALSE;
		dec->op3_neg = FALSE;
		OK(ENC_FMAD_Z_P_ZZZ_);
	}
	return rc;
}

/* fmax_z_p_zs.xml */
int fmax_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmax_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=11|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x651E8000) {
		decode_fields32(ENC_FMAX_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? 0 : FPOne(0,dec->esize);
		OK(ENC_FMAX_Z_P_ZS_);
	}
	return rc;
}

/* fmax_z_p_zz.xml */
int fmax_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmax_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=011|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65068000) {
		decode_fields32(ENC_FMAX_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FMAX_Z_P_ZZ_);
	}
	return rc;
}

/* fmaxnm_z_p_zs.xml */
int fmaxnm_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmaxnm_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=10|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x651C8000) {
		decode_fields32(ENC_FMAXNM_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? 0 : FPOne(0,dec->esize);
		OK(ENC_FMAXNM_Z_P_ZS_);
	}
	return rc;
}

/* fmaxnm_z_p_zz.xml */
int fmaxnm_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmaxnm_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=010|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65048000) {
		decode_fields32(ENC_FMAXNM_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FMAXNM_Z_P_ZZ_);
	}
	return rc;
}

/* fmaxnmv_v_p_z.xml */
int fmaxnmv_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmaxnmv_v_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=10|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65042000) {
		decode_fields32(ENC_FMAXNMV_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_FMAXNMV_V_P_Z_);
	}
	return rc;
}

/* fmaxv_v_p_z.xml */
int fmaxv_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmaxv_v_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65062000) {
		decode_fields32(ENC_FMAXV_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_FMAXV_V_P_Z_);
	}
	return rc;
}

/* fmin_z_p_zs.xml */
int fmin_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmin_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=11|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x651F8000) {
		decode_fields32(ENC_FMIN_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? 0 : FPOne(0,dec->esize);
		OK(ENC_FMIN_Z_P_ZS_);
	}
	return rc;
}

/* fmin_z_p_zz.xml */
int fmin_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmin_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=011|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65078000) {
		decode_fields32(ENC_FMIN_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FMIN_Z_P_ZZ_);
	}
	return rc;
}

/* fminnm_z_p_zs.xml */
int fminnm_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fminnm_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=10|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x651D8000) {
		decode_fields32(ENC_FMINNM_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? 0 : FPOne(0,dec->esize);
		OK(ENC_FMINNM_Z_P_ZS_);
	}
	return rc;
}

/* fminnm_z_p_zz.xml */
int fminnm_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fminnm_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=010|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65058000) {
		decode_fields32(ENC_FMINNM_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FMINNM_Z_P_ZZ_);
	}
	return rc;
}

/* fminnmv_v_p_z.xml */
int fminnmv_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fminnmv_v_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=10|opc<0>=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65052000) {
		decode_fields32(ENC_FMINNMV_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_FMINNMV_V_P_Z_);
	}
	return rc;
}

/* fminv_v_p_z.xml */
int fminv_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fminv_v_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65072000) {
		decode_fields32(ENC_FMINV_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_FMINV_V_P_Z_);
	}
	return rc;
}

/* fmla_z_p_zzz.xml */
int fmla_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmla_z_p_zzz_ */
	/* 01100101|size=xx|1|Zm=xxxxx|0|N=0|op=0|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20E000)==0x65200000) {
		decode_fields32(ENC_FMLA_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = FALSE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLA_Z_P_ZZZ_);
	}
	return rc;
}

/* fmla_z_zzzi.xml */
int fmla_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmla_z_zzzi_h */
	/* 01100100|0|i3h=x|1|i3l=xx|Zm=xxx|00000|op=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x64200000) {
		decode_fields32(ENC_FMLA_Z_ZZZI_H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->index = UINT(((dec->i3h<<2)|dec->i3l));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = FALSE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLA_Z_ZZZI_H);
	}
	/* class fmla_z_zzzi_s */
	/* 01100100|size=10|1|i2=xx|Zm=xxx|00000|op=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64A00000) {
		decode_fields32(ENC_FMLA_Z_ZZZI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = FALSE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLA_Z_ZZZI_S);
	}
	/* class fmla_z_zzzi_d */
	/* 01100100|size=11|1|i1=x|Zm=xxxx|00000|op=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64E00000) {
		decode_fields32(ENC_FMLA_Z_ZZZI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->index = UINT(dec->i1);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = FALSE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLA_Z_ZZZI_D);
	}
	return rc;
}

/* fmls_z_p_zzz.xml */
int fmls_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmls_z_p_zzz_ */
	/* 01100101|size=xx|1|Zm=xxxxx|0|N=0|op=1|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20E000)==0x65202000) {
		decode_fields32(ENC_FMLS_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = TRUE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLS_Z_P_ZZZ_);
	}
	return rc;
}

/* fmls_z_zzzi.xml */
int fmls_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmls_z_zzzi_h */
	/* 01100100|0|i3h=x|1|i3l=xx|Zm=xxx|00000|op=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x64200400) {
		decode_fields32(ENC_FMLS_Z_ZZZI_H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->index = UINT(((dec->i3h<<2)|dec->i3l));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = TRUE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLS_Z_ZZZI_H);
	}
	/* class fmls_z_zzzi_s */
	/* 01100100|size=10|1|i2=xx|Zm=xxx|00000|op=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64A00400) {
		decode_fields32(ENC_FMLS_Z_ZZZI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = TRUE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLS_Z_ZZZI_S);
	}
	/* class fmls_z_zzzi_d */
	/* 01100100|size=11|1|i1=x|Zm=xxxx|00000|op=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64E00400) {
		decode_fields32(ENC_FMLS_Z_ZZZI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->index = UINT(dec->i1);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = TRUE;
		dec->op3_neg = FALSE;
		OK(ENC_FMLS_Z_ZZZI_D);
	}
	return rc;
}

/* fmmla_z_zzz.xml */
int fmmla_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmmla_z_zzz_s */
	/* 01100100|opc=10|1|Zm=xxxxx|111001|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64A0E400) {
		decode_fields32(ENC_FMMLA_Z_ZZZ_S, dec);
		if(!HaveSVEFP32MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_FMMLA_Z_ZZZ_S);
	}
	/* class fmmla_z_zzz_d */
	/* 01100100|opc=11|1|Zm=xxxxx|111001|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64E0E400) {
		decode_fields32(ENC_FMMLA_Z_ZZZ_D, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_FMMLA_Z_ZZZ_D);
	}
	return rc;
}

/* fmsb_z_p_zzz.xml */
int fmsb_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmsb_z_p_zzz_ */
	/* 01100101|size=xx|1|Za=xxxxx|1|N=0|op=1|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF20E000)==0x6520A000) {
		decode_fields32(ENC_FMSB_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->a = UINT(dec->Za);
		dec->op1_neg = TRUE;
		dec->op3_neg = FALSE;
		OK(ENC_FMSB_Z_P_ZZZ_);
	}
	return rc;
}

/* fmul_z_p_zs.xml */
int fmul_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmul_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=01|opc<0>=0|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x651A8000) {
		decode_fields32(ENC_FMUL_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? FPPointFive(0,dec->esize) : FPTwo(0,dec->esize);
		OK(ENC_FMUL_Z_P_ZS_);
	}
	return rc;
}

/* fmul_z_p_zz.xml */
int fmul_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmul_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=001|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65028000) {
		decode_fields32(ENC_FMUL_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FMUL_Z_P_ZZ_);
	}
	return rc;
}

/* fmul_z_zz.xml */
int fmul_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmul_z_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=01|opc<0>=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x65000800) {
		decode_fields32(ENC_FMUL_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FMUL_Z_ZZ_);
	}
	return rc;
}

/* fmul_z_zzi.xml */
int fmul_z_zzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmul_z_zzi_h */
	/* 01100100|0|i3h=x|1|i3l=xx|Zm=xxx|001000|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFA0FC00)==0x64202000) {
		decode_fields32(ENC_FMUL_Z_ZZI_H, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->index = UINT(((dec->i3h<<2)|dec->i3l));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FMUL_Z_ZZI_H);
	}
	/* class fmul_z_zzi_s */
	/* 01100100|size=10|1|i2=xx|Zm=xxx|001000|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64A02000) {
		decode_fields32(ENC_FMUL_Z_ZZI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FMUL_Z_ZZI_S);
	}
	/* class fmul_z_zzi_d */
	/* 01100100|size=11|1|i1=x|Zm=xxxx|001000|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x64E02000) {
		decode_fields32(ENC_FMUL_Z_ZZI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->index = UINT(dec->i1);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FMUL_Z_ZZI_D);
	}
	return rc;
}

/* fmulx_z_p_zz.xml */
int fmulx_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fmulx_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=101|opc<0>=0|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x650A8000) {
		decode_fields32(ENC_FMULX_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FMULX_Z_P_ZZ_);
	}
	return rc;
}

/* fneg_z_p_z.xml */
int fneg_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fneg_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=10|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41DA000) {
		decode_fields32(ENC_FNEG_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FNEG_Z_P_Z_);
	}
	return rc;
}

/* fnmad_z_p_zzz.xml */
int fnmad_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fnmad_z_p_zzz_ */
	/* 01100101|size=xx|1|Za=xxxxx|1|N=1|op=0|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF20E000)==0x6520C000) {
		decode_fields32(ENC_FNMAD_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->a = UINT(dec->Za);
		dec->op1_neg = TRUE;
		dec->op3_neg = TRUE;
		OK(ENC_FNMAD_Z_P_ZZZ_);
	}
	return rc;
}

/* fnmla_z_p_zzz.xml */
int fnmla_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fnmla_z_p_zzz_ */
	/* 01100101|size=xx|1|Zm=xxxxx|0|N=1|op=0|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20E000)==0x65204000) {
		decode_fields32(ENC_FNMLA_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = TRUE;
		dec->op3_neg = TRUE;
		OK(ENC_FNMLA_Z_P_ZZZ_);
	}
	return rc;
}

/* fnmls_z_p_zzz.xml */
int fnmls_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fnmls_z_p_zzz_ */
	/* 01100101|size=xx|1|Zm=xxxxx|0|N=1|op=1|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20E000)==0x65206000) {
		decode_fields32(ENC_FNMLS_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_neg = FALSE;
		dec->op3_neg = TRUE;
		OK(ENC_FNMLS_Z_P_ZZZ_);
	}
	return rc;
}

/* fnmsb_z_p_zzz.xml */
int fnmsb_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fnmsb_z_p_zzz_ */
	/* 01100101|size=xx|1|Za=xxxxx|1|N=1|op=1|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF20E000)==0x6520E000) {
		decode_fields32(ENC_FNMSB_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->a = UINT(dec->Za);
		dec->op1_neg = FALSE;
		dec->op3_neg = TRUE;
		OK(ENC_FNMSB_Z_P_ZZZ_);
	}
	return rc;
}

/* frecpe_z_z.xml */
int frecpe_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class frecpe_z_z_ */
	/* 01100101|size=xx|001|opc<2:1>=11|opc<0>=0|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x650E3000) {
		decode_fields32(ENC_FRECPE_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FRECPE_Z_Z_);
	}
	return rc;
}

/* frecps_z_zz.xml */
int frecps_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class frecps_z_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=11|opc<0>=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x65001800) {
		decode_fields32(ENC_FRECPS_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FRECPS_Z_ZZ_);
	}
	return rc;
}

/* frecpx_z_p_z.xml */
int frecpx_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class frecpx_z_p_z_ */
	/* 01100101|size=xx|0011|opc=00|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x650CA000) {
		decode_fields32(ENC_FRECPX_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FRECPX_Z_P_Z_);
	}
	return rc;
}

/* frinta_z_p_z.xml */
int frinta_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class frinti_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6507A000) {
		decode_fields32(ENC_FRINTI_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_FRINTI_Z_P_Z_);
	}
	/* class frintx_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=11|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6506A000) {
		decode_fields32(ENC_FRINTX_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_FRINTX_Z_P_Z_);
	}
	/* class frinta_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=10|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6504A000) {
		decode_fields32(ENC_FRINTA_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = FALSE;
		dec->rounding = FPRounding_TIEAWAY;
		OK(ENC_FRINTA_Z_P_Z_);
	}
	/* class frintn_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=00|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6500A000) {
		decode_fields32(ENC_FRINTN_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = FALSE;
		dec->rounding = FPRounding_TIEEVEN;
		OK(ENC_FRINTN_Z_P_Z_);
	}
	/* class frintz_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=01|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6503A000) {
		decode_fields32(ENC_FRINTZ_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = FALSE;
		dec->rounding = FPRounding_ZERO;
		OK(ENC_FRINTZ_Z_P_Z_);
	}
	/* class frintm_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=01|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6502A000) {
		decode_fields32(ENC_FRINTM_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = FALSE;
		dec->rounding = FPRounding_NEGINF;
		OK(ENC_FRINTM_Z_P_Z_);
	}
	/* class frintp_z_p_z_ */
	/* 01100101|size=xx|000|opc<2:1>=00|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x6501A000) {
		decode_fields32(ENC_FRINTP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->exact = FALSE;
		dec->rounding = FPRounding_POSINF;
		OK(ENC_FRINTP_Z_P_Z_);
	}
	return rc;
}

/* frsqrte_z_z.xml */
int frsqrte_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class frsqrte_z_z_ */
	/* 01100101|size=xx|001|opc<2:1>=11|opc<0>=1|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x650F3000) {
		decode_fields32(ENC_FRSQRTE_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FRSQRTE_Z_Z_);
	}
	return rc;
}

/* frsqrts_z_zz.xml */
int frsqrts_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class frsqrts_z_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=11|opc<0>=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x65001C00) {
		decode_fields32(ENC_FRSQRTS_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FRSQRTS_Z_ZZ_);
	}
	return rc;
}

/* fscale_z_p_zz.xml */
int fscale_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fscale_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=100|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65098000) {
		decode_fields32(ENC_FSCALE_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FSCALE_Z_P_ZZ_);
	}
	return rc;
}

/* fsqrt_z_p_z.xml */
int fsqrt_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fsqrt_z_p_z_ */
	/* 01100101|size=xx|0011|opc=01|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x650DA000) {
		decode_fields32(ENC_FSQRT_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_FSQRT_Z_P_Z_);
	}
	return rc;
}

/* fsub_z_p_zs.xml */
int fsub_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fsub_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=00|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x65198000) {
		decode_fields32(ENC_FSUB_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? FPPointFive(0,dec->esize) : FPOne(0,dec->esize);
		OK(ENC_FSUB_Z_P_ZS_);
	}
	return rc;
}

/* fsub_z_p_zz.xml */
int fsub_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fsub_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=000|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65018000) {
		decode_fields32(ENC_FSUB_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FSUB_Z_P_ZZ_);
	}
	return rc;
}

/* fsub_z_zz.xml */
int fsub_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fsub_z_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=00|opc<0>=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x65000400) {
		decode_fields32(ENC_FSUB_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FSUB_Z_ZZ_);
	}
	return rc;
}

/* fsubr_z_p_zs.xml */
int fsubr_z_p_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fsubr_z_p_zs_ */
	/* 01100101|size=xx|011|opc<2:1>=01|opc<0>=1|100|Pg=xxx|0000|i1=x|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE3C0)==0x651B8000) {
		decode_fields32(ENC_FSUBR_Z_P_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->imm = (dec->i1==0) ? FPPointFive(0,dec->esize) : FPOne(0,dec->esize);
		OK(ENC_FSUBR_Z_P_ZS_);
	}
	return rc;
}

/* fsubr_z_p_zz.xml */
int fsubr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class fsubr_z_p_zz_ */
	/* 01100101|size=xx|00|opc<3:1>=001|opc<0>=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x65038000) {
		decode_fields32(ENC_FSUBR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_FSUBR_Z_P_ZZ_);
	}
	return rc;
}

/* ftmad_z_zzi.xml */
int ftmad_z_zzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ftmad_z_zzi_ */
	/* 01100101|size=xx|010|imm3=xxx|100000|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF38FC00)==0x65108000) {
		decode_fields32(ENC_FTMAD_Z_ZZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->imm = UINT(dec->imm3);
		OK(ENC_FTMAD_Z_ZZI_);
	}
	return rc;
}

/* ftsmul_z_zz.xml */
int ftsmul_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ftsmul_z_zz_ */
	/* 01100101|size=xx|0|Zm=xxxxx|000|opc<2:1>=01|opc<0>=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x65000C00) {
		decode_fields32(ENC_FTSMUL_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FTSMUL_Z_ZZ_);
	}
	return rc;
}

/* ftssel_z_zz.xml */
int ftssel_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ftssel_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|10110|op=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x420B000) {
		decode_fields32(ENC_FTSSEL_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_FTSSEL_Z_ZZ_);
	}
	return rc;
}

/* incb_r_rs.xml */
int incb_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class incb_r_rs_ */
	/* 00000100|size=00|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x430E000) {
		decode_fields32(ENC_INCB_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCB_R_RS_);
	}
	/* class incd_r_rs_ */
	/* 00000100|size=11|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0E000) {
		decode_fields32(ENC_INCD_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCD_R_RS_);
	}
	/* class inch_r_rs_ */
	/* 00000100|size=01|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470E000) {
		decode_fields32(ENC_INCH_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCH_R_RS_);
	}
	/* class incw_r_rs_ */
	/* 00000100|size=10|11|imm4=xxxx|11100|D=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0E000) {
		decode_fields32(ENC_INCW_R_RS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCW_R_RS_);
	}
	return rc;
}

/* incd_z_zs.xml */
int incd_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class incd_z_zs_ */
	/* 00000100|size=11|11|imm4=xxxx|11000|D=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0C000) {
		decode_fields32(ENC_INCD_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCD_Z_ZS_);
	}
	/* class inch_z_zs_ */
	/* 00000100|size=01|11|imm4=xxxx|11000|D=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470C000) {
		decode_fields32(ENC_INCH_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCH_Z_ZS_);
	}
	/* class incw_z_zs_ */
	/* 00000100|size=10|11|imm4=xxxx|11000|D=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0C000) {
		decode_fields32(ENC_INCW_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		OK(ENC_INCW_Z_ZS_);
	}
	return rc;
}

/* incp_r_p_r.xml */
int incp_r_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class incp_r_p_r_ */
	/* 00100101|size=xx|1011|op=0|D=0|10001|opc2=00|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252C8800) {
		decode_fields32(ENC_INCP_R_P_R_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		OK(ENC_INCP_R_P_R_);
	}
	return rc;
}

/* incp_z_p_z.xml */
int incp_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class incp_z_p_z_ */
	/* 00100101|size=xx|1011|op=0|D=0|10000|opc2=00|Pm=xxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252C8000) {
		decode_fields32(ENC_INCP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Zdn);
		OK(ENC_INCP_Z_P_Z_);
	}
	return rc;
}

/* index_z_ii.xml */
int index_z_ii(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class index_z_ii_ */
	/* 00000100|size=xx|1|imm5b=xxxxx|010000|imm5=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4204000) {
		decode_fields32(ENC_INDEX_Z_II_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->d = UINT(dec->Zd);
		dec->imm1 = SInt(dec->imm5,5);
		dec->imm2 = SInt(dec->imm5b,5);
		OK(ENC_INDEX_Z_II_);
	}
	return rc;
}

/* index_z_ir.xml */
int index_z_ir(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class index_z_ir_ */
	/* 00000100|size=xx|1|Rm=xxxxx|010010|imm5=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4204800) {
		decode_fields32(ENC_INDEX_Z_IR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Zd);
		dec->imm = SInt(dec->imm5,5);
		OK(ENC_INDEX_Z_IR_);
	}
	return rc;
}

/* index_z_ri.xml */
int index_z_ri(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class index_z_ri_ */
	/* 00000100|size=xx|1|imm5=xxxxx|010001|Rn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4204400) {
		decode_fields32(ENC_INDEX_Z_RI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Rn);
		dec->d = UINT(dec->Zd);
		dec->imm = SInt(dec->imm5,5);
		OK(ENC_INDEX_Z_RI_);
	}
	return rc;
}

/* index_z_rr.xml */
int index_z_rr(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class index_z_rr_ */
	/* 00000100|size=xx|1|Rm=xxxxx|010011|Rn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4204C00) {
		decode_fields32(ENC_INDEX_Z_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Zd);
		OK(ENC_INDEX_Z_RR_);
	}
	return rc;
}

/* insr_z_r.xml */
int insr_z_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class insr_z_r_ */
	/* 00000101|size=xx|100100001110|Rm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5243800) {
		decode_fields32(ENC_INSR_Z_R_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Rm);
		OK(ENC_INSR_Z_R_);
	}
	return rc;
}

/* insr_z_v.xml */
int insr_z_v(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class insr_z_v_ */
	/* 00000101|size=xx|110100001110|Vm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5343800) {
		decode_fields32(ENC_INSR_Z_V_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Vm);
		OK(ENC_INSR_Z_V_);
	}
	return rc;
}

/* lasta_r_p_z.xml */
int lasta_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lasta_r_p_z_ */
	/* 00000101|size=xx|10000|B=0|101|Pg=xxx|Zn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x520A000) {
		decode_fields32(ENC_LASTA_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->rsize = (dec->esize<0x40) ? 0x20 : 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Rd);
		dec->isBefore = FALSE;
		OK(ENC_LASTA_R_P_Z_);
	}
	return rc;
}

/* lasta_v_p_z.xml */
int lasta_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lasta_v_p_z_ */
	/* 00000101|size=xx|10001|B=0|100|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5228000) {
		decode_fields32(ENC_LASTA_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		dec->isBefore = FALSE;
		OK(ENC_LASTA_V_P_Z_);
	}
	return rc;
}

/* lastb_r_p_z.xml */
int lastb_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lastb_r_p_z_ */
	/* 00000101|size=xx|10000|B=1|101|Pg=xxx|Zn=xxxxx|Rd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x521A000) {
		decode_fields32(ENC_LASTB_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->rsize = (dec->esize<0x40) ? 0x20 : 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Rd);
		dec->isBefore = TRUE;
		OK(ENC_LASTB_R_P_Z_);
	}
	return rc;
}

/* lastb_v_p_z.xml */
int lastb_v_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lastb_v_p_z_ */
	/* 00000101|size=xx|10001|B=1|100|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5238000) {
		decode_fields32(ENC_LASTB_V_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		dec->isBefore = TRUE;
		OK(ENC_LASTB_V_P_Z_);
	}
	return rc;
}

/* ld1b_z_p_ai.xml */
int ld1b_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1b_z_p_ai_s */
	/* 1000010|msz=00|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x8420C000) {
		decode_fields32(ENC_LD1B_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1B_Z_P_AI_S);
	}
	/* class ld1b_z_p_ai_d */
	/* 1100010|msz=00|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC420C000) {
		decode_fields32(ENC_LD1B_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1B_Z_P_AI_D);
	}
	return rc;
}

/* ld1b_z_p_bi.xml */
int ld1b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1b_z_p_bi_u8 */
	/* 1010010|dtype<3:1>=000|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA400A000) {
		decode_fields32(ENC_LD1B_Z_P_BI_U8, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1B_Z_P_BI_U8);
	}
	/* class ld1b_z_p_bi_u16 */
	/* 1010010|dtype<3:1>=000|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA420A000) {
		decode_fields32(ENC_LD1B_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1B_Z_P_BI_U16);
	}
	/* class ld1b_z_p_bi_u32 */
	/* 1010010|dtype<3:1>=001|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA440A000) {
		decode_fields32(ENC_LD1B_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1B_Z_P_BI_U32);
	}
	/* class ld1b_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=001|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA460A000) {
		decode_fields32(ENC_LD1B_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1B_Z_P_BI_U64);
	}
	return rc;
}

/* ld1b_z_p_br.xml */
int ld1b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1b_z_p_br_u8 */
	/* 1010010|dtype<3:1>=000|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4004000) {
		decode_fields32(ENC_LD1B_Z_P_BR_U8, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1B_Z_P_BR_U8);
	}
	/* class ld1b_z_p_br_u16 */
	/* 1010010|dtype<3:1>=000|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4204000) {
		decode_fields32(ENC_LD1B_Z_P_BR_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1B_Z_P_BR_U16);
	}
	/* class ld1b_z_p_br_u32 */
	/* 1010010|dtype<3:1>=001|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4404000) {
		decode_fields32(ENC_LD1B_Z_P_BR_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1B_Z_P_BR_U32);
	}
	/* class ld1b_z_p_br_u64 */
	/* 1010010|dtype<3:1>=001|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4604000) {
		decode_fields32(ENC_LD1B_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1B_Z_P_BR_U64);
	}
	return rc;
}

/* ld1b_z_p_bz.xml */
int ld1b_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1b_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4004000) {
		decode_fields32(ENC_LD1B_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1B_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1b_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84004000) {
		decode_fields32(ENC_LD1B_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1B_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ld1b_z_p_bz_d_64_unscaled */
	/* 1100010|msz=00|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC440C000) {
		decode_fields32(ENC_LD1B_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1B_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld1d_z_p_ai.xml */
int ld1d_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1d_z_p_ai_d */
	/* 1100010|msz=11|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5A0C000) {
		decode_fields32(ENC_LD1D_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1D_Z_P_AI_D);
	}
	return rc;
}

/* ld1d_z_p_bi.xml */
int ld1d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1d_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=111|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5E0A000) {
		decode_fields32(ENC_LD1D_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1D_Z_P_BI_U64);
	}
	return rc;
}

/* ld1d_z_p_br.xml */
int ld1d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1d_z_p_br_u64 */
	/* 1010010|dtype<3:1>=111|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5E04000) {
		decode_fields32(ENC_LD1D_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1D_Z_P_BR_U64);
	}
	return rc;
}

/* ld1d_z_p_bz.xml */
int ld1d_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1d_z_p_bz_d_x32_scaled */
	/* 1100010|opc=11|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5A04000) {
		decode_fields32(ENC_LD1D_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 3;
		OK(ENC_LD1D_Z_P_BZ_D_X32_SCALED);
	}
	/* class ld1d_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=11|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5804000) {
		decode_fields32(ENC_LD1D_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1D_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1d_z_p_bz_d_64_scaled */
	/* 1100010|opc=11|11|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5E0C000) {
		decode_fields32(ENC_LD1D_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 3;
		OK(ENC_LD1D_Z_P_BZ_D_64_SCALED);
	}
	/* class ld1d_z_p_bz_d_64_unscaled */
	/* 1100010|msz=11|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5C0C000) {
		decode_fields32(ENC_LD1D_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1D_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld1h_z_p_ai.xml */
int ld1h_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1h_z_p_ai_s */
	/* 1000010|msz=01|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x84A0C000) {
		decode_fields32(ENC_LD1H_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1H_Z_P_AI_S);
	}
	/* class ld1h_z_p_ai_d */
	/* 1100010|msz=01|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4A0C000) {
		decode_fields32(ENC_LD1H_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1H_Z_P_AI_D);
	}
	return rc;
}

/* ld1h_z_p_bi.xml */
int ld1h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1h_z_p_bi_u16 */
	/* 1010010|dtype<3:1>=010|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4A0A000) {
		decode_fields32(ENC_LD1H_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1H_Z_P_BI_U16);
	}
	/* class ld1h_z_p_bi_u32 */
	/* 1010010|dtype<3:1>=011|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4C0A000) {
		decode_fields32(ENC_LD1H_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1H_Z_P_BI_U32);
	}
	/* class ld1h_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=011|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4E0A000) {
		decode_fields32(ENC_LD1H_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1H_Z_P_BI_U64);
	}
	return rc;
}

/* ld1h_z_p_br.xml */
int ld1h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1h_z_p_br_u16 */
	/* 1010010|dtype<3:1>=010|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4A04000) {
		decode_fields32(ENC_LD1H_Z_P_BR_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1H_Z_P_BR_U16);
	}
	/* class ld1h_z_p_br_u32 */
	/* 1010010|dtype<3:1>=011|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4C04000) {
		decode_fields32(ENC_LD1H_Z_P_BR_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1H_Z_P_BR_U32);
	}
	/* class ld1h_z_p_br_u64 */
	/* 1010010|dtype<3:1>=011|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4E04000) {
		decode_fields32(ENC_LD1H_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1H_Z_P_BR_U64);
	}
	return rc;
}

/* ld1h_z_p_bz.xml */
int ld1h_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1h_z_p_bz_s_x32_scaled */
	/* 100001001|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84A04000) {
		decode_fields32(ENC_LD1H_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LD1H_Z_P_BZ_S_X32_SCALED);
	}
	/* class ld1h_z_p_bz_d_x32_scaled */
	/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4A04000) {
		decode_fields32(ENC_LD1H_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LD1H_Z_P_BZ_D_X32_SCALED);
	}
	/* class ld1h_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4804000) {
		decode_fields32(ENC_LD1H_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1H_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1h_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84804000) {
		decode_fields32(ENC_LD1H_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1H_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ld1h_z_p_bz_d_64_scaled */
	/* 1100010|opc=01|11|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4E0C000) {
		decode_fields32(ENC_LD1H_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 1;
		OK(ENC_LD1H_Z_P_BZ_D_64_SCALED);
	}
	/* class ld1h_z_p_bz_d_64_unscaled */
	/* 1100010|msz=01|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4C0C000) {
		decode_fields32(ENC_LD1H_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1H_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld1rb_z_p_bi.xml */
int ld1rb_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rb_z_p_bi_u8 */
	/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x84408000) {
		decode_fields32(ENC_LD1RB_Z_P_BI_U8, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RB_Z_P_BI_U8);
	}
	/* class ld1rb_z_p_bi_u16 */
	/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x8440A000) {
		decode_fields32(ENC_LD1RB_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RB_Z_P_BI_U16);
	}
	/* class ld1rb_z_p_bi_u32 */
	/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x8440C000) {
		decode_fields32(ENC_LD1RB_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RB_Z_P_BI_U32);
	}
	/* class ld1rb_z_p_bi_u64 */
	/* 1000010|dtypeh=00|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x8440E000) {
		decode_fields32(ENC_LD1RB_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RB_Z_P_BI_U64);
	}
	return rc;
}

/* ld1rd_z_p_bi.xml */
int ld1rd_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rd_z_p_bi_u64 */
	/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x85C0E000) {
		decode_fields32(ENC_LD1RD_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RD_Z_P_BI_U64);
	}
	return rc;
}

/* ld1rh_z_p_bi.xml */
int ld1rh_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rh_z_p_bi_u16 */
	/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x84C0A000) {
		decode_fields32(ENC_LD1RH_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RH_Z_P_BI_U16);
	}
	/* class ld1rh_z_p_bi_u32 */
	/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x84C0C000) {
		decode_fields32(ENC_LD1RH_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RH_Z_P_BI_U32);
	}
	/* class ld1rh_z_p_bi_u64 */
	/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x84C0E000) {
		decode_fields32(ENC_LD1RH_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RH_Z_P_BI_U64);
	}
	return rc;
}

/* ld1rob_z_p_bi.xml */
int ld1rob_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rob_z_p_bi_u8 */
	/* 1010010|msz=00|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4202000) {
		decode_fields32(ENC_LD1ROB_Z_P_BI_U8, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1ROB_Z_P_BI_U8);
	}
	return rc;
}

/* ld1rob_z_p_br.xml */
int ld1rob_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rob_z_p_br_contiguous */
	/* 1010010|msz=00|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4200000) {
		decode_fields32(ENC_LD1ROB_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		OK(ENC_LD1ROB_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1rod_z_p_bi.xml */
int ld1rod_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rod_z_p_bi_u64 */
	/* 1010010|msz=11|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5A02000) {
		decode_fields32(ENC_LD1ROD_Z_P_BI_U64, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1ROD_Z_P_BI_U64);
	}
	return rc;
}

/* ld1rod_z_p_br.xml */
int ld1rod_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rod_z_p_br_contiguous */
	/* 1010010|msz=11|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5A00000) {
		decode_fields32(ENC_LD1ROD_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		OK(ENC_LD1ROD_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1roh_z_p_bi.xml */
int ld1roh_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1roh_z_p_bi_u16 */
	/* 1010010|msz=01|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4A02000) {
		decode_fields32(ENC_LD1ROH_Z_P_BI_U16, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1ROH_Z_P_BI_U16);
	}
	return rc;
}

/* ld1roh_z_p_br.xml */
int ld1roh_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1roh_z_p_br_contiguous */
	/* 1010010|msz=01|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4A00000) {
		decode_fields32(ENC_LD1ROH_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		OK(ENC_LD1ROH_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1row_z_p_bi.xml */
int ld1row_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1row_z_p_bi_u32 */
	/* 1010010|msz=10|ssz=01|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5202000) {
		decode_fields32(ENC_LD1ROW_Z_P_BI_U32, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1ROW_Z_P_BI_U32);
	}
	return rc;
}

/* ld1row_z_p_br.xml */
int ld1row_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1row_z_p_br_contiguous */
	/* 1010010|msz=10|ssz=01|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5200000) {
		decode_fields32(ENC_LD1ROW_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		OK(ENC_LD1ROW_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1rqb_z_p_bi.xml */
int ld1rqb_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqb_z_p_bi_u8 */
	/* 1010010|msz=00|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4002000) {
		decode_fields32(ENC_LD1RQB_Z_P_BI_U8, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1RQB_Z_P_BI_U8);
	}
	return rc;
}

/* ld1rqb_z_p_br.xml */
int ld1rqb_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqb_z_p_br_contiguous */
	/* 1010010|msz=00|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4000000) {
		decode_fields32(ENC_LD1RQB_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		OK(ENC_LD1RQB_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1rqd_z_p_bi.xml */
int ld1rqd_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqd_z_p_bi_u64 */
	/* 1010010|msz=11|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5802000) {
		decode_fields32(ENC_LD1RQD_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1RQD_Z_P_BI_U64);
	}
	return rc;
}

/* ld1rqd_z_p_br.xml */
int ld1rqd_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqd_z_p_br_contiguous */
	/* 1010010|msz=11|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5800000) {
		decode_fields32(ENC_LD1RQD_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		OK(ENC_LD1RQD_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1rqh_z_p_bi.xml */
int ld1rqh_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqh_z_p_bi_u16 */
	/* 1010010|msz=01|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4802000) {
		decode_fields32(ENC_LD1RQH_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1RQH_Z_P_BI_U16);
	}
	return rc;
}

/* ld1rqh_z_p_br.xml */
int ld1rqh_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqh_z_p_br_contiguous */
	/* 1010010|msz=01|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4800000) {
		decode_fields32(ENC_LD1RQH_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		OK(ENC_LD1RQH_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1rqw_z_p_bi.xml */
int ld1rqw_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqw_z_p_bi_u32 */
	/* 1010010|msz=10|ssz=00|0|imm4=xxxx|001|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5002000) {
		decode_fields32(ENC_LD1RQW_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1RQW_Z_P_BI_U32);
	}
	return rc;
}

/* ld1rqw_z_p_br.xml */
int ld1rqw_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rqw_z_p_br_contiguous */
	/* 1010010|msz=10|ssz=00|Rm=xxxxx|000|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5000000) {
		decode_fields32(ENC_LD1RQW_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		OK(ENC_LD1RQW_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld1rsb_z_p_bi.xml */
int ld1rsb_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rsb_z_p_bi_s16 */
	/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x85C0C000) {
		decode_fields32(ENC_LD1RSB_Z_P_BI_S16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RSB_Z_P_BI_S16);
	}
	/* class ld1rsb_z_p_bi_s32 */
	/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x85C0A000) {
		decode_fields32(ENC_LD1RSB_Z_P_BI_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RSB_Z_P_BI_S32);
	}
	/* class ld1rsb_z_p_bi_s64 */
	/* 1000010|dtypeh=11|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x85C08000) {
		decode_fields32(ENC_LD1RSB_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RSB_Z_P_BI_S64);
	}
	return rc;
}

/* ld1rsh_z_p_bi.xml */
int ld1rsh_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rsh_z_p_bi_s32 */
	/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=01|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x8540A000) {
		decode_fields32(ENC_LD1RSH_Z_P_BI_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RSH_Z_P_BI_S32);
	}
	/* class ld1rsh_z_p_bi_s64 */
	/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x85408000) {
		decode_fields32(ENC_LD1RSH_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RSH_Z_P_BI_S64);
	}
	return rc;
}

/* ld1rsw_z_p_bi.xml */
int ld1rsw_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rsw_z_p_bi_s64 */
	/* 1000010|dtypeh=01|1|imm6=xxxxxx|1|dtypel=00|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x84C08000) {
		decode_fields32(ENC_LD1RSW_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RSW_Z_P_BI_S64);
	}
	return rc;
}

/* ld1rw_z_p_bi.xml */
int ld1rw_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1rw_z_p_bi_u32 */
	/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=10|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x8540C000) {
		decode_fields32(ENC_LD1RW_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RW_Z_P_BI_U32);
	}
	/* class ld1rw_z_p_bi_u64 */
	/* 1000010|dtypeh=10|1|imm6=xxxxxx|1|dtypel=11|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x8540E000) {
		decode_fields32(ENC_LD1RW_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm6);
		OK(ENC_LD1RW_Z_P_BI_U64);
	}
	return rc;
}

/* ld1sb_z_p_ai.xml */
int ld1sb_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sb_z_p_ai_s */
	/* 1000010|msz=00|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x84208000) {
		decode_fields32(ENC_LD1SB_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1SB_Z_P_AI_S);
	}
	/* class ld1sb_z_p_ai_d */
	/* 1100010|msz=00|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4208000) {
		decode_fields32(ENC_LD1SB_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1SB_Z_P_AI_D);
	}
	return rc;
}

/* ld1sb_z_p_bi.xml */
int ld1sb_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sb_z_p_bi_s16 */
	/* 1010010|dtype<3:1>=111|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5C0A000) {
		decode_fields32(ENC_LD1SB_Z_P_BI_S16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1SB_Z_P_BI_S16);
	}
	/* class ld1sb_z_p_bi_s32 */
	/* 1010010|dtype<3:1>=110|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5A0A000) {
		decode_fields32(ENC_LD1SB_Z_P_BI_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1SB_Z_P_BI_S32);
	}
	/* class ld1sb_z_p_bi_s64 */
	/* 1010010|dtype<3:1>=110|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA580A000) {
		decode_fields32(ENC_LD1SB_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1SB_Z_P_BI_S64);
	}
	return rc;
}

/* ld1sb_z_p_br.xml */
int ld1sb_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sb_z_p_br_s16 */
	/* 1010010|dtype<3:1>=111|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5C04000) {
		decode_fields32(ENC_LD1SB_Z_P_BR_S16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		OK(ENC_LD1SB_Z_P_BR_S16);
	}
	/* class ld1sb_z_p_br_s32 */
	/* 1010010|dtype<3:1>=110|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5A04000) {
		decode_fields32(ENC_LD1SB_Z_P_BR_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		OK(ENC_LD1SB_Z_P_BR_S32);
	}
	/* class ld1sb_z_p_br_s64 */
	/* 1010010|dtype<3:1>=110|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5804000) {
		decode_fields32(ENC_LD1SB_Z_P_BR_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		OK(ENC_LD1SB_Z_P_BR_S64);
	}
	return rc;
}

/* ld1sb_z_p_bz.xml */
int ld1sb_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sb_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4000000) {
		decode_fields32(ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1SB_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1sb_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84000000) {
		decode_fields32(ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1SB_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ld1sb_z_p_bz_d_64_unscaled */
	/* 1100010|msz=00|10|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4408000) {
		decode_fields32(ENC_LD1SB_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1SB_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld1sh_z_p_ai.xml */
int ld1sh_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sh_z_p_ai_s */
	/* 1000010|msz=01|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x84A08000) {
		decode_fields32(ENC_LD1SH_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1SH_Z_P_AI_S);
	}
	/* class ld1sh_z_p_ai_d */
	/* 1100010|msz=01|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4A08000) {
		decode_fields32(ENC_LD1SH_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1SH_Z_P_AI_D);
	}
	return rc;
}

/* ld1sh_z_p_bi.xml */
int ld1sh_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sh_z_p_bi_s32 */
	/* 1010010|dtype<3:1>=100|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA520A000) {
		decode_fields32(ENC_LD1SH_Z_P_BI_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1SH_Z_P_BI_S32);
	}
	/* class ld1sh_z_p_bi_s64 */
	/* 1010010|dtype<3:1>=100|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA500A000) {
		decode_fields32(ENC_LD1SH_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1SH_Z_P_BI_S64);
	}
	return rc;
}

/* ld1sh_z_p_br.xml */
int ld1sh_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sh_z_p_br_s32 */
	/* 1010010|dtype<3:1>=100|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5204000) {
		decode_fields32(ENC_LD1SH_Z_P_BR_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		OK(ENC_LD1SH_Z_P_BR_S32);
	}
	/* class ld1sh_z_p_br_s64 */
	/* 1010010|dtype<3:1>=100|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5004000) {
		decode_fields32(ENC_LD1SH_Z_P_BR_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		OK(ENC_LD1SH_Z_P_BR_S64);
	}
	return rc;
}

/* ld1sh_z_p_bz.xml */
int ld1sh_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sh_z_p_bz_s_x32_scaled */
	/* 100001001|xs=x|1|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84A00000) {
		decode_fields32(ENC_LD1SH_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LD1SH_Z_P_BZ_S_X32_SCALED);
	}
	/* class ld1sh_z_p_bz_d_x32_scaled */
	/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4A00000) {
		decode_fields32(ENC_LD1SH_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LD1SH_Z_P_BZ_D_X32_SCALED);
	}
	/* class ld1sh_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4800000) {
		decode_fields32(ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1SH_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1sh_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84800000) {
		decode_fields32(ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1SH_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ld1sh_z_p_bz_d_64_scaled */
	/* 1100010|opc=01|11|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4E08000) {
		decode_fields32(ENC_LD1SH_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 1;
		OK(ENC_LD1SH_Z_P_BZ_D_64_SCALED);
	}
	/* class ld1sh_z_p_bz_d_64_unscaled */
	/* 1100010|msz=01|10|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4C08000) {
		decode_fields32(ENC_LD1SH_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1SH_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld1sw_z_p_ai.xml */
int ld1sw_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sw_z_p_ai_d */
	/* 1100010|msz=10|01|imm5=xxxxx|1|U=0|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5208000) {
		decode_fields32(ENC_LD1SW_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1SW_Z_P_AI_D);
	}
	return rc;
}

/* ld1sw_z_p_bi.xml */
int ld1sw_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sw_z_p_bi_s64 */
	/* 1010010|dtype<3:1>=010|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA480A000) {
		decode_fields32(ENC_LD1SW_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1SW_Z_P_BI_S64);
	}
	return rc;
}

/* ld1sw_z_p_br.xml */
int ld1sw_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sw_z_p_br_s64 */
	/* 1010010|dtype<3:1>=010|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4804000) {
		decode_fields32(ENC_LD1SW_Z_P_BR_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		OK(ENC_LD1SW_Z_P_BR_S64);
	}
	return rc;
}

/* ld1sw_z_p_bz.xml */
int ld1sw_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1sw_z_p_bz_d_x32_scaled */
	/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5200000) {
		decode_fields32(ENC_LD1SW_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_LD1SW_Z_P_BZ_D_X32_SCALED);
	}
	/* class ld1sw_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5000000) {
		decode_fields32(ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1SW_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1sw_z_p_bz_d_64_scaled */
	/* 1100010|opc=10|11|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5608000) {
		decode_fields32(ENC_LD1SW_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 2;
		OK(ENC_LD1SW_Z_P_BZ_D_64_SCALED);
	}
	/* class ld1sw_z_p_bz_d_64_unscaled */
	/* 1100010|msz=10|10|Zm=xxxxx|1|U=0|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5408000) {
		decode_fields32(ENC_LD1SW_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1SW_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld1w_z_p_ai.xml */
int ld1w_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1w_z_p_ai_s */
	/* 1000010|msz=10|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x8520C000) {
		decode_fields32(ENC_LD1W_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1W_Z_P_AI_S);
	}
	/* class ld1w_z_p_ai_d */
	/* 1100010|msz=10|01|imm5=xxxxx|1|U=1|ff=0|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC520C000) {
		decode_fields32(ENC_LD1W_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LD1W_Z_P_AI_D);
	}
	return rc;
}

/* ld1w_z_p_bi.xml */
int ld1w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1w_z_p_bi_u32 */
	/* 1010010|dtype<3:1>=101|dtype<0>=0|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA540A000) {
		decode_fields32(ENC_LD1W_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1W_Z_P_BI_U32);
	}
	/* class ld1w_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=101|dtype<0>=1|0|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA560A000) {
		decode_fields32(ENC_LD1W_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LD1W_Z_P_BI_U64);
	}
	return rc;
}

/* ld1w_z_p_br.xml */
int ld1w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1w_z_p_br_u32 */
	/* 1010010|dtype<3:1>=101|dtype<0>=0|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5404000) {
		decode_fields32(ENC_LD1W_Z_P_BR_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1W_Z_P_BR_U32);
	}
	/* class ld1w_z_p_br_u64 */
	/* 1010010|dtype<3:1>=101|dtype<0>=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5604000) {
		decode_fields32(ENC_LD1W_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		OK(ENC_LD1W_Z_P_BR_U64);
	}
	return rc;
}

/* ld1w_z_p_bz.xml */
int ld1w_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld1w_z_p_bz_s_x32_scaled */
	/* 100001010|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x85204000) {
		decode_fields32(ENC_LD1W_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_LD1W_Z_P_BZ_S_X32_SCALED);
	}
	/* class ld1w_z_p_bz_d_x32_scaled */
	/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5204000) {
		decode_fields32(ENC_LD1W_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_LD1W_Z_P_BZ_D_X32_SCALED);
	}
	/* class ld1w_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5004000) {
		decode_fields32(ENC_LD1W_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1W_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ld1w_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=10|xs=x|0|Zm=xxxxx|0|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x85004000) {
		decode_fields32(ENC_LD1W_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LD1W_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ld1w_z_p_bz_d_64_scaled */
	/* 1100010|opc=10|11|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC560C000) {
		decode_fields32(ENC_LD1W_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 2;
		OK(ENC_LD1W_Z_P_BZ_D_64_SCALED);
	}
	/* class ld1w_z_p_bz_d_64_unscaled */
	/* 1100010|msz=10|10|Zm=xxxxx|1|U=1|ff=0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC540C000) {
		decode_fields32(ENC_LD1W_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LD1W_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ld2b_z_p_bi.xml */
int ld2b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2b_z_p_bi_contiguous */
	/* 1010010|msz=00|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA420E000) {
		decode_fields32(ENC_LD2B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_LD2B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld2b_z_p_br.xml */
int ld2b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2b_z_p_br_contiguous */
	/* 1010010|msz=00|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA420C000) {
		decode_fields32(ENC_LD2B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->nreg = 2;
		OK(ENC_LD2B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld2d_z_p_bi.xml */
int ld2d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2d_z_p_bi_contiguous */
	/* 1010010|msz=11|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5A0E000) {
		decode_fields32(ENC_LD2D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_LD2D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld2d_z_p_br.xml */
int ld2d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2d_z_p_br_contiguous */
	/* 1010010|msz=11|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5A0C000) {
		decode_fields32(ENC_LD2D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->nreg = 2;
		OK(ENC_LD2D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld2h_z_p_bi.xml */
int ld2h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2h_z_p_bi_contiguous */
	/* 1010010|msz=01|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4A0E000) {
		decode_fields32(ENC_LD2H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_LD2H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld2h_z_p_br.xml */
int ld2h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2h_z_p_br_contiguous */
	/* 1010010|msz=01|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4A0C000) {
		decode_fields32(ENC_LD2H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->nreg = 2;
		OK(ENC_LD2H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld2w_z_p_bi.xml */
int ld2w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2w_z_p_bi_contiguous */
	/* 1010010|msz=10|opc=01|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA520E000) {
		decode_fields32(ENC_LD2W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_LD2W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld2w_z_p_br.xml */
int ld2w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld2w_z_p_br_contiguous */
	/* 1010010|msz=10|opc=01|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA520C000) {
		decode_fields32(ENC_LD2W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->nreg = 2;
		OK(ENC_LD2W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld3b_z_p_bi.xml */
int ld3b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3b_z_p_bi_contiguous */
	/* 1010010|msz=00|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA440E000) {
		decode_fields32(ENC_LD3B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_LD3B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld3b_z_p_br.xml */
int ld3b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3b_z_p_br_contiguous */
	/* 1010010|msz=00|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA440C000) {
		decode_fields32(ENC_LD3B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->nreg = 3;
		OK(ENC_LD3B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld3d_z_p_bi.xml */
int ld3d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3d_z_p_bi_contiguous */
	/* 1010010|msz=11|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5C0E000) {
		decode_fields32(ENC_LD3D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_LD3D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld3d_z_p_br.xml */
int ld3d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3d_z_p_br_contiguous */
	/* 1010010|msz=11|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5C0C000) {
		decode_fields32(ENC_LD3D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->nreg = 3;
		OK(ENC_LD3D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld3h_z_p_bi.xml */
int ld3h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3h_z_p_bi_contiguous */
	/* 1010010|msz=01|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4C0E000) {
		decode_fields32(ENC_LD3H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_LD3H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld3h_z_p_br.xml */
int ld3h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3h_z_p_br_contiguous */
	/* 1010010|msz=01|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4C0C000) {
		decode_fields32(ENC_LD3H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->nreg = 3;
		OK(ENC_LD3H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld3w_z_p_bi.xml */
int ld3w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3w_z_p_bi_contiguous */
	/* 1010010|msz=10|opc=10|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA540E000) {
		decode_fields32(ENC_LD3W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_LD3W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld3w_z_p_br.xml */
int ld3w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld3w_z_p_br_contiguous */
	/* 1010010|msz=10|opc=10|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA540C000) {
		decode_fields32(ENC_LD3W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->nreg = 3;
		OK(ENC_LD3W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld4b_z_p_bi.xml */
int ld4b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4b_z_p_bi_contiguous */
	/* 1010010|msz=00|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA460E000) {
		decode_fields32(ENC_LD4B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_LD4B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld4b_z_p_br.xml */
int ld4b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4b_z_p_br_contiguous */
	/* 1010010|msz=00|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA460C000) {
		decode_fields32(ENC_LD4B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->nreg = 4;
		OK(ENC_LD4B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld4d_z_p_bi.xml */
int ld4d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4d_z_p_bi_contiguous */
	/* 1010010|msz=11|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5E0E000) {
		decode_fields32(ENC_LD4D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_LD4D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld4d_z_p_br.xml */
int ld4d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4d_z_p_br_contiguous */
	/* 1010010|msz=11|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5E0C000) {
		decode_fields32(ENC_LD4D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->nreg = 4;
		OK(ENC_LD4D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld4h_z_p_bi.xml */
int ld4h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4h_z_p_bi_contiguous */
	/* 1010010|msz=01|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4E0E000) {
		decode_fields32(ENC_LD4H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_LD4H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld4h_z_p_br.xml */
int ld4h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4h_z_p_br_contiguous */
	/* 1010010|msz=01|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4E0C000) {
		decode_fields32(ENC_LD4H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->nreg = 4;
		OK(ENC_LD4H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ld4w_z_p_bi.xml */
int ld4w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4w_z_p_bi_contiguous */
	/* 1010010|msz=10|opc=11|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA560E000) {
		decode_fields32(ENC_LD4W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_LD4W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ld4w_z_p_br.xml */
int ld4w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ld4w_z_p_br_contiguous */
	/* 1010010|msz=10|opc=11|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA560C000) {
		decode_fields32(ENC_LD4W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->nreg = 4;
		OK(ENC_LD4W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ldff1b_z_p_ai.xml */
int ldff1b_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1b_z_p_ai_s */
	/* 1000010|msz=00|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x8420E000) {
		decode_fields32(ENC_LDFF1B_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1B_Z_P_AI_S);
	}
	/* class ldff1b_z_p_ai_d */
	/* 1100010|msz=00|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC420E000) {
		decode_fields32(ENC_LDFF1B_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1B_Z_P_AI_D);
	}
	return rc;
}

/* ldff1b_z_p_br.xml */
int ldff1b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1b_z_p_br_u8 */
	/* 1010010|dtype<3:1>=000|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4006000) {
		decode_fields32(ENC_LDFF1B_Z_P_BR_U8, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1B_Z_P_BR_U8);
	}
	/* class ldff1b_z_p_br_u16 */
	/* 1010010|dtype<3:1>=000|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4206000) {
		decode_fields32(ENC_LDFF1B_Z_P_BR_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1B_Z_P_BR_U16);
	}
	/* class ldff1b_z_p_br_u32 */
	/* 1010010|dtype<3:1>=001|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4406000) {
		decode_fields32(ENC_LDFF1B_Z_P_BR_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1B_Z_P_BR_U32);
	}
	/* class ldff1b_z_p_br_u64 */
	/* 1010010|dtype<3:1>=001|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4606000) {
		decode_fields32(ENC_LDFF1B_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1B_Z_P_BR_U64);
	}
	return rc;
}

/* ldff1b_z_p_bz.xml */
int ldff1b_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1b_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4006000) {
		decode_fields32(ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1B_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1b_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84006000) {
		decode_fields32(ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1B_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ldff1b_z_p_bz_d_64_unscaled */
	/* 1100010|msz=00|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC440E000) {
		decode_fields32(ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1B_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldff1d_z_p_ai.xml */
int ldff1d_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1d_z_p_ai_d */
	/* 1100010|msz=11|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5A0E000) {
		decode_fields32(ENC_LDFF1D_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1D_Z_P_AI_D);
	}
	return rc;
}

/* ldff1d_z_p_br.xml */
int ldff1d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1d_z_p_br_u64 */
	/* 1010010|dtype<3:1>=111|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5E06000) {
		decode_fields32(ENC_LDFF1D_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1D_Z_P_BR_U64);
	}
	return rc;
}

/* ldff1d_z_p_bz.xml */
int ldff1d_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1d_z_p_bz_d_x32_scaled */
	/* 1100010|opc=11|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5A06000) {
		decode_fields32(ENC_LDFF1D_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 3;
		OK(ENC_LDFF1D_Z_P_BZ_D_X32_SCALED);
	}
	/* class ldff1d_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=11|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5806000) {
		decode_fields32(ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1D_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1d_z_p_bz_d_64_scaled */
	/* 1100010|opc=11|11|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5E0E000) {
		decode_fields32(ENC_LDFF1D_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 3;
		OK(ENC_LDFF1D_Z_P_BZ_D_64_SCALED);
	}
	/* class ldff1d_z_p_bz_d_64_unscaled */
	/* 1100010|msz=11|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC5C0E000) {
		decode_fields32(ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1D_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldff1h_z_p_ai.xml */
int ldff1h_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1h_z_p_ai_s */
	/* 1000010|msz=01|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x84A0E000) {
		decode_fields32(ENC_LDFF1H_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1H_Z_P_AI_S);
	}
	/* class ldff1h_z_p_ai_d */
	/* 1100010|msz=01|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4A0E000) {
		decode_fields32(ENC_LDFF1H_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1H_Z_P_AI_D);
	}
	return rc;
}

/* ldff1h_z_p_br.xml */
int ldff1h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1h_z_p_br_u16 */
	/* 1010010|dtype<3:1>=010|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4A06000) {
		decode_fields32(ENC_LDFF1H_Z_P_BR_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1H_Z_P_BR_U16);
	}
	/* class ldff1h_z_p_br_u32 */
	/* 1010010|dtype<3:1>=011|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4C06000) {
		decode_fields32(ENC_LDFF1H_Z_P_BR_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1H_Z_P_BR_U32);
	}
	/* class ldff1h_z_p_br_u64 */
	/* 1010010|dtype<3:1>=011|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4E06000) {
		decode_fields32(ENC_LDFF1H_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1H_Z_P_BR_U64);
	}
	return rc;
}

/* ldff1h_z_p_bz.xml */
int ldff1h_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1h_z_p_bz_s_x32_scaled */
	/* 100001001|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84A06000) {
		decode_fields32(ENC_LDFF1H_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LDFF1H_Z_P_BZ_S_X32_SCALED);
	}
	/* class ldff1h_z_p_bz_d_x32_scaled */
	/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4A06000) {
		decode_fields32(ENC_LDFF1H_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LDFF1H_Z_P_BZ_D_X32_SCALED);
	}
	/* class ldff1h_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4806000) {
		decode_fields32(ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1H_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1h_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84806000) {
		decode_fields32(ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1H_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ldff1h_z_p_bz_d_64_scaled */
	/* 1100010|opc=01|11|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4E0E000) {
		decode_fields32(ENC_LDFF1H_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 1;
		OK(ENC_LDFF1H_Z_P_BZ_D_64_SCALED);
	}
	/* class ldff1h_z_p_bz_d_64_unscaled */
	/* 1100010|msz=01|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4C0E000) {
		decode_fields32(ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1H_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldff1sb_z_p_ai.xml */
int ldff1sb_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sb_z_p_ai_s */
	/* 1000010|msz=00|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x8420A000) {
		decode_fields32(ENC_LDFF1SB_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1SB_Z_P_AI_S);
	}
	/* class ldff1sb_z_p_ai_d */
	/* 1100010|msz=00|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC420A000) {
		decode_fields32(ENC_LDFF1SB_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1SB_Z_P_AI_D);
	}
	return rc;
}

/* ldff1sb_z_p_br.xml */
int ldff1sb_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sb_z_p_br_s16 */
	/* 1010010|dtype<3:1>=111|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5C06000) {
		decode_fields32(ENC_LDFF1SB_Z_P_BR_S16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		OK(ENC_LDFF1SB_Z_P_BR_S16);
	}
	/* class ldff1sb_z_p_br_s32 */
	/* 1010010|dtype<3:1>=110|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5A06000) {
		decode_fields32(ENC_LDFF1SB_Z_P_BR_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		OK(ENC_LDFF1SB_Z_P_BR_S32);
	}
	/* class ldff1sb_z_p_br_s64 */
	/* 1010010|dtype<3:1>=110|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5806000) {
		decode_fields32(ENC_LDFF1SB_Z_P_BR_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		OK(ENC_LDFF1SB_Z_P_BR_S64);
	}
	return rc;
}

/* ldff1sb_z_p_bz.xml */
int ldff1sb_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sb_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=00|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4002000) {
		decode_fields32(ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1SB_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1sb_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=00|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84002000) {
		decode_fields32(ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1SB_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ldff1sb_z_p_bz_d_64_unscaled */
	/* 1100010|msz=00|10|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC440A000) {
		decode_fields32(ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1SB_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldff1sh_z_p_ai.xml */
int ldff1sh_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sh_z_p_ai_s */
	/* 1000010|msz=01|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x84A0A000) {
		decode_fields32(ENC_LDFF1SH_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1SH_Z_P_AI_S);
	}
	/* class ldff1sh_z_p_ai_d */
	/* 1100010|msz=01|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4A0A000) {
		decode_fields32(ENC_LDFF1SH_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1SH_Z_P_AI_D);
	}
	return rc;
}

/* ldff1sh_z_p_br.xml */
int ldff1sh_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sh_z_p_br_s32 */
	/* 1010010|dtype<3:1>=100|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5206000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BR_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		OK(ENC_LDFF1SH_Z_P_BR_S32);
	}
	/* class ldff1sh_z_p_br_s64 */
	/* 1010010|dtype<3:1>=100|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5006000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BR_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		OK(ENC_LDFF1SH_Z_P_BR_S64);
	}
	return rc;
}

/* ldff1sh_z_p_bz.xml */
int ldff1sh_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sh_z_p_bz_s_x32_scaled */
	/* 100001001|xs=x|1|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84A02000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LDFF1SH_Z_P_BZ_S_X32_SCALED);
	}
	/* class ldff1sh_z_p_bz_d_x32_scaled */
	/* 1100010|opc=01|xs=x|1|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4A02000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_LDFF1SH_Z_P_BZ_D_X32_SCALED);
	}
	/* class ldff1sh_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=01|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC4802000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1SH_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1sh_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=01|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x84802000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1SH_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ldff1sh_z_p_bz_d_64_scaled */
	/* 1100010|opc=01|11|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4E0A000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 1;
		OK(ENC_LDFF1SH_Z_P_BZ_D_64_SCALED);
	}
	/* class ldff1sh_z_p_bz_d_64_unscaled */
	/* 1100010|msz=01|10|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC4C0A000) {
		decode_fields32(ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1SH_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldff1sw_z_p_ai.xml */
int ldff1sw_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sw_z_p_ai_d */
	/* 1100010|msz=10|01|imm5=xxxxx|1|U=0|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC520A000) {
		decode_fields32(ENC_LDFF1SW_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1SW_Z_P_AI_D);
	}
	return rc;
}

/* ldff1sw_z_p_br.xml */
int ldff1sw_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sw_z_p_br_s64 */
	/* 1010010|dtype<3:1>=010|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA4806000) {
		decode_fields32(ENC_LDFF1SW_Z_P_BR_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		OK(ENC_LDFF1SW_Z_P_BR_S64);
	}
	return rc;
}

/* ldff1sw_z_p_bz.xml */
int ldff1sw_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1sw_z_p_bz_d_x32_scaled */
	/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5202000) {
		decode_fields32(ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_LDFF1SW_Z_P_BZ_D_X32_SCALED);
	}
	/* class ldff1sw_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5002000) {
		decode_fields32(ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1SW_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1sw_z_p_bz_d_64_scaled */
	/* 1100010|opc=10|11|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC560A000) {
		decode_fields32(ENC_LDFF1SW_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 2;
		OK(ENC_LDFF1SW_Z_P_BZ_D_64_SCALED);
	}
	/* class ldff1sw_z_p_bz_d_64_unscaled */
	/* 1100010|msz=10|10|Zm=xxxxx|1|U=0|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC540A000) {
		decode_fields32(ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = FALSE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1SW_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldff1w_z_p_ai.xml */
int ldff1w_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1w_z_p_ai_s */
	/* 1000010|msz=10|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0x8520E000) {
		decode_fields32(ENC_LDFF1W_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1W_Z_P_AI_S);
	}
	/* class ldff1w_z_p_ai_d */
	/* 1100010|msz=10|01|imm5=xxxxx|1|U=1|ff=1|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC520E000) {
		decode_fields32(ENC_LDFF1W_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = UINT(dec->imm5);
		OK(ENC_LDFF1W_Z_P_AI_D);
	}
	return rc;
}

/* ldff1w_z_p_br.xml */
int ldff1w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1w_z_p_br_u32 */
	/* 1010010|dtype<3:1>=101|dtype<0>=0|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5406000) {
		decode_fields32(ENC_LDFF1W_Z_P_BR_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1W_Z_P_BR_U32);
	}
	/* class ldff1w_z_p_br_u64 */
	/* 1010010|dtype<3:1>=101|dtype<0>=1|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA5606000) {
		decode_fields32(ENC_LDFF1W_Z_P_BR_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		OK(ENC_LDFF1W_Z_P_BR_U64);
	}
	return rc;
}

/* ldff1w_z_p_bz.xml */
int ldff1w_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldff1w_z_p_bz_s_x32_scaled */
	/* 100001010|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x85206000) {
		decode_fields32(ENC_LDFF1W_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_LDFF1W_Z_P_BZ_S_X32_SCALED);
	}
	/* class ldff1w_z_p_bz_d_x32_scaled */
	/* 1100010|opc=10|xs=x|1|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5206000) {
		decode_fields32(ENC_LDFF1W_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_LDFF1W_Z_P_BZ_D_X32_SCALED);
	}
	/* class ldff1w_z_p_bz_d_x32_unscaled */
	/* 1100010|msz=10|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0xC5006000) {
		decode_fields32(ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1W_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class ldff1w_z_p_bz_s_x32_unscaled */
	/* 1000010|opc=10|xs=x|0|Zm=xxxxx|0|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFA0E000)==0x85006000) {
		decode_fields32(ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_LDFF1W_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class ldff1w_z_p_bz_d_64_scaled */
	/* 1100010|opc=10|11|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC560E000) {
		decode_fields32(ENC_LDFF1W_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 2;
		OK(ENC_LDFF1W_Z_P_BZ_D_64_SCALED);
	}
	/* class ldff1w_z_p_bz_d_64_unscaled */
	/* 1100010|msz=10|10|Zm=xxxxx|1|U=1|ff=1|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xC540E000) {
		decode_fields32(ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->unsigned_ = TRUE;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_LDFF1W_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* ldnf1b_z_p_bi.xml */
int ldnf1b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1b_z_p_bi_u8 */
	/* 1010010|dtype<3:1>=000|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA410A000) {
		decode_fields32(ENC_LDNF1B_Z_P_BI_U8, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1B_Z_P_BI_U8);
	}
	/* class ldnf1b_z_p_bi_u16 */
	/* 1010010|dtype<3:1>=000|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA430A000) {
		decode_fields32(ENC_LDNF1B_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1B_Z_P_BI_U16);
	}
	/* class ldnf1b_z_p_bi_u32 */
	/* 1010010|dtype<3:1>=001|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA450A000) {
		decode_fields32(ENC_LDNF1B_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1B_Z_P_BI_U32);
	}
	/* class ldnf1b_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=001|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA470A000) {
		decode_fields32(ENC_LDNF1B_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1B_Z_P_BI_U64);
	}
	return rc;
}

/* ldnf1d_z_p_bi.xml */
int ldnf1d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1d_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=111|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5F0A000) {
		decode_fields32(ENC_LDNF1D_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1D_Z_P_BI_U64);
	}
	return rc;
}

/* ldnf1h_z_p_bi.xml */
int ldnf1h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1h_z_p_bi_u16 */
	/* 1010010|dtype<3:1>=010|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4B0A000) {
		decode_fields32(ENC_LDNF1H_Z_P_BI_U16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1H_Z_P_BI_U16);
	}
	/* class ldnf1h_z_p_bi_u32 */
	/* 1010010|dtype<3:1>=011|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4D0A000) {
		decode_fields32(ENC_LDNF1H_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1H_Z_P_BI_U32);
	}
	/* class ldnf1h_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=011|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA4F0A000) {
		decode_fields32(ENC_LDNF1H_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1H_Z_P_BI_U64);
	}
	return rc;
}

/* ldnf1sb_z_p_bi.xml */
int ldnf1sb_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1sb_z_p_bi_s16 */
	/* 1010010|dtype<3:1>=111|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5D0A000) {
		decode_fields32(ENC_LDNF1SB_Z_P_BI_S16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1SB_Z_P_BI_S16);
	}
	/* class ldnf1sb_z_p_bi_s32 */
	/* 1010010|dtype<3:1>=110|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA5B0A000) {
		decode_fields32(ENC_LDNF1SB_Z_P_BI_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1SB_Z_P_BI_S32);
	}
	/* class ldnf1sb_z_p_bi_s64 */
	/* 1010010|dtype<3:1>=110|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA590A000) {
		decode_fields32(ENC_LDNF1SB_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1SB_Z_P_BI_S64);
	}
	return rc;
}

/* ldnf1sh_z_p_bi.xml */
int ldnf1sh_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1sh_z_p_bi_s32 */
	/* 1010010|dtype<3:1>=100|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA530A000) {
		decode_fields32(ENC_LDNF1SH_Z_P_BI_S32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1SH_Z_P_BI_S32);
	}
	/* class ldnf1sh_z_p_bi_s64 */
	/* 1010010|dtype<3:1>=100|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA510A000) {
		decode_fields32(ENC_LDNF1SH_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1SH_Z_P_BI_S64);
	}
	return rc;
}

/* ldnf1sw_z_p_bi.xml */
int ldnf1sw_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1sw_z_p_bi_s64 */
	/* 1010010|dtype<3:1>=010|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA490A000) {
		decode_fields32(ENC_LDNF1SW_Z_P_BI_S64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = FALSE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1SW_Z_P_BI_S64);
	}
	return rc;
}

/* ldnf1w_z_p_bi.xml */
int ldnf1w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnf1w_z_p_bi_u32 */
	/* 1010010|dtype<3:1>=101|dtype<0>=0|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA550A000) {
		decode_fields32(ENC_LDNF1W_Z_P_BI_U32, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1W_Z_P_BI_U32);
	}
	/* class ldnf1w_z_p_bi_u64 */
	/* 1010010|dtype<3:1>=101|dtype<0>=1|1|imm4=xxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA570A000) {
		decode_fields32(ENC_LDNF1W_Z_P_BI_U64, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->unsigned_ = TRUE;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNF1W_Z_P_BI_U64);
	}
	return rc;
}

/* ldnt1b_z_p_bi.xml */
int ldnt1b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1b_z_p_bi_contiguous */
	/* 1010010|msz=00|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA400E000) {
		decode_fields32(ENC_LDNT1B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNT1B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1b_z_p_br.xml */
int ldnt1b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1b_z_p_br_contiguous */
	/* 1010010|msz=00|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA400C000) {
		decode_fields32(ENC_LDNT1B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		OK(ENC_LDNT1B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1d_z_p_bi.xml */
int ldnt1d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1d_z_p_bi_contiguous */
	/* 1010010|msz=11|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA580E000) {
		decode_fields32(ENC_LDNT1D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNT1D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1d_z_p_br.xml */
int ldnt1d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1d_z_p_br_contiguous */
	/* 1010010|msz=11|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA580C000) {
		decode_fields32(ENC_LDNT1D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		OK(ENC_LDNT1D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1h_z_p_bi.xml */
int ldnt1h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1h_z_p_bi_contiguous */
	/* 1010010|msz=01|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA480E000) {
		decode_fields32(ENC_LDNT1H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNT1H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1h_z_p_br.xml */
int ldnt1h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1h_z_p_br_contiguous */
	/* 1010010|msz=01|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA480C000) {
		decode_fields32(ENC_LDNT1H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		OK(ENC_LDNT1H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1w_z_p_bi.xml */
int ldnt1w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1w_z_p_bi_contiguous */
	/* 1010010|msz=10|000|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xA500E000) {
		decode_fields32(ENC_LDNT1W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_LDNT1W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* ldnt1w_z_p_br.xml */
int ldnt1w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldnt1w_z_p_br_contiguous */
	/* 1010010|msz=10|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xA500C000) {
		decode_fields32(ENC_LDNT1W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		OK(ENC_LDNT1W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* ldr_p_bi.xml */
int ldr_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldr_p_bi_ */
	/* 1000010110|imm9h=xxxxxx|000|imm9l=xxx|Rn=xxxxx|0|Pt=xxxx */
	if((INSWORD & 0xFFC0E010)==0x85800000) {
		decode_fields32(ENC_LDR_P_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Pt);
		dec->n = UINT(dec->Rn);
		dec->imm = SInt(((dec->imm9h<<3)|dec->imm9l),9);
		OK(ENC_LDR_P_BI_);
	}
	return rc;
}

/* ldr_z_bi.xml */
int ldr_z_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ldr_z_bi_ */
	/* 1000010110|imm9h=xxxxxx|010|imm9l=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0x85804000) {
		decode_fields32(ENC_LDR_Z_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->imm = SInt(((dec->imm9h<<3)|dec->imm9l),9);
		OK(ENC_LDR_Z_BI_);
	}
	return rc;
}

/* lsl_z_p_zi.xml */
int lsl_z_p_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsl_z_p_zi_ */
	/* 00000100|tszh=xx|00|opc=00|L=1|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4038000) {
		decode_fields32(ENC_LSL_Z_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->shift = UINT(((dec->tsize<<3)|dec->imm3))-dec->esize;
		OK(ENC_LSL_Z_P_ZI_);
	}
	return rc;
}

/* lsl_z_p_zw.xml */
int lsl_z_p_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsl_z_p_zw_ */
	/* 00000100|size=xx|011|R=0|L=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41B8000) {
		decode_fields32(ENC_LSL_Z_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_LSL_Z_P_ZW_);
	}
	return rc;
}

/* lsl_z_p_zz.xml */
int lsl_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsl_z_p_zz_ */
	/* 00000100|size=xx|010|R=0|L=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4138000) {
		decode_fields32(ENC_LSL_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_LSL_Z_P_ZZ_);
	}
	return rc;
}

/* lsl_z_zi.xml */
int lsl_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsl_z_zi_ */
	/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|1001|opc=11|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4209C00) {
		decode_fields32(ENC_LSL_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->shift = UINT(((dec->tsize<<3)|dec->imm3))-dec->esize;
		OK(ENC_LSL_Z_ZI_);
	}
	return rc;
}

/* lsl_z_zw.xml */
int lsl_z_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsl_z_zw_ */
	/* 00000100|size=xx|1|Zm=xxxxx|1000|opc=11|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4208C00) {
		decode_fields32(ENC_LSL_Z_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_LSL_Z_ZW_);
	}
	return rc;
}

/* lslr_z_p_zz.xml */
int lslr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lslr_z_p_zz_ */
	/* 00000100|size=xx|010|R=1|L=1|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4178000) {
		decode_fields32(ENC_LSLR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_LSLR_Z_P_ZZ_);
	}
	return rc;
}

/* lsr_z_p_zi.xml */
int lsr_z_p_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsr_z_p_zi_ */
	/* 00000100|tszh=xx|00|opc=00|L=0|U=1|100|Pg=xxx|tszl=xx|imm3=xxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4018000) {
		decode_fields32(ENC_LSR_Z_P_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->tsize<<3)|dec->imm3));
		OK(ENC_LSR_Z_P_ZI_);
	}
	return rc;
}

/* lsr_z_p_zw.xml */
int lsr_z_p_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsr_z_p_zw_ */
	/* 00000100|size=xx|011|R=0|L=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4198000) {
		decode_fields32(ENC_LSR_Z_P_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_LSR_Z_P_ZW_);
	}
	return rc;
}

/* lsr_z_p_zz.xml */
int lsr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsr_z_p_zz_ */
	/* 00000100|size=xx|010|R=0|L=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4118000) {
		decode_fields32(ENC_LSR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_LSR_Z_P_ZZ_);
	}
	return rc;
}

/* lsr_z_zi.xml */
int lsr_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsr_z_zi_ */
	/* 00000100|tszh=xx|1|tszl=xx|imm3=xxx|1001|0|U=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4209400) {
		decode_fields32(ENC_LSR_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->tsize = ((dec->tszh<<2)|dec->tszl);
		if(!dec->tsize) {
			UNDEFINED;
		}
		else if(dec->tsize==1) {
			dec->esize = 8;
		}
		else if((dec->tsize&14)==2) {
			dec->esize = 0x10;
		}
		else if((dec->tsize&12)==4) {
			dec->esize = 0x20;
		}
		else if((dec->tsize&8)==8) {
			dec->esize = 0x40;
		}
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->shift = ((2) * (dec->esize))-UINT(((dec->tsize<<3)|dec->imm3));
		OK(ENC_LSR_Z_ZI_);
	}
	return rc;
}

/* lsr_z_zw.xml */
int lsr_z_zw(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsr_z_zw_ */
	/* 00000100|size=xx|1|Zm=xxxxx|1000|0|U=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4208400) {
		decode_fields32(ENC_LSR_Z_ZW_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_LSR_Z_ZW_);
	}
	return rc;
}

/* lsrr_z_p_zz.xml */
int lsrr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class lsrr_z_p_zz_ */
	/* 00000100|size=xx|010|R=1|L=0|U=1|100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4158000) {
		decode_fields32(ENC_LSRR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_LSRR_Z_P_ZZ_);
	}
	return rc;
}

/* mad_z_p_zzz.xml */
int mad_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class mad_z_p_zzz_ */
	/* 00000100|size=xx|0|Zm=xxxxx|11|op=0|Pg=xxx|Za=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF20E000)==0x400C000) {
		decode_fields32(ENC_MAD_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->a = UINT(dec->Za);
		dec->sub_op = FALSE;
		OK(ENC_MAD_Z_P_ZZZ_);
	}
	return rc;
}

/* mla_z_p_zzz.xml */
int mla_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class mla_z_p_zzz_ */
	/* 00000100|size=xx|0|Zm=xxxxx|01|op=0|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20E000)==0x4004000) {
		decode_fields32(ENC_MLA_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->sub_op = FALSE;
		OK(ENC_MLA_Z_P_ZZZ_);
	}
	return rc;
}

/* mls_z_p_zzz.xml */
int mls_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class mls_z_p_zzz_ */
	/* 00000100|size=xx|0|Zm=xxxxx|01|op=1|Pg=xxx|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20E000)==0x4006000) {
		decode_fields32(ENC_MLS_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->sub_op = TRUE;
		OK(ENC_MLS_Z_P_ZZZ_);
	}
	return rc;
}

/* movprfx_z_p_z.xml */
int movprfx_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class movprfx_z_p_z_ */
	/* 00000100|size=xx|010|opc=00|M=x|001|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3EE000)==0x4102000) {
		decode_fields32(ENC_MOVPRFX_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->merging = (dec->M==1);
		OK(ENC_MOVPRFX_Z_P_Z_);
	}
	return rc;
}

/* movprfx_z_z.xml */
int movprfx_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class movprfx_z_z_ */
	/* 00000100|opc=00|1|opc2<4:1>=0000|opc2<0>=0|101111|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFFC00)==0x420BC00) {
		decode_fields32(ENC_MOVPRFX_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_MOVPRFX_Z_Z_);
	}
	return rc;
}

/* msb_z_p_zzz.xml */
int msb_z_p_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class msb_z_p_zzz_ */
	/* 00000100|size=xx|0|Zm=xxxxx|11|op=1|Pg=xxx|Za=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF20E000)==0x400E000) {
		decode_fields32(ENC_MSB_Z_P_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->a = UINT(dec->Za);
		dec->sub_op = TRUE;
		OK(ENC_MSB_Z_P_ZZZ_);
	}
	return rc;
}

/* mul_z_p_zz.xml */
int mul_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class mul_z_p_zz_ */
	/* 00000100|size=xx|0100|H=0|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4100000) {
		decode_fields32(ENC_MUL_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_MUL_Z_P_ZZ_);
	}
	return rc;
}

/* mul_z_zi.xml */
int mul_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class mul_z_zi_ */
	/* 00100101|size=xx|110|opc<2:1>=00|opc<0>=0|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x2530C000) {
		decode_fields32(ENC_MUL_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = SInt(dec->imm8,8);
		OK(ENC_MUL_Z_ZI_);
	}
	return rc;
}

/* nand_p_p_pp.xml */
int nand_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class nand_p_p_pp_z */
	/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25804210) {
		decode_fields32(ENC_NAND_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_NAND_P_P_PP_Z);
	}
	/* class nands_p_p_pp_z */
	/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25C04210) {
		decode_fields32(ENC_NANDS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_NANDS_P_P_PP_Z);
	}
	return rc;
}

/* neg_z_p_z.xml */
int neg_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class neg_z_p_z_ */
	/* 00000100|size=xx|010|opc<2:1>=11|opc<0>=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x417A000) {
		decode_fields32(ENC_NEG_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_NEG_Z_P_Z_);
	}
	return rc;
}

/* nor_p_p_pp.xml */
int nor_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class nor_p_p_pp_z */
	/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25804200) {
		decode_fields32(ENC_NOR_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_NOR_P_P_PP_Z);
	}
	/* class nors_p_p_pp_z */
	/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25C04200) {
		decode_fields32(ENC_NORS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_NORS_P_P_PP_Z);
	}
	return rc;
}

/* not_z_p_z.xml */
int not_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class not_z_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=11|opc<0>=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x41EA000) {
		decode_fields32(ENC_NOT_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_NOT_Z_P_Z_);
	}
	return rc;
}

/* orn_p_p_pp.xml */
int orn_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orn_p_p_pp_z */
	/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25804010) {
		decode_fields32(ENC_ORN_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_ORN_P_P_PP_Z);
	}
	/* class orns_p_p_pp_z */
	/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25C04010) {
		decode_fields32(ENC_ORNS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_ORNS_P_P_PP_Z);
	}
	return rc;
}

/* orr_p_p_pp.xml */
int orr_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_p_p_pp_z */
	/* 00100101|op=1|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25804000) {
		decode_fields32(ENC_ORR_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		/* regular aliases */
		if(dec->S==1 && dec->Pn==dec->Pm && dec->Pm==dec->Pg) return MOVS_orr_p_p_pp(ctx, dec);
		if(dec->S==0 && dec->Pn==dec->Pm && dec->Pm==dec->Pg) return MOV_orr_p_p_pp(ctx, dec);
		OK(ENC_ORR_P_P_PP_Z);
	}
	/* class orrs_p_p_pp_z */
	/* 00100101|op=1|S=1|00|Pm=xxxx|01|Pg=xxxx|o2=0|Pn=xxxx|o3=0|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25C04000) {
		decode_fields32(ENC_ORRS_P_P_PP_Z, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		/* regular aliases */
		if(dec->S==1 && dec->Pn==dec->Pm && dec->Pm==dec->Pg) return MOVS_orr_p_p_pp(ctx, dec);
		if(dec->S==0 && dec->Pn==dec->Pm && dec->Pm==dec->Pg) return MOV_orr_p_p_pp(ctx, dec);
		OK(ENC_ORRS_P_P_PP_Z);
	}
	return rc;
}

/* orr_z_p_zz.xml */
int orr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_z_p_zz_ */
	/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4180000) {
		decode_fields32(ENC_ORR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_ORR_Z_P_ZZ_);
	}
	return rc;
}

/* orr_z_zi.xml */
int orr_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_z_zi_ */
	/* 00000101|opc=00|0000|imm13=xxxxxxxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFFC0000)==0x5000000) {
		decode_fields32(ENC_ORR_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->dn = UINT(dec->Zdn);
		DecodeBitMasksCheckUndefined(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0));
		DecodeBitMasks_ReturnType dbmrt = DecodeBitMasks(SLICE(dec->imm13,12,12),SLICE(dec->imm13,5,0),SLICE(dec->imm13,11,6));
		dec->imm = dbmrt.wmask;
		OK(ENC_ORR_Z_ZI_);
	}
	return rc;
}

/* orr_z_zz.xml */
int orr_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orr_z_zz_ */
	/* 00000100|opc=01|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x4603000) {
		decode_fields32(ENC_ORR_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		/* regular aliases */
		if(dec->Zn==dec->Zm) return MOV_orr_z_zz(ctx, dec);
		OK(ENC_ORR_Z_ZZ_);
	}
	return rc;
}

/* orv_r_p_z.xml */
int orv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class orv_r_p_z_ */
	/* 00000100|size=xx|011|opc<2:1>=00|opc<0>=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4182000) {
		decode_fields32(ENC_ORV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_ORV_R_P_Z_);
	}
	return rc;
}

/* pfalse_p.xml */
int pfalse_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class pfalse_p_ */
	/* 00100101|op=0|S=0|011000111001|000000|Pd=xxxx */
	if((INSWORD & 0xFFFFFFF0)==0x2518E400) {
		decode_fields32(ENC_PFALSE_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Pd);
		OK(ENC_PFALSE_P_);
	}
	return rc;
}

/* pfirst_p_p_p.xml */
int pfirst_p_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class pfirst_p_p_p_ */
	/* 00100101|op=0|S=1|011000110000|0|Pg=xxxx|0|Pdn=xxxx */
	if((INSWORD & 0xFFFFFE10)==0x2558C000) {
		decode_fields32(ENC_PFIRST_P_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Pdn);
		OK(ENC_PFIRST_P_P_P_);
	}
	return rc;
}

/* pnext_p_p_p.xml */
int pnext_p_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class pnext_p_p_p_ */
	/* 00100101|size=xx|011001110001|0|Pg=xxxx|0|Pdn=xxxx */
	if((INSWORD & 0xFF3FFE10)==0x2519C400) {
		decode_fields32(ENC_PNEXT_P_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Pdn);
		OK(ENC_PNEXT_P_P_P_);
	}
	return rc;
}

/* prfb_i_p_ai.xml */
int prfb_i_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfb_i_p_ai_s */
	/* 1000010|msz=00|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8400E000) {
		decode_fields32(ENC_PRFB_I_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 0;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFB_I_P_AI_S);
	}
	/* class prfb_i_p_ai_d */
	/* 1100010|msz=00|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC400E000) {
		decode_fields32(ENC_PRFB_I_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 0;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFB_I_P_AI_D);
	}
	return rc;
}

/* prfb_i_p_bi.xml */
int prfb_i_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfb_i_p_bi_s */
	/* 1000010111|imm6=xxxxxx|0|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFC0E010)==0x85C00000) {
		decode_fields32(ENC_PRFB_I_P_BI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 0;
		dec->offset = SInt(dec->imm6,6);
		OK(ENC_PRFB_I_P_BI_S);
	}
	return rc;
}

/* prfb_i_p_br.xml */
int prfb_i_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfb_i_p_br_s */
	/* 1000010|msz=00|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8400C000) {
		decode_fields32(ENC_PRFB_I_P_BR_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 0;
		OK(ENC_PRFB_I_P_BR_S);
	}
	return rc;
}

/* prfb_i_p_bz.xml */
int prfb_i_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfb_i_p_bz_s_x32_scaled */
	/* 100001000|xs=x|1|Zm=xxxxx|0|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0x84200000) {
		decode_fields32(ENC_PRFB_I_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 0;
		OK(ENC_PRFB_I_P_BZ_S_X32_SCALED);
	}
	/* class prfb_i_p_bz_d_x32_scaled */
	/* 110001000|xs=x|1|Zm=xxxxx|0|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0xC4200000) {
		decode_fields32(ENC_PRFB_I_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 0;
		OK(ENC_PRFB_I_P_BZ_D_X32_SCALED);
	}
	/* class prfb_i_p_bz_d_64_scaled */
	/* 11000100011|Zm=xxxxx|1|msz=00|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC4608000) {
		decode_fields32(ENC_PRFB_I_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_PRFB_I_P_BZ_D_64_SCALED);
	}
	return rc;
}

/* prfd_i_p_ai.xml */
int prfd_i_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfd_i_p_ai_s */
	/* 1000010|msz=11|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8580E000) {
		decode_fields32(ENC_PRFD_I_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 3;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFD_I_P_AI_S);
	}
	/* class prfd_i_p_ai_d */
	/* 1100010|msz=11|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC580E000) {
		decode_fields32(ENC_PRFD_I_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 3;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFD_I_P_AI_D);
	}
	return rc;
}

/* prfd_i_p_bi.xml */
int prfd_i_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfd_i_p_bi_s */
	/* 1000010111|imm6=xxxxxx|0|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFC0E010)==0x85C06000) {
		decode_fields32(ENC_PRFD_I_P_BI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 3;
		dec->offset = SInt(dec->imm6,6);
		OK(ENC_PRFD_I_P_BI_S);
	}
	return rc;
}

/* prfd_i_p_br.xml */
int prfd_i_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfd_i_p_br_s */
	/* 1000010|msz=11|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8580C000) {
		decode_fields32(ENC_PRFD_I_P_BR_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 3;
		OK(ENC_PRFD_I_P_BR_S);
	}
	return rc;
}

/* prfd_i_p_bz.xml */
int prfd_i_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfd_i_p_bz_s_x32_scaled */
	/* 100001000|xs=x|1|Zm=xxxxx|0|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0x84206000) {
		decode_fields32(ENC_PRFD_I_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 3;
		OK(ENC_PRFD_I_P_BZ_S_X32_SCALED);
	}
	/* class prfd_i_p_bz_d_x32_scaled */
	/* 110001000|xs=x|1|Zm=xxxxx|0|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0xC4206000) {
		decode_fields32(ENC_PRFD_I_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 3;
		OK(ENC_PRFD_I_P_BZ_D_X32_SCALED);
	}
	/* class prfd_i_p_bz_d_64_scaled */
	/* 11000100011|Zm=xxxxx|1|msz=11|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC460E000) {
		decode_fields32(ENC_PRFD_I_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 3;
		OK(ENC_PRFD_I_P_BZ_D_64_SCALED);
	}
	return rc;
}

/* prfh_i_p_ai.xml */
int prfh_i_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfh_i_p_ai_s */
	/* 1000010|msz=01|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8480E000) {
		decode_fields32(ENC_PRFH_I_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 1;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFH_I_P_AI_S);
	}
	/* class prfh_i_p_ai_d */
	/* 1100010|msz=01|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC480E000) {
		decode_fields32(ENC_PRFH_I_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 1;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFH_I_P_AI_D);
	}
	return rc;
}

/* prfh_i_p_bi.xml */
int prfh_i_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfh_i_p_bi_s */
	/* 1000010111|imm6=xxxxxx|0|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFC0E010)==0x85C02000) {
		decode_fields32(ENC_PRFH_I_P_BI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 1;
		dec->offset = SInt(dec->imm6,6);
		OK(ENC_PRFH_I_P_BI_S);
	}
	return rc;
}

/* prfh_i_p_br.xml */
int prfh_i_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfh_i_p_br_s */
	/* 1000010|msz=01|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8480C000) {
		decode_fields32(ENC_PRFH_I_P_BR_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 1;
		OK(ENC_PRFH_I_P_BR_S);
	}
	return rc;
}

/* prfh_i_p_bz.xml */
int prfh_i_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfh_i_p_bz_s_x32_scaled */
	/* 100001000|xs=x|1|Zm=xxxxx|0|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0x84202000) {
		decode_fields32(ENC_PRFH_I_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 1;
		OK(ENC_PRFH_I_P_BZ_S_X32_SCALED);
	}
	/* class prfh_i_p_bz_d_x32_scaled */
	/* 110001000|xs=x|1|Zm=xxxxx|0|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0xC4202000) {
		decode_fields32(ENC_PRFH_I_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 1;
		OK(ENC_PRFH_I_P_BZ_D_X32_SCALED);
	}
	/* class prfh_i_p_bz_d_64_scaled */
	/* 11000100011|Zm=xxxxx|1|msz=01|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC460A000) {
		decode_fields32(ENC_PRFH_I_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 1;
		OK(ENC_PRFH_I_P_BZ_D_64_SCALED);
	}
	return rc;
}

/* prfw_i_p_ai.xml */
int prfw_i_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfw_i_p_ai_s */
	/* 1000010|msz=10|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8500E000) {
		decode_fields32(ENC_PRFW_I_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 2;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFW_I_P_AI_S);
	}
	/* class prfw_i_p_ai_d */
	/* 1100010|msz=10|00|imm5=xxxxx|111|Pg=xxx|Zn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC500E000) {
		decode_fields32(ENC_PRFW_I_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 2;
		dec->offset = UINT(dec->imm5);
		OK(ENC_PRFW_I_P_AI_D);
	}
	return rc;
}

/* prfw_i_p_bi.xml */
int prfw_i_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfw_i_p_bi_s */
	/* 1000010111|imm6=xxxxxx|0|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFC0E010)==0x85C04000) {
		decode_fields32(ENC_PRFW_I_P_BI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 2;
		dec->offset = SInt(dec->imm6,6);
		OK(ENC_PRFW_I_P_BI_S);
	}
	return rc;
}

/* prfw_i_p_br.xml */
int prfw_i_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfw_i_p_br_s */
	/* 1000010|msz=10|00|Rm=xxxxx|110|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0x8500C000) {
		decode_fields32(ENC_PRFW_I_P_BR_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->scale = 2;
		OK(ENC_PRFW_I_P_BR_S);
	}
	return rc;
}

/* prfw_i_p_bz.xml */
int prfw_i_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class prfw_i_p_bz_s_x32_scaled */
	/* 100001000|xs=x|1|Zm=xxxxx|0|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0x84204000) {
		decode_fields32(ENC_PRFW_I_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 2;
		OK(ENC_PRFW_I_P_BZ_S_X32_SCALED);
	}
	/* class prfw_i_p_bz_d_x32_scaled */
	/* 110001000|xs=x|1|Zm=xxxxx|0|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFA0E010)==0xC4204000) {
		decode_fields32(ENC_PRFW_I_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x20;
		dec->offs_unsigned = (dec->xs==0);
		dec->scale = 2;
		OK(ENC_PRFW_I_P_BZ_D_X32_SCALED);
	}
	/* class prfw_i_p_bz_d_64_scaled */
	/* 11000100011|Zm=xxxxx|1|msz=10|Pg=xxx|Rn=xxxxx|0|prfop=xxxx */
	if((INSWORD & 0xFFE0E010)==0xC460C000) {
		decode_fields32(ENC_PRFW_I_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->level = UINT(SLICE(dec->prfop,2,1));
		dec->stream = (SLICE(dec->prfop,0,0)==1);
		if(SLICE(dec->prfop,3,3)==0) {
			dec->pref_hint = Prefetch_READ;
		};
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 2;
		OK(ENC_PRFW_I_P_BZ_D_64_SCALED);
	}
	return rc;
}

/* ptest_p_p.xml */
int ptest_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ptest_p_p_ */
	/* 00|100101|op=0|S=1|01|000011|Pg=xxxx|0|Pn=xxxx|0|opc2=0000 */
	if((INSWORD & 0xFFFFC21F)==0x2550C000) {
		decode_fields32(ENC_PTEST_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		OK(ENC_PTEST_P_P_);
	}
	return rc;
}

/* ptrue_p_s.xml */
int ptrue_p_s(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ptrue_p_s_ */
	/* 00100101|size=xx|01100|S=0|111000|pattern=xxxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF3FFC10)==0x2518E000) {
		decode_fields32(ENC_PTRUE_P_S_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		dec->pat = dec->pattern;
		OK(ENC_PTRUE_P_S_);
	}
	/* class ptrues_p_s_ */
	/* 00100101|size=xx|01100|S=1|111000|pattern=xxxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF3FFC10)==0x2519E000) {
		decode_fields32(ENC_PTRUES_P_S_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		dec->pat = dec->pattern;
		OK(ENC_PTRUES_P_S_);
	}
	return rc;
}

/* punpkhi_p_p.xml */
int punpkhi_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class punpkhi_p_p_ */
	/* 000001010011000|H=1|010000|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFFFFFE10)==0x5314000) {
		decode_fields32(ENC_PUNPKHI_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		dec->hi = TRUE;
		OK(ENC_PUNPKHI_P_P_);
	}
	/* class punpklo_p_p_ */
	/* 000001010011000|H=0|010000|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFFFFFE10)==0x5304000) {
		decode_fields32(ENC_PUNPKLO_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		dec->hi = FALSE;
		OK(ENC_PUNPKLO_P_P_);
	}
	return rc;
}

/* rbit_z_p_z.xml */
int rbit_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class rbit_z_p_z_ */
	/* 00000101|size=xx|1001|opc=11|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5278000) {
		decode_fields32(ENC_RBIT_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_RBIT_Z_P_Z_);
	}
	return rc;
}

/* rdffr_p_f.xml */
int rdffr_p_f(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class rdffr_p_f_ */
	/* 00100101|op=0|S=0|011001111100|000000|Pd=xxxx */
	if((INSWORD & 0xFFFFFFF0)==0x2519F000) {
		decode_fields32(ENC_RDFFR_P_F_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Pd);
		OK(ENC_RDFFR_P_F_);
	}
	return rc;
}

/* rdffr_p_p_f.xml */
int rdffr_p_p_f(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class rdffr_p_p_f_ */
	/* 00100101|op=0|S=0|011000111100|0|Pg=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFFFFFE10)==0x2518F000) {
		decode_fields32(ENC_RDFFR_P_P_F_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->g = UINT(dec->Pg);
		dec->d = UINT(dec->Pd);
		dec->setflags = FALSE;
		OK(ENC_RDFFR_P_P_F_);
	}
	/* class rdffrs_p_p_f_ */
	/* 00100101|op=0|S=1|011000111100|0|Pg=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFFFFFE10)==0x2558F000) {
		decode_fields32(ENC_RDFFRS_P_P_F_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->g = UINT(dec->Pg);
		dec->d = UINT(dec->Pd);
		dec->setflags = TRUE;
		OK(ENC_RDFFRS_P_P_F_);
	}
	return rc;
}

/* rdvl_r_i.xml */
int rdvl_r_i(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class rdvl_r_i_ */
	/* 000001001|op=0|1|opc2<4:1>=1111|opc2<0>=1|01010|imm6=xxxxxx|Rd=xxxxx */
	if((INSWORD & 0xFFFFF800)==0x4BF5000) {
		decode_fields32(ENC_RDVL_R_I_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->d = UINT(dec->Rd);
		dec->imm = SInt(dec->imm6,6);
		OK(ENC_RDVL_R_I_);
	}
	return rc;
}

/* rev_p_p.xml */
int rev_p_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class rev_p_p_ */
	/* 00000101|size=xx|110100010000|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF3FFE10)==0x5344000) {
		decode_fields32(ENC_REV_P_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->d = UINT(dec->Pd);
		OK(ENC_REV_P_P_);
	}
	return rc;
}

/* rev_z_z.xml */
int rev_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class rev_z_z_ */
	/* 00000101|size=xx|111000001110|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5383800) {
		decode_fields32(ENC_REV_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		OK(ENC_REV_Z_Z_);
	}
	return rc;
}

/* revb_z_z.xml */
int revb_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class revb_z_z_ */
	/* 00000101|size=xx|1001|opc=00|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5248000) {
		decode_fields32(ENC_REVB_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->swsize = 8;
		OK(ENC_REVB_Z_Z_);
	}
	/* class revh_z_z_ */
	/* 00000101|size=xx|1001|opc=01|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5258000) {
		decode_fields32(ENC_REVH_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if((dec->size&2)!=2) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->swsize = 0x10;
		OK(ENC_REVH_Z_Z_);
	}
	/* class revw_z_z_ */
	/* 00000101|size=xx|1001|opc=10|100|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x5268000) {
		decode_fields32(ENC_REVW_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->swsize = 0x20;
		OK(ENC_REVW_Z_Z_);
	}
	return rc;
}

/* sabd_z_p_zz.xml */
int sabd_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sabd_z_p_zz_ */
	/* 00000100|size=xx|001|opc=10|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x40C0000) {
		decode_fields32(ENC_SABD_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = FALSE;
		OK(ENC_SABD_Z_P_ZZ_);
	}
	return rc;
}

/* saddv_r_p_z.xml */
int saddv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class saddv_r_p_z_ */
	/* 00000100|size=xx|000|opc=00|U=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4002000) {
		decode_fields32(ENC_SADDV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_SADDV_R_P_Z_);
	}
	return rc;
}

/* scvtf_z_p_z.xml */
int scvtf_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class scvtf_z_p_z_h2fp16 */
	/* 01100101|opc=01|010|opc2=01|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6552A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_H2FP16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x10;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_H2FP16);
	}
	/* class scvtf_z_p_z_w2fp16 */
	/* 01100101|opc=01|010|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6554A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_W2FP16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x10;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_W2FP16);
	}
	/* class scvtf_z_p_z_w2s */
	/* 01100101|opc=10|010|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6594A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_W2S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x20;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_W2S);
	}
	/* class scvtf_z_p_z_w2d */
	/* 01100101|opc=11|010|opc2=00|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D0A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_W2D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x40;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_W2D);
	}
	/* class scvtf_z_p_z_x2fp16 */
	/* 01100101|opc=01|010|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6556A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_X2FP16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x10;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_X2FP16);
	}
	/* class scvtf_z_p_z_x2s */
	/* 01100101|opc=11|010|opc2=10|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D4A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_X2S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x20;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_X2S);
	}
	/* class scvtf_z_p_z_x2d */
	/* 01100101|opc=11|010|opc2=11|int_U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D6A000) {
		decode_fields32(ENC_SCVTF_Z_P_Z_X2D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x40;
		dec->unsigned_ = FALSE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_SCVTF_Z_P_Z_X2D);
	}
	return rc;
}

/* sdiv_z_p_zz.xml */
int sdiv_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sdiv_z_p_zz_ */
	/* 00000100|size=xx|0101|R=0|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4140000) {
		decode_fields32(ENC_SDIV_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = FALSE;
		OK(ENC_SDIV_Z_P_ZZ_);
	}
	return rc;
}

/* sdivr_z_p_zz.xml */
int sdivr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sdivr_z_p_zz_ */
	/* 00000100|size=xx|0101|R=1|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4160000) {
		decode_fields32(ENC_SDIVR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = FALSE;
		OK(ENC_SDIVR_Z_P_ZZ_);
	}
	return rc;
}

/* sdot_z_zzz.xml */
int sdot_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sdot_z_zzz_ */
	/* 01000100|size=xx|0|Zm=xxxxx|00000|U=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x44000000) {
		decode_fields32(ENC_SDOT_Z_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_SDOT_Z_ZZZ_);
	}
	return rc;
}

/* sdot_z_zzzi.xml */
int sdot_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sdot_z_zzzi_s */
	/* 01000100|size=10|1|i2=xx|Zm=xxx|00000|U=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44A00000) {
		decode_fields32(ENC_SDOT_Z_ZZZI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_SDOT_Z_ZZZI_S);
	}
	/* class sdot_z_zzzi_d */
	/* 01000100|size=11|1|i1=x|Zm=xxxx|00000|U=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44E00000) {
		decode_fields32(ENC_SDOT_Z_ZZZI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->index = UINT(dec->i1);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_SDOT_Z_ZZZI_D);
	}
	return rc;
}

/* sel_p_p_pp.xml */
int sel_p_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sel_p_p_pp_ */
	/* 00100101|op=0|S=0|00|Pm=xxxx|01|Pg=xxxx|o2=1|Pn=xxxx|o3=1|Pd=xxxx */
	if((INSWORD & 0xFFF0C210)==0x25004210) {
		decode_fields32(ENC_SEL_P_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		/* regular aliases */
		if(dec->Pd==dec->Pm) return MOV_sel_p_p_pp(ctx, dec);
		OK(ENC_SEL_P_P_PP_);
	}
	return rc;
}

/* sel_z_p_zz.xml */
int sel_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sel_z_p_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|11|Pg=xxxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20C000)==0x520C000) {
		decode_fields32(ENC_SEL_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		/* regular aliases */
		if(dec->Zd==dec->Zm) return MOV_sel_z_p_zz(ctx, dec);
		OK(ENC_SEL_Z_P_ZZ_);
	}
	return rc;
}

/* setffr_f.xml */
int setffr_f(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class setffr_f_ */
	/* 00|100101|opc=00|10|1100100100|000000|0|0|00 */
	if((INSWORD & 0xFFFFFFFF)==0x252C9000) {
		decode_fields32(ENC_SETFFR_F_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		OK(ENC_SETFFR_F_);
	}
	return rc;
}

/* shared_pseudocode.xml */
int shared_pseudocode(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	return rc;
}

/* smax_z_p_zz.xml */
int smax_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smax_z_p_zz_ */
	/* 00000100|size=xx|001|opc=00|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4080000) {
		decode_fields32(ENC_SMAX_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = FALSE;
		OK(ENC_SMAX_Z_P_ZZ_);
	}
	return rc;
}

/* smax_z_zi.xml */
int smax_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smax_z_zi_ */
	/* 00100101|size=xx|101|00|U=0|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x2528C000) {
		decode_fields32(ENC_SMAX_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = FALSE;
		dec->imm = UINT(dec->imm8);
		OK(ENC_SMAX_Z_ZI_);
	}
	return rc;
}

/* smaxv_r_p_z.xml */
int smaxv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smaxv_r_p_z_ */
	/* 00000100|size=xx|001|opc=00|U=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4082000) {
		decode_fields32(ENC_SMAXV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		dec->unsigned_ = FALSE;
		OK(ENC_SMAXV_R_P_Z_);
	}
	return rc;
}

/* smin_z_p_zz.xml */
int smin_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smin_z_p_zz_ */
	/* 00000100|size=xx|001|opc=01|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x40A0000) {
		decode_fields32(ENC_SMIN_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = FALSE;
		OK(ENC_SMIN_Z_P_ZZ_);
	}
	return rc;
}

/* smin_z_zi.xml */
int smin_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smin_z_zi_ */
	/* 00100101|size=xx|101|01|U=0|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x252AC000) {
		decode_fields32(ENC_SMIN_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = FALSE;
		dec->imm = UINT(dec->imm8);
		OK(ENC_SMIN_Z_ZI_);
	}
	return rc;
}

/* sminv_r_p_z.xml */
int sminv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sminv_r_p_z_ */
	/* 00000100|size=xx|001|opc=01|U=0|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x40A2000) {
		decode_fields32(ENC_SMINV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		dec->unsigned_ = FALSE;
		OK(ENC_SMINV_R_P_Z_);
	}
	return rc;
}

/* smmla_z_zzz.xml */
int smmla_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smmla_z_zzz_ */
	/* 01000101|uns=00|0|Zm=xxxxx|100110|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x45009800) {
		decode_fields32(ENC_SMMLA_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_unsigned = FALSE;
		dec->op2_unsigned = FALSE;
		OK(ENC_SMMLA_Z_ZZZ_);
	}
	return rc;
}

/* smulh_z_p_zz.xml */
int smulh_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class smulh_z_p_zz_ */
	/* 00000100|size=xx|0100|H=1|U=0|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4120000) {
		decode_fields32(ENC_SMULH_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = FALSE;
		OK(ENC_SMULH_Z_P_ZZ_);
	}
	return rc;
}

/* splice_z_p_zz.xml */
int splice_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class splice_z_p_zz_des */
	/* 00000101|size=xx|101100100|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x52C8000) {
		decode_fields32(ENC_SPLICE_Z_P_ZZ_DES, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_SPLICE_Z_P_ZZ_DES);
	}
	return rc;
}

/* sqadd_z_zi.xml */
int sqadd_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqadd_z_zi_ */
	/* 00100101|size=xx|100|10|U=0|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2524C000) {
		decode_fields32(ENC_SQADD_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		dec->unsigned_ = FALSE;
		OK(ENC_SQADD_Z_ZI_);
	}
	return rc;
}

/* sqadd_z_zz.xml */
int sqadd_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqadd_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|000|10|U=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4201000) {
		decode_fields32(ENC_SQADD_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		OK(ENC_SQADD_Z_ZZ_);
	}
	return rc;
}

/* sqdecb_r_rs.xml */
int sqdecb_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecb_r_rs_sx */
	/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x420F800) {
		decode_fields32(ENC_SQDECB_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQDECB_R_RS_SX);
	}
	/* class sqdecb_r_rs_x */
	/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x430F800) {
		decode_fields32(ENC_SQDECB_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQDECB_R_RS_X);
	}
	return rc;
}

/* sqdecd_r_rs.xml */
int sqdecd_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecd_r_rs_sx */
	/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0F800) {
		decode_fields32(ENC_SQDECD_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQDECD_R_RS_SX);
	}
	/* class sqdecd_r_rs_x */
	/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0F800) {
		decode_fields32(ENC_SQDECD_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQDECD_R_RS_X);
	}
	return rc;
}

/* sqdecd_z_zs.xml */
int sqdecd_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecd_z_zs_ */
	/* 00000100|size=11|10|imm4=xxxx|1100|D=1|U=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0C800) {
		decode_fields32(ENC_SQDECD_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		OK(ENC_SQDECD_Z_ZS_);
	}
	return rc;
}

/* sqdech_r_rs.xml */
int sqdech_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdech_r_rs_sx */
	/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460F800) {
		decode_fields32(ENC_SQDECH_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQDECH_R_RS_SX);
	}
	/* class sqdech_r_rs_x */
	/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470F800) {
		decode_fields32(ENC_SQDECH_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQDECH_R_RS_X);
	}
	return rc;
}

/* sqdech_z_zs.xml */
int sqdech_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdech_z_zs_ */
	/* 00000100|size=01|10|imm4=xxxx|1100|D=1|U=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460C800) {
		decode_fields32(ENC_SQDECH_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		OK(ENC_SQDECH_Z_ZS_);
	}
	return rc;
}

/* sqdecp_r_p_r.xml */
int sqdecp_r_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecp_r_p_r_sx */
	/* 00100101|size=xx|1010|D=1|U=0|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252A8800) {
		decode_fields32(ENC_SQDECP_R_P_R_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQDECP_R_P_R_SX);
	}
	/* class sqdecp_r_p_r_x */
	/* 00100101|size=xx|1010|D=1|U=0|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252A8C00) {
		decode_fields32(ENC_SQDECP_R_P_R_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQDECP_R_P_R_X);
	}
	return rc;
}

/* sqdecp_z_p_z.xml */
int sqdecp_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecp_z_p_z_ */
	/* 00100101|size=xx|1010|D=1|U=0|10000|opc=00|Pm=xxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252A8000) {
		decode_fields32(ENC_SQDECP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = FALSE;
		OK(ENC_SQDECP_Z_P_Z_);
	}
	return rc;
}

/* sqdecw_r_rs.xml */
int sqdecw_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecw_r_rs_sx */
	/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0F800) {
		decode_fields32(ENC_SQDECW_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQDECW_R_RS_SX);
	}
	/* class sqdecw_r_rs_x */
	/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=1|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0F800) {
		decode_fields32(ENC_SQDECW_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQDECW_R_RS_X);
	}
	return rc;
}

/* sqdecw_z_zs.xml */
int sqdecw_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqdecw_z_zs_ */
	/* 00000100|size=10|10|imm4=xxxx|1100|D=1|U=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0C800) {
		decode_fields32(ENC_SQDECW_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		OK(ENC_SQDECW_Z_ZS_);
	}
	return rc;
}

/* sqincb_r_rs.xml */
int sqincb_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincb_r_rs_sx */
	/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x420F000) {
		decode_fields32(ENC_SQINCB_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQINCB_R_RS_SX);
	}
	/* class sqincb_r_rs_x */
	/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x430F000) {
		decode_fields32(ENC_SQINCB_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQINCB_R_RS_X);
	}
	return rc;
}

/* sqincd_r_rs.xml */
int sqincd_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincd_r_rs_sx */
	/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0F000) {
		decode_fields32(ENC_SQINCD_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQINCD_R_RS_SX);
	}
	/* class sqincd_r_rs_x */
	/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0F000) {
		decode_fields32(ENC_SQINCD_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQINCD_R_RS_X);
	}
	return rc;
}

/* sqincd_z_zs.xml */
int sqincd_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincd_z_zs_ */
	/* 00000100|size=11|10|imm4=xxxx|1100|D=0|U=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0C000) {
		decode_fields32(ENC_SQINCD_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		OK(ENC_SQINCD_Z_ZS_);
	}
	return rc;
}

/* sqinch_r_rs.xml */
int sqinch_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqinch_r_rs_sx */
	/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460F000) {
		decode_fields32(ENC_SQINCH_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQINCH_R_RS_SX);
	}
	/* class sqinch_r_rs_x */
	/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470F000) {
		decode_fields32(ENC_SQINCH_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQINCH_R_RS_X);
	}
	return rc;
}

/* sqinch_z_zs.xml */
int sqinch_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqinch_z_zs_ */
	/* 00000100|size=01|10|imm4=xxxx|1100|D=0|U=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460C000) {
		decode_fields32(ENC_SQINCH_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		OK(ENC_SQINCH_Z_ZS_);
	}
	return rc;
}

/* sqincp_r_p_r.xml */
int sqincp_r_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincp_r_p_r_sx */
	/* 00100101|size=xx|1010|D=0|U=0|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x25288800) {
		decode_fields32(ENC_SQINCP_R_P_R_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQINCP_R_P_R_SX);
	}
	/* class sqincp_r_p_r_x */
	/* 00100101|size=xx|1010|D=0|U=0|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x25288C00) {
		decode_fields32(ENC_SQINCP_R_P_R_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQINCP_R_P_R_X);
	}
	return rc;
}

/* sqincp_z_p_z.xml */
int sqincp_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincp_z_p_z_ */
	/* 00100101|size=xx|1010|D=0|U=0|10000|opc=00|Pm=xxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x25288000) {
		decode_fields32(ENC_SQINCP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = FALSE;
		OK(ENC_SQINCP_Z_P_Z_);
	}
	return rc;
}

/* sqincw_r_rs.xml */
int sqincw_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincw_r_rs_sx */
	/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0F000) {
		decode_fields32(ENC_SQINCW_R_RS_SX, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x20;
		OK(ENC_SQINCW_R_RS_SX);
	}
	/* class sqincw_r_rs_x */
	/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=0|U=0|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0F000) {
		decode_fields32(ENC_SQINCW_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		dec->ssize = 0x40;
		OK(ENC_SQINCW_R_RS_X);
	}
	return rc;
}

/* sqincw_z_zs.xml */
int sqincw_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqincw_z_zs_ */
	/* 00000100|size=10|10|imm4=xxxx|1100|D=0|U=0|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0C000) {
		decode_fields32(ENC_SQINCW_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = FALSE;
		OK(ENC_SQINCW_Z_ZS_);
	}
	return rc;
}

/* sqsub_z_zi.xml */
int sqsub_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqsub_z_zi_ */
	/* 00100101|size=xx|100|11|U=0|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2526C000) {
		decode_fields32(ENC_SQSUB_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		dec->unsigned_ = FALSE;
		OK(ENC_SQSUB_Z_ZI_);
	}
	return rc;
}

/* sqsub_z_zz.xml */
int sqsub_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sqsub_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|000|11|U=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4201800) {
		decode_fields32(ENC_SQSUB_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		OK(ENC_SQSUB_Z_ZZ_);
	}
	return rc;
}

/* st1b_z_p_ai.xml */
int st1b_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1b_z_p_ai_s */
	/* 1110010|msz=00|11|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE460A000) {
		decode_fields32(ENC_ST1B_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1B_Z_P_AI_S);
	}
	/* class st1b_z_p_ai_d */
	/* 1110010|msz=00|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE440A000) {
		decode_fields32(ENC_ST1B_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1B_Z_P_AI_D);
	}
	return rc;
}

/* st1b_z_p_bi.xml */
int st1b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1b_z_p_bi_ */
	/* 1110010|msz=00|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF90E000)==0xE400E000) {
		decode_fields32(ENC_ST1B_Z_P_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 8;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_ST1B_Z_P_BI_);
	}
	return rc;
}

/* st1b_z_p_br.xml */
int st1b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1b_z_p_br_ */
	/* 1110010|00|size=xx|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF80E000)==0xE4004000) {
		decode_fields32(ENC_ST1B_Z_P_BR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 8;
		OK(ENC_ST1B_Z_P_BR_);
	}
	return rc;
}

/* st1b_z_p_bz.xml */
int st1b_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1b_z_p_bz_d_x32_unscaled */
	/* 1110010|msz=00|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE4008000) {
		decode_fields32(ENC_ST1B_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1B_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class st1b_z_p_bz_s_x32_unscaled */
	/* 1110010|msz=00|10|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE4408000) {
		decode_fields32(ENC_ST1B_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 8;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1B_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class st1b_z_p_bz_d_64_unscaled */
	/* 1110010|msz=00|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE400A000) {
		decode_fields32(ENC_ST1B_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 8;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_ST1B_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* st1d_z_p_ai.xml */
int st1d_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1d_z_p_ai_d */
	/* 1110010|msz=11|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5C0A000) {
		decode_fields32(ENC_ST1D_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1D_Z_P_AI_D);
	}
	return rc;
}

/* st1d_z_p_bi.xml */
int st1d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1d_z_p_bi_ */
	/* 1110010|msz=11|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF90E000)==0xE580E000) {
		decode_fields32(ENC_ST1D_Z_P_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_ST1D_Z_P_BI_);
	}
	return rc;
}

/* st1d_z_p_br.xml */
int st1d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1d_z_p_br_ */
	/* 1110010|opc<2:1>=11|opc<0>=1|o2=1|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5E04000) {
		decode_fields32(ENC_ST1D_Z_P_BR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		OK(ENC_ST1D_Z_P_BR_);
	}
	return rc;
}

/* st1d_z_p_bz.xml */
int st1d_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1d_z_p_bz_d_x32_scaled */
	/* 1110010|msz=11|01|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE5A08000) {
		decode_fields32(ENC_ST1D_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 3;
		OK(ENC_ST1D_Z_P_BZ_D_X32_SCALED);
	}
	/* class st1d_z_p_bz_d_x32_unscaled */
	/* 1110010|msz=11|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE5808000) {
		decode_fields32(ENC_ST1D_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1D_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class st1d_z_p_bz_d_64_scaled */
	/* 1110010|msz=11|01|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5A0A000) {
		decode_fields32(ENC_ST1D_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 3;
		OK(ENC_ST1D_Z_P_BZ_D_64_SCALED);
	}
	/* class st1d_z_p_bz_d_64_unscaled */
	/* 1110010|msz=11|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE580A000) {
		decode_fields32(ENC_ST1D_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x40;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_ST1D_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* st1h_z_p_ai.xml */
int st1h_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1h_z_p_ai_s */
	/* 1110010|msz=01|11|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4E0A000) {
		decode_fields32(ENC_ST1H_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1H_Z_P_AI_S);
	}
	/* class st1h_z_p_ai_d */
	/* 1110010|msz=01|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4C0A000) {
		decode_fields32(ENC_ST1H_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1H_Z_P_AI_D);
	}
	return rc;
}

/* st1h_z_p_bi.xml */
int st1h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1h_z_p_bi_ */
	/* 1110010|msz=01|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF90E000)==0xE480E000) {
		decode_fields32(ENC_ST1H_Z_P_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_ST1H_Z_P_BI_);
	}
	return rc;
}

/* st1h_z_p_br.xml */
int st1h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1h_z_p_br_ */
	/* 1110010|01|size=xx|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF80E000)==0xE4804000) {
		decode_fields32(ENC_ST1H_Z_P_BR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 0x10;
		OK(ENC_ST1H_Z_P_BR_);
	}
	return rc;
}

/* st1h_z_p_bz.xml */
int st1h_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1h_z_p_bz_s_x32_scaled */
	/* 1110010|msz=01|11|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE4E08000) {
		decode_fields32(ENC_ST1H_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_ST1H_Z_P_BZ_S_X32_SCALED);
	}
	/* class st1h_z_p_bz_d_x32_scaled */
	/* 1110010|msz=01|01|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE4A08000) {
		decode_fields32(ENC_ST1H_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 1;
		OK(ENC_ST1H_Z_P_BZ_D_X32_SCALED);
	}
	/* class st1h_z_p_bz_d_x32_unscaled */
	/* 1110010|msz=01|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE4808000) {
		decode_fields32(ENC_ST1H_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1H_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class st1h_z_p_bz_s_x32_unscaled */
	/* 1110010|msz=01|10|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE4C08000) {
		decode_fields32(ENC_ST1H_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x10;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1H_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class st1h_z_p_bz_d_64_scaled */
	/* 1110010|msz=01|01|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4A0A000) {
		decode_fields32(ENC_ST1H_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 1;
		OK(ENC_ST1H_Z_P_BZ_D_64_SCALED);
	}
	/* class st1h_z_p_bz_d_64_unscaled */
	/* 1110010|msz=01|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE480A000) {
		decode_fields32(ENC_ST1H_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x10;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_ST1H_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* st1w_z_p_ai.xml */
int st1w_z_p_ai(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1w_z_p_ai_s */
	/* 1110010|msz=10|11|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE560A000) {
		decode_fields32(ENC_ST1W_Z_P_AI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1W_Z_P_AI_S);
	}
	/* class st1w_z_p_ai_d */
	/* 1110010|msz=10|10|imm5=xxxxx|101|Pg=xxx|Zn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE540A000) {
		decode_fields32(ENC_ST1W_Z_P_AI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Zn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offset = UINT(dec->imm5);
		OK(ENC_ST1W_Z_P_AI_D);
	}
	return rc;
}

/* st1w_z_p_bi.xml */
int st1w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1w_z_p_bi_ */
	/* 1110010|msz=10|size=xx|0|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF90E000)==0xE500E000) {
		decode_fields32(ENC_ST1W_Z_P_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if((dec->size&2)!=2) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_ST1W_Z_P_BI_);
	}
	return rc;
}

/* st1w_z_p_br.xml */
int st1w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1w_z_p_br_ */
	/* 1110010|10|size=xx|Rm=xxxxx|010|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFF80E000)==0xE5004000) {
		decode_fields32(ENC_ST1W_Z_P_BR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if((dec->size&2)!=2) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = (8) << (UINT(dec->size));
		dec->msize = 0x20;
		OK(ENC_ST1W_Z_P_BR_);
	}
	return rc;
}

/* st1w_z_p_bz.xml */
int st1w_z_p_bz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st1w_z_p_bz_s_x32_scaled */
	/* 1110010|msz=10|11|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE5608000) {
		decode_fields32(ENC_ST1W_Z_P_BZ_S_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_ST1W_Z_P_BZ_S_X32_SCALED);
	}
	/* class st1w_z_p_bz_d_x32_scaled */
	/* 1110010|msz=10|01|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE5208000) {
		decode_fields32(ENC_ST1W_Z_P_BZ_D_X32_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 2;
		OK(ENC_ST1W_Z_P_BZ_D_X32_SCALED);
	}
	/* class st1w_z_p_bz_d_x32_unscaled */
	/* 1110010|msz=10|00|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE5008000) {
		decode_fields32(ENC_ST1W_Z_P_BZ_D_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1W_Z_P_BZ_D_X32_UNSCALED);
	}
	/* class st1w_z_p_bz_s_x32_unscaled */
	/* 1110010|msz=10|10|Zm=xxxxx|1|xs=x|0|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0A000)==0xE5408000) {
		decode_fields32(ENC_ST1W_Z_P_BZ_S_X32_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->msize = 0x20;
		dec->offs_size = 0x20;
		dec->offs_unsigned = dec->xs==0;
		dec->scale = 0;
		OK(ENC_ST1W_Z_P_BZ_S_X32_UNSCALED);
	}
	/* class st1w_z_p_bz_d_64_scaled */
	/* 1110010|msz=10|01|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE520A000) {
		decode_fields32(ENC_ST1W_Z_P_BZ_D_64_SCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 2;
		OK(ENC_ST1W_Z_P_BZ_D_64_SCALED);
	}
	/* class st1w_z_p_bz_d_64_unscaled */
	/* 1110010|msz=10|00|Zm=xxxxx|101|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE500A000) {
		decode_fields32(ENC_ST1W_Z_P_BZ_D_64_UNSCALED, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Zm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->msize = 0x20;
		dec->offs_size = 0x40;
		dec->offs_unsigned = TRUE;
		dec->scale = 0;
		OK(ENC_ST1W_Z_P_BZ_D_64_UNSCALED);
	}
	return rc;
}

/* st2b_z_p_bi.xml */
int st2b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2b_z_p_bi_contiguous */
	/* 1110010|msz=00|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE430E000) {
		decode_fields32(ENC_ST2B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_ST2B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st2b_z_p_br.xml */
int st2b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2b_z_p_br_contiguous */
	/* 1110010|msz=00|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4206000) {
		decode_fields32(ENC_ST2B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->nreg = 2;
		OK(ENC_ST2B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st2d_z_p_bi.xml */
int st2d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2d_z_p_bi_contiguous */
	/* 1110010|msz=11|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE5B0E000) {
		decode_fields32(ENC_ST2D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_ST2D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st2d_z_p_br.xml */
int st2d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2d_z_p_br_contiguous */
	/* 1110010|msz=11|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5A06000) {
		decode_fields32(ENC_ST2D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->nreg = 2;
		OK(ENC_ST2D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st2h_z_p_bi.xml */
int st2h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2h_z_p_bi_contiguous */
	/* 1110010|msz=01|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE4B0E000) {
		decode_fields32(ENC_ST2H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_ST2H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st2h_z_p_br.xml */
int st2h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2h_z_p_br_contiguous */
	/* 1110010|msz=01|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4A06000) {
		decode_fields32(ENC_ST2H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->nreg = 2;
		OK(ENC_ST2H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st2w_z_p_bi.xml */
int st2w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2w_z_p_bi_contiguous */
	/* 1110010|msz=10|opc=01|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE530E000) {
		decode_fields32(ENC_ST2W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 2;
		OK(ENC_ST2W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st2w_z_p_br.xml */
int st2w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st2w_z_p_br_contiguous */
	/* 1110010|msz=10|opc=01|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5206000) {
		decode_fields32(ENC_ST2W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->nreg = 2;
		OK(ENC_ST2W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st3b_z_p_bi.xml */
int st3b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3b_z_p_bi_contiguous */
	/* 1110010|msz=00|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE450E000) {
		decode_fields32(ENC_ST3B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_ST3B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st3b_z_p_br.xml */
int st3b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3b_z_p_br_contiguous */
	/* 1110010|msz=00|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4406000) {
		decode_fields32(ENC_ST3B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->nreg = 3;
		OK(ENC_ST3B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st3d_z_p_bi.xml */
int st3d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3d_z_p_bi_contiguous */
	/* 1110010|msz=11|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE5D0E000) {
		decode_fields32(ENC_ST3D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_ST3D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st3d_z_p_br.xml */
int st3d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3d_z_p_br_contiguous */
	/* 1110010|msz=11|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5C06000) {
		decode_fields32(ENC_ST3D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->nreg = 3;
		OK(ENC_ST3D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st3h_z_p_bi.xml */
int st3h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3h_z_p_bi_contiguous */
	/* 1110010|msz=01|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE4D0E000) {
		decode_fields32(ENC_ST3H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_ST3H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st3h_z_p_br.xml */
int st3h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3h_z_p_br_contiguous */
	/* 1110010|msz=01|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4C06000) {
		decode_fields32(ENC_ST3H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->nreg = 3;
		OK(ENC_ST3H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st3w_z_p_bi.xml */
int st3w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3w_z_p_bi_contiguous */
	/* 1110010|msz=10|opc=10|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE550E000) {
		decode_fields32(ENC_ST3W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 3;
		OK(ENC_ST3W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st3w_z_p_br.xml */
int st3w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st3w_z_p_br_contiguous */
	/* 1110010|msz=10|opc=10|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5406000) {
		decode_fields32(ENC_ST3W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->nreg = 3;
		OK(ENC_ST3W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st4b_z_p_bi.xml */
int st4b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4b_z_p_bi_contiguous */
	/* 1110010|msz=00|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE470E000) {
		decode_fields32(ENC_ST4B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_ST4B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st4b_z_p_br.xml */
int st4b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4b_z_p_br_contiguous */
	/* 1110010|msz=00|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4606000) {
		decode_fields32(ENC_ST4B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->nreg = 4;
		OK(ENC_ST4B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st4d_z_p_bi.xml */
int st4d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4d_z_p_bi_contiguous */
	/* 1110010|msz=11|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE5F0E000) {
		decode_fields32(ENC_ST4D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_ST4D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st4d_z_p_br.xml */
int st4d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4d_z_p_br_contiguous */
	/* 1110010|msz=11|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5E06000) {
		decode_fields32(ENC_ST4D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->nreg = 4;
		OK(ENC_ST4D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st4h_z_p_bi.xml */
int st4h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4h_z_p_bi_contiguous */
	/* 1110010|msz=01|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE4F0E000) {
		decode_fields32(ENC_ST4H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_ST4H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st4h_z_p_br.xml */
int st4h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4h_z_p_br_contiguous */
	/* 1110010|msz=01|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4E06000) {
		decode_fields32(ENC_ST4H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->nreg = 4;
		OK(ENC_ST4H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* st4w_z_p_bi.xml */
int st4w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4w_z_p_bi_contiguous */
	/* 1110010|msz=10|opc=11|1|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE570E000) {
		decode_fields32(ENC_ST4W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		dec->nreg = 4;
		OK(ENC_ST4W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* st4w_z_p_br.xml */
int st4w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class st4w_z_p_br_contiguous */
	/* 1110010|msz=10|opc=11|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5606000) {
		decode_fields32(ENC_ST4W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->nreg = 4;
		OK(ENC_ST4W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* stnt1b_z_p_bi.xml */
int stnt1b_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1b_z_p_bi_contiguous */
	/* 1110010|msz=00|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE410E000) {
		decode_fields32(ENC_STNT1B_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_STNT1B_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* stnt1b_z_p_br.xml */
int stnt1b_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1b_z_p_br_contiguous */
	/* 1110010|msz=00|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4006000) {
		decode_fields32(ENC_STNT1B_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 8;
		OK(ENC_STNT1B_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* stnt1d_z_p_bi.xml */
int stnt1d_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1d_z_p_bi_contiguous */
	/* 1110010|msz=11|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE590E000) {
		decode_fields32(ENC_STNT1D_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_STNT1D_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* stnt1d_z_p_br.xml */
int stnt1d_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1d_z_p_br_contiguous */
	/* 1110010|msz=11|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5806000) {
		decode_fields32(ENC_STNT1D_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x40;
		OK(ENC_STNT1D_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* stnt1h_z_p_bi.xml */
int stnt1h_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1h_z_p_bi_contiguous */
	/* 1110010|msz=01|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE490E000) {
		decode_fields32(ENC_STNT1H_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_STNT1H_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* stnt1h_z_p_br.xml */
int stnt1h_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1h_z_p_br_contiguous */
	/* 1110010|msz=01|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE4806000) {
		decode_fields32(ENC_STNT1H_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x10;
		OK(ENC_STNT1H_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* stnt1w_z_p_bi.xml */
int stnt1w_z_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1w_z_p_bi_contiguous */
	/* 1110010|msz=10|001|imm4=xxxx|111|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFF0E000)==0xE510E000) {
		decode_fields32(ENC_STNT1W_Z_P_BI_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		dec->offset = SInt(dec->imm4,4);
		OK(ENC_STNT1W_Z_P_BI_CONTIGUOUS);
	}
	return rc;
}

/* stnt1w_z_p_br.xml */
int stnt1w_z_p_br(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class stnt1w_z_p_br_contiguous */
	/* 1110010|msz=10|00|Rm=xxxxx|011|Pg=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFE0E000)==0xE5006000) {
		decode_fields32(ENC_STNT1W_Z_P_BR_CONTIGUOUS, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->Rm==0x1f) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->g = UINT(dec->Pg);
		dec->esize = 0x20;
		OK(ENC_STNT1W_Z_P_BR_CONTIGUOUS);
	}
	return rc;
}

/* str_p_bi.xml */
int str_p_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class str_p_bi_ */
	/* 1110010110|imm9h=xxxxxx|000|imm9l=xxx|Rn=xxxxx|0|Pt=xxxx */
	if((INSWORD & 0xFFC0E010)==0xE5800000) {
		decode_fields32(ENC_STR_P_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Pt);
		dec->n = UINT(dec->Rn);
		dec->imm = SInt(((dec->imm9h<<3)|dec->imm9l),9);
		OK(ENC_STR_P_BI_);
	}
	return rc;
}

/* str_z_bi.xml */
int str_z_bi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class str_z_bi_ */
	/* 1110010110|imm9h=xxxxxx|010|imm9l=xxx|Rn=xxxxx|Zt=xxxxx */
	if((INSWORD & 0xFFC0E000)==0xE5804000) {
		decode_fields32(ENC_STR_Z_BI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->t = UINT(dec->Zt);
		dec->n = UINT(dec->Rn);
		dec->imm = SInt(((dec->imm9h<<3)|dec->imm9l),9);
		OK(ENC_STR_Z_BI_);
	}
	return rc;
}

/* sub_z_p_zz.xml */
int sub_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sub_z_p_zz_ */
	/* 00000100|size=xx|000|opc<2:1>=00|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4010000) {
		decode_fields32(ENC_SUB_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_SUB_Z_P_ZZ_);
	}
	return rc;
}

/* sub_z_zi.xml */
int sub_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sub_z_zi_ */
	/* 00100101|size=xx|100|opc<2:1>=00|opc<0>=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2521C000) {
		decode_fields32(ENC_SUB_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		OK(ENC_SUB_Z_ZI_);
	}
	return rc;
}

/* sub_z_zz.xml */
int sub_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sub_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|000|opc<2:1>=00|opc<0>=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4200400) {
		decode_fields32(ENC_SUB_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_SUB_Z_ZZ_);
	}
	return rc;
}

/* subr_z_p_zz.xml */
int subr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class subr_z_p_zz_ */
	/* 00000100|size=xx|000|opc<2:1>=01|opc<0>=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4030000) {
		decode_fields32(ENC_SUBR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		OK(ENC_SUBR_Z_P_ZZ_);
	}
	return rc;
}

/* subr_z_zi.xml */
int subr_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class subr_z_zi_ */
	/* 00100101|size=xx|100|opc<2:1>=01|opc<0>=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2523C000) {
		decode_fields32(ENC_SUBR_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		OK(ENC_SUBR_Z_ZI_);
	}
	return rc;
}

/* sudot_z_zzzi.xml */
int sudot_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sudot_z_zzzi_s */
	/* 01000100|size=10|1|i2=xx|Zm=xxx|00011|U=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44A01C00) {
		decode_fields32(ENC_SUDOT_Z_ZZZI_S, dec);
		if(!HaveSVE() || !HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_SUDOT_Z_ZZZI_S);
	}
	return rc;
}

/* sunpkhi_z_z.xml */
int sunpkhi_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sunpkhi_z_z_ */
	/* 00000101|size=xx|1100|U=0|H=1|001110|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5313800) {
		decode_fields32(ENC_SUNPKHI_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		dec->hi = TRUE;
		OK(ENC_SUNPKHI_Z_Z_);
	}
	/* class sunpklo_z_z_ */
	/* 00000101|size=xx|1100|U=0|H=0|001110|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5303800) {
		decode_fields32(ENC_SUNPKLO_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		dec->hi = FALSE;
		OK(ENC_SUNPKLO_Z_Z_);
	}
	return rc;
}

/* sxtb_z_p_z.xml */
int sxtb_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class sxtb_z_p_z_ */
	/* 00000100|size=xx|010|00|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x410A000) {
		decode_fields32(ENC_SXTB_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->s_esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		OK(ENC_SXTB_Z_P_Z_);
	}
	/* class sxth_z_p_z_ */
	/* 00000100|size=xx|010|01|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x412A000) {
		decode_fields32(ENC_SXTH_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if((dec->size&2)!=2) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->s_esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		OK(ENC_SXTH_Z_P_Z_);
	}
	/* class sxtw_z_p_z_ */
	/* 00000100|size=xx|010|10|U=0|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x414A000) {
		decode_fields32(ENC_SXTW_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->s_esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = FALSE;
		OK(ENC_SXTW_Z_P_Z_);
	}
	return rc;
}

/* tbl_z_zz.xml */
int tbl_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class tbl_z_zz_1 */
	/* 00000101|size=xx|1|Zm=xxxxx|001100|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5203000) {
		decode_fields32(ENC_TBL_Z_ZZ_1, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		OK(ENC_TBL_Z_ZZ_1);
	}
	return rc;
}

/* trn1_p_pp.xml */
int trn1_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class trn1_p_pp_ */
	/* 00000101|size=xx|10|Pm=xxxx|010|opc=10|H=0|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF30FE10)==0x5205000) {
		decode_fields32(ENC_TRN1_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->part = 0;
		OK(ENC_TRN1_P_PP_);
	}
	/* class trn2_p_pp_ */
	/* 00000101|size=xx|10|Pm=xxxx|010|opc=10|H=1|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF30FE10)==0x5205400) {
		decode_fields32(ENC_TRN2_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->part = 1;
		OK(ENC_TRN2_P_PP_);
	}
	return rc;
}

/* trn1_z_zz.xml */
int trn1_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class trn1_z_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|011|10|H=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5207000) {
		decode_fields32(ENC_TRN1_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 0;
		OK(ENC_TRN1_Z_ZZ_);
	}
	/* class trn1_z_zz_q */
	/* 000001011|op=0|1|Zm=xxxxx|000|11|H=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5A01800) {
		decode_fields32(ENC_TRN1_Z_ZZ_Q, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x80;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 0;
		OK(ENC_TRN1_Z_ZZ_Q);
	}
	/* class trn2_z_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|011|10|H=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5207400) {
		decode_fields32(ENC_TRN2_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 1;
		OK(ENC_TRN2_Z_ZZ_);
	}
	/* class trn2_z_zz_q */
	/* 000001011|op=0|1|Zm=xxxxx|000|11|H=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5A01C00) {
		decode_fields32(ENC_TRN2_Z_ZZ_Q, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x80;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 1;
		OK(ENC_TRN2_Z_ZZ_Q);
	}
	return rc;
}

/* uabd_z_p_zz.xml */
int uabd_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uabd_z_p_zz_ */
	/* 00000100|size=xx|001|opc=10|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x40D0000) {
		decode_fields32(ENC_UABD_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = TRUE;
		OK(ENC_UABD_Z_P_ZZ_);
	}
	return rc;
}

/* uaddv_r_p_z.xml */
int uaddv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uaddv_r_p_z_ */
	/* 00000100|size=xx|000|opc=00|U=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4012000) {
		decode_fields32(ENC_UADDV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		OK(ENC_UADDV_R_P_Z_);
	}
	return rc;
}

/* ucvtf_z_p_z.xml */
int ucvtf_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ucvtf_z_p_z_h2fp16 */
	/* 01100101|opc=01|010|opc2=01|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6553A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_H2FP16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x10;
		dec->d_esize = 0x10;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_H2FP16);
	}
	/* class ucvtf_z_p_z_w2fp16 */
	/* 01100101|opc=01|010|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6555A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_W2FP16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x10;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_W2FP16);
	}
	/* class ucvtf_z_p_z_w2s */
	/* 01100101|opc=10|010|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6595A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_W2S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x20;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_W2S);
	}
	/* class ucvtf_z_p_z_w2d */
	/* 01100101|opc=11|010|opc2=00|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D1A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_W2D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x20;
		dec->d_esize = 0x40;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_W2D);
	}
	/* class ucvtf_z_p_z_x2fp16 */
	/* 01100101|opc=01|010|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x6557A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_X2FP16, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x10;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_X2FP16);
	}
	/* class ucvtf_z_p_z_x2s */
	/* 01100101|opc=11|010|opc2=10|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D5A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_X2S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x20;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_X2S);
	}
	/* class ucvtf_z_p_z_x2d */
	/* 01100101|opc=11|010|opc2=11|int_U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFFFE000)==0x65D7A000) {
		decode_fields32(ENC_UCVTF_Z_P_Z_X2D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->s_esize = 0x40;
		dec->d_esize = 0x40;
		dec->unsigned_ = TRUE;
		dec->rounding = FPRoundingMode(SLICE(ctx->FPCR,0x1f,0));
		OK(ENC_UCVTF_Z_P_Z_X2D);
	}
	return rc;
}

/* udiv_z_p_zz.xml */
int udiv_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class udiv_z_p_zz_ */
	/* 00000100|size=xx|0101|R=0|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4150000) {
		decode_fields32(ENC_UDIV_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = TRUE;
		OK(ENC_UDIV_Z_P_ZZ_);
	}
	return rc;
}

/* udivr_z_p_zz.xml */
int udivr_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class udivr_z_p_zz_ */
	/* 00000100|size=xx|0101|R=1|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4170000) {
		decode_fields32(ENC_UDIVR_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = TRUE;
		OK(ENC_UDIVR_Z_P_ZZ_);
	}
	return rc;
}

/* udot_z_zzz.xml */
int udot_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class udot_z_zzz_ */
	/* 01000100|size=xx|0|Zm=xxxxx|00000|U=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x44000400) {
		decode_fields32(ENC_UDOT_Z_ZZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(!(dec->size&2)) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_UDOT_Z_ZZZ_);
	}
	return rc;
}

/* udot_z_zzzi.xml */
int udot_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class udot_z_zzzi_s */
	/* 01000100|size=10|1|i2=xx|Zm=xxx|00000|U=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44A00400) {
		decode_fields32(ENC_UDOT_Z_ZZZI_S, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_UDOT_Z_ZZZI_S);
	}
	/* class udot_z_zzzi_d */
	/* 01000100|size=11|1|i1=x|Zm=xxxx|00000|U=1|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44E00400) {
		decode_fields32(ENC_UDOT_Z_ZZZI_D, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->index = UINT(dec->i1);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_UDOT_Z_ZZZI_D);
	}
	return rc;
}

/* umax_z_p_zz.xml */
int umax_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class umax_z_p_zz_ */
	/* 00000100|size=xx|001|opc=00|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4090000) {
		decode_fields32(ENC_UMAX_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = TRUE;
		OK(ENC_UMAX_Z_P_ZZ_);
	}
	return rc;
}

/* umax_z_zi.xml */
int umax_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class umax_z_zi_ */
	/* 00100101|size=xx|101|00|U=1|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x2529C000) {
		decode_fields32(ENC_UMAX_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = TRUE;
		dec->imm = UINT(dec->imm8);
		OK(ENC_UMAX_Z_ZI_);
	}
	return rc;
}

/* umaxv_r_p_z.xml */
int umaxv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class umaxv_r_p_z_ */
	/* 00000100|size=xx|001|opc=00|U=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4092000) {
		decode_fields32(ENC_UMAXV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		dec->unsigned_ = TRUE;
		OK(ENC_UMAXV_R_P_Z_);
	}
	return rc;
}

/* umin_z_p_zz.xml */
int umin_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class umin_z_p_zz_ */
	/* 00000100|size=xx|001|opc=01|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x40B0000) {
		decode_fields32(ENC_UMIN_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = TRUE;
		OK(ENC_UMIN_Z_P_ZZ_);
	}
	return rc;
}

/* umin_z_zi.xml */
int umin_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class umin_z_zi_ */
	/* 00100101|size=xx|101|01|U=1|11|o2=0|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x252BC000) {
		decode_fields32(ENC_UMIN_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = TRUE;
		dec->imm = UINT(dec->imm8);
		OK(ENC_UMIN_Z_ZI_);
	}
	return rc;
}

/* uminv_r_p_z.xml */
int uminv_r_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uminv_r_p_z_ */
	/* 00000100|size=xx|001|opc=01|U=1|001|Pg=xxx|Zn=xxxxx|Vd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x40B2000) {
		decode_fields32(ENC_UMINV_R_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Vd);
		dec->unsigned_ = TRUE;
		OK(ENC_UMINV_R_P_Z_);
	}
	return rc;
}

/* ummla_z_zzz.xml */
int ummla_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class ummla_z_zzz_ */
	/* 01000101|uns=11|0|Zm=xxxxx|100110|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x45C09800) {
		decode_fields32(ENC_UMMLA_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_unsigned = TRUE;
		dec->op2_unsigned = TRUE;
		OK(ENC_UMMLA_Z_ZZZ_);
	}
	return rc;
}

/* umulh_z_p_zz.xml */
int umulh_z_p_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class umulh_z_p_zz_ */
	/* 00000100|size=xx|0100|H=1|U=1|000|Pg=xxx|Zm=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x4130000) {
		decode_fields32(ENC_UMULH_Z_P_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->g = UINT(dec->Pg);
		dec->dn = UINT(dec->Zdn);
		dec->m = UINT(dec->Zm);
		dec->unsigned_ = TRUE;
		OK(ENC_UMULH_Z_P_ZZ_);
	}
	return rc;
}

/* uqadd_z_zi.xml */
int uqadd_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqadd_z_zi_ */
	/* 00100101|size=xx|100|10|U=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2525C000) {
		decode_fields32(ENC_UQADD_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		dec->unsigned_ = TRUE;
		OK(ENC_UQADD_Z_ZI_);
	}
	return rc;
}

/* uqadd_z_zz.xml */
int uqadd_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqadd_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|000|10|U=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4201400) {
		decode_fields32(ENC_UQADD_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		OK(ENC_UQADD_Z_ZZ_);
	}
	return rc;
}

/* uqdecb_r_rs.xml */
int uqdecb_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecb_r_rs_uw */
	/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x420FC00) {
		decode_fields32(ENC_UQDECB_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQDECB_R_RS_UW);
	}
	/* class uqdecb_r_rs_x */
	/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x430FC00) {
		decode_fields32(ENC_UQDECB_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQDECB_R_RS_X);
	}
	return rc;
}

/* uqdecd_r_rs.xml */
int uqdecd_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecd_r_rs_uw */
	/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0FC00) {
		decode_fields32(ENC_UQDECD_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQDECD_R_RS_UW);
	}
	/* class uqdecd_r_rs_x */
	/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0FC00) {
		decode_fields32(ENC_UQDECD_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQDECD_R_RS_X);
	}
	return rc;
}

/* uqdecd_z_zs.xml */
int uqdecd_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecd_z_zs_ */
	/* 00000100|size=11|10|imm4=xxxx|1100|D=1|U=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0CC00) {
		decode_fields32(ENC_UQDECD_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		OK(ENC_UQDECD_Z_ZS_);
	}
	return rc;
}

/* uqdech_r_rs.xml */
int uqdech_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdech_r_rs_uw */
	/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460FC00) {
		decode_fields32(ENC_UQDECH_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQDECH_R_RS_UW);
	}
	/* class uqdech_r_rs_x */
	/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470FC00) {
		decode_fields32(ENC_UQDECH_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQDECH_R_RS_X);
	}
	return rc;
}

/* uqdech_z_zs.xml */
int uqdech_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdech_z_zs_ */
	/* 00000100|size=01|10|imm4=xxxx|1100|D=1|U=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460CC00) {
		decode_fields32(ENC_UQDECH_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		OK(ENC_UQDECH_Z_ZS_);
	}
	return rc;
}

/* uqdecp_r_p_r.xml */
int uqdecp_r_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecp_r_p_r_uw */
	/* 00100101|size=xx|1010|D=1|U=1|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252B8800) {
		decode_fields32(ENC_UQDECP_R_P_R_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQDECP_R_P_R_UW);
	}
	/* class uqdecp_r_p_r_x */
	/* 00100101|size=xx|1010|D=1|U=1|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252B8C00) {
		decode_fields32(ENC_UQDECP_R_P_R_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQDECP_R_P_R_X);
	}
	return rc;
}

/* uqdecp_z_p_z.xml */
int uqdecp_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecp_z_p_z_ */
	/* 00100101|size=xx|1010|D=1|U=1|10000|opc=00|Pm=xxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x252B8000) {
		decode_fields32(ENC_UQDECP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = TRUE;
		OK(ENC_UQDECP_Z_P_Z_);
	}
	return rc;
}

/* uqdecw_r_rs.xml */
int uqdecw_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecw_r_rs_uw */
	/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0FC00) {
		decode_fields32(ENC_UQDECW_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQDECW_R_RS_UW);
	}
	/* class uqdecw_r_rs_x */
	/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=1|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0FC00) {
		decode_fields32(ENC_UQDECW_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQDECW_R_RS_X);
	}
	return rc;
}

/* uqdecw_z_zs.xml */
int uqdecw_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqdecw_z_zs_ */
	/* 00000100|size=10|10|imm4=xxxx|1100|D=1|U=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0CC00) {
		decode_fields32(ENC_UQDECW_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		OK(ENC_UQDECW_Z_ZS_);
	}
	return rc;
}

/* uqincb_r_rs.xml */
int uqincb_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincb_r_rs_uw */
	/* 00000100|size=00|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x420F400) {
		decode_fields32(ENC_UQINCB_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQINCB_R_RS_UW);
	}
	/* class uqincb_r_rs_x */
	/* 00000100|size=00|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x430F400) {
		decode_fields32(ENC_UQINCB_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 8;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQINCB_R_RS_X);
	}
	return rc;
}

/* uqincd_r_rs.xml */
int uqincd_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincd_r_rs_uw */
	/* 00000100|size=11|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0F400) {
		decode_fields32(ENC_UQINCD_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQINCD_R_RS_UW);
	}
	/* class uqincd_r_rs_x */
	/* 00000100|size=11|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4F0F400) {
		decode_fields32(ENC_UQINCD_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQINCD_R_RS_X);
	}
	return rc;
}

/* uqincd_z_zs.xml */
int uqincd_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincd_z_zs_ */
	/* 00000100|size=11|10|imm4=xxxx|1100|D=0|U=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4E0C400) {
		decode_fields32(ENC_UQINCD_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x40;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		OK(ENC_UQINCD_Z_ZS_);
	}
	return rc;
}

/* uqinch_r_rs.xml */
int uqinch_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqinch_r_rs_uw */
	/* 00000100|size=01|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460F400) {
		decode_fields32(ENC_UQINCH_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQINCH_R_RS_UW);
	}
	/* class uqinch_r_rs_x */
	/* 00000100|size=01|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x470F400) {
		decode_fields32(ENC_UQINCH_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQINCH_R_RS_X);
	}
	return rc;
}

/* uqinch_z_zs.xml */
int uqinch_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqinch_z_zs_ */
	/* 00000100|size=01|10|imm4=xxxx|1100|D=0|U=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x460C400) {
		decode_fields32(ENC_UQINCH_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x10;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		OK(ENC_UQINCH_Z_ZS_);
	}
	return rc;
}

/* uqincp_r_p_r.xml */
int uqincp_r_p_r(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincp_r_p_r_uw */
	/* 00100101|size=xx|1010|D=0|U=1|10001|sf=0|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x25298800) {
		decode_fields32(ENC_UQINCP_R_P_R_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQINCP_R_P_R_UW);
	}
	/* class uqincp_r_p_r_x */
	/* 00100101|size=xx|1010|D=0|U=1|10001|sf=1|op=0|Pm=xxxx|Rdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x25298C00) {
		decode_fields32(ENC_UQINCP_R_P_R_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Rdn);
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQINCP_R_P_R_X);
	}
	return rc;
}

/* uqincp_z_p_z.xml */
int uqincp_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincp_z_p_z_ */
	/* 00100101|size=xx|1010|D=0|U=1|10000|opc=00|Pm=xxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FFE00)==0x25298000) {
		decode_fields32(ENC_UQINCP_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->m = UINT(dec->Pm);
		dec->dn = UINT(dec->Zdn);
		dec->unsigned_ = TRUE;
		OK(ENC_UQINCP_Z_P_Z_);
	}
	return rc;
}

/* uqincw_r_rs.xml */
int uqincw_r_rs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincw_r_rs_uw */
	/* 00000100|size=10|1|sf=0|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0F400) {
		decode_fields32(ENC_UQINCW_R_RS_UW, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x20;
		OK(ENC_UQINCW_R_RS_UW);
	}
	/* class uqincw_r_rs_x */
	/* 00000100|size=10|1|sf=1|imm4=xxxx|1111|D=0|U=1|pattern=xxxxx|Rdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4B0F400) {
		decode_fields32(ENC_UQINCW_R_RS_X, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Rdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		dec->ssize = 0x40;
		OK(ENC_UQINCW_R_RS_X);
	}
	return rc;
}

/* uqincw_z_zs.xml */
int uqincw_z_zs(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqincw_z_zs_ */
	/* 00000100|size=10|10|imm4=xxxx|1100|D=0|U=1|pattern=xxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFFF0FC00)==0x4A0C400) {
		decode_fields32(ENC_UQINCW_Z_ZS_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->dn = UINT(dec->Zdn);
		dec->pat = dec->pattern;
		dec->imm = UINT(dec->imm4)+1;
		dec->unsigned_ = TRUE;
		OK(ENC_UQINCW_Z_ZS_);
	}
	return rc;
}

/* uqsub_z_zi.xml */
int uqsub_z_zi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqsub_z_zi_ */
	/* 00100101|size=xx|100|11|U=1|11|sh=x|imm8=xxxxxxxx|Zdn=xxxxx */
	if((INSWORD & 0xFF3FC000)==0x2527C000) {
		decode_fields32(ENC_UQSUB_Z_ZI_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(((dec->size<<1)|dec->sh)==1) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->dn = UINT(dec->Zdn);
		dec->imm = UINT(dec->imm8);
		if(dec->sh==1) {
			dec->imm = (dec->imm) << (8);
		}
		dec->unsigned_ = TRUE;
		OK(ENC_UQSUB_Z_ZI_);
	}
	return rc;
}

/* uqsub_z_zz.xml */
int uqsub_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uqsub_z_zz_ */
	/* 00000100|size=xx|1|Zm=xxxxx|000|11|U=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x4201C00) {
		decode_fields32(ENC_UQSUB_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		OK(ENC_UQSUB_Z_ZZ_);
	}
	return rc;
}

/* usdot_z_zzz.xml */
int usdot_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class usdot_z_zzz_s */
	/* 01000100|size=10|0|Zm=xxxxx|011110|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44807800) {
		decode_fields32(ENC_USDOT_Z_ZZZ_S, dec);
		if(!HaveSVE() || !HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_USDOT_Z_ZZZ_S);
	}
	return rc;
}

/* usdot_z_zzzi.xml */
int usdot_z_zzzi(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class usdot_z_zzzi_s */
	/* 01000100|size=10|1|i2=xx|Zm=xxx|00011|U=0|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x44A01800) {
		decode_fields32(ENC_USDOT_Z_ZZZI_S, dec);
		if(!HaveSVE() || !HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x20;
		dec->index = UINT(dec->i2);
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		OK(ENC_USDOT_Z_ZZZI_S);
	}
	return rc;
}

/* usmmla_z_zzz.xml */
int usmmla_z_zzz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class usmmla_z_zzz_ */
	/* 01000101|uns=10|0|Zm=xxxxx|100110|Zn=xxxxx|Zda=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x45809800) {
		decode_fields32(ENC_USMMLA_Z_ZZZ_, dec);
		if(!HaveSVE() || !HaveInt8MatMulExt()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->da = UINT(dec->Zda);
		dec->op1_unsigned = TRUE;
		dec->op2_unsigned = FALSE;
		OK(ENC_USMMLA_Z_ZZZ_);
	}
	return rc;
}

/* uunpkhi_z_z.xml */
int uunpkhi_z_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uunpkhi_z_z_ */
	/* 00000101|size=xx|1100|U=1|H=1|001110|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5333800) {
		decode_fields32(ENC_UUNPKHI_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		dec->hi = TRUE;
		OK(ENC_UUNPKHI_Z_Z_);
	}
	/* class uunpklo_z_z_ */
	/* 00000101|size=xx|1100|U=1|H=0|001110|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FFC00)==0x5323800) {
		decode_fields32(ENC_UUNPKLO_Z_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		dec->hi = FALSE;
		OK(ENC_UUNPKLO_Z_Z_);
	}
	return rc;
}

/* uxtb_z_p_z.xml */
int uxtb_z_p_z(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uxtb_z_p_z_ */
	/* 00000100|size=xx|010|00|U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x411A000) {
		decode_fields32(ENC_UXTB_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size==0) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->s_esize = 8;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		OK(ENC_UXTB_Z_P_Z_);
	}
	/* class uxth_z_p_z_ */
	/* 00000100|size=xx|010|01|U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x413A000) {
		decode_fields32(ENC_UXTH_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if((dec->size&2)!=2) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->s_esize = 0x10;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		OK(ENC_UXTH_Z_P_Z_);
	}
	/* class uxtw_z_p_z_ */
	/* 00000100|size=xx|010|10|U=1|101|Pg=xxx|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF3FE000)==0x415A000) {
		decode_fields32(ENC_UXTW_Z_P_Z_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		if(dec->size!=3) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->s_esize = 0x20;
		dec->g = UINT(dec->Pg);
		dec->n = UINT(dec->Zn);
		dec->d = UINT(dec->Zd);
		dec->unsigned_ = TRUE;
		OK(ENC_UXTW_Z_P_Z_);
	}
	return rc;
}

/* uzp1_p_pp.xml */
int uzp1_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uzp1_p_pp_ */
	/* 00000101|size=xx|10|Pm=xxxx|010|opc=01|H=0|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF30FE10)==0x5204800) {
		decode_fields32(ENC_UZP1_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->part = 0;
		OK(ENC_UZP1_P_PP_);
	}
	/* class uzp2_p_pp_ */
	/* 00000101|size=xx|10|Pm=xxxx|010|opc=01|H=1|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF30FE10)==0x5204C00) {
		decode_fields32(ENC_UZP2_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->part = 1;
		OK(ENC_UZP2_P_PP_);
	}
	return rc;
}

/* uzp1_z_zz.xml */
int uzp1_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class uzp1_z_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|011|01|H=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5206800) {
		decode_fields32(ENC_UZP1_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 0;
		OK(ENC_UZP1_Z_ZZ_);
	}
	/* class uzp1_z_zz_q */
	/* 000001011|op=0|1|Zm=xxxxx|000|01|H=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5A00800) {
		decode_fields32(ENC_UZP1_Z_ZZ_Q, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x80;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 0;
		OK(ENC_UZP1_Z_ZZ_Q);
	}
	/* class uzp2_z_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|011|01|H=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5206C00) {
		decode_fields32(ENC_UZP2_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 1;
		OK(ENC_UZP2_Z_ZZ_);
	}
	/* class uzp2_z_zz_q */
	/* 000001011|op=0|1|Zm=xxxxx|000|01|H=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5A00C00) {
		decode_fields32(ENC_UZP2_Z_ZZ_Q, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x80;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 1;
		OK(ENC_UZP2_Z_ZZ_Q);
	}
	return rc;
}

/* whilele_p_p_rr.xml */
int whilele_p_p_rr(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class whilele_p_p_rr_ */
	/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=0|lt=1|Rn=xxxxx|eq=1|Pd=xxxx */
	if((INSWORD & 0xFF20EC10)==0x25200410) {
		decode_fields32(ENC_WHILELE_P_P_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->rsize = (0x20) << (UINT(dec->sf));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Pd);
		dec->unsigned_ = FALSE;
		dec->op = Cmp_LE;
		OK(ENC_WHILELE_P_P_RR_);
	}
	return rc;
}

/* whilelo_p_p_rr.xml */
int whilelo_p_p_rr(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class whilelo_p_p_rr_ */
	/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=1|lt=1|Rn=xxxxx|eq=0|Pd=xxxx */
	if((INSWORD & 0xFF20EC10)==0x25200C00) {
		decode_fields32(ENC_WHILELO_P_P_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->rsize = (0x20) << (UINT(dec->sf));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Pd);
		dec->unsigned_ = TRUE;
		dec->op = Cmp_LT;
		OK(ENC_WHILELO_P_P_RR_);
	}
	return rc;
}

/* whilels_p_p_rr.xml */
int whilels_p_p_rr(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class whilels_p_p_rr_ */
	/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=1|lt=1|Rn=xxxxx|eq=1|Pd=xxxx */
	if((INSWORD & 0xFF20EC10)==0x25200C10) {
		decode_fields32(ENC_WHILELS_P_P_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->rsize = (0x20) << (UINT(dec->sf));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Pd);
		dec->unsigned_ = TRUE;
		dec->op = Cmp_LE;
		OK(ENC_WHILELS_P_P_RR_);
	}
	return rc;
}

/* whilelt_p_p_rr.xml */
int whilelt_p_p_rr(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class whilelt_p_p_rr_ */
	/* 00100101|size=xx|1|Rm=xxxxx|000|sf=x|U=0|lt=1|Rn=xxxxx|eq=0|Pd=xxxx */
	if((INSWORD & 0xFF20EC10)==0x25200400) {
		decode_fields32(ENC_WHILELT_P_P_RR_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->rsize = (0x20) << (UINT(dec->sf));
		dec->n = UINT(dec->Rn);
		dec->m = UINT(dec->Rm);
		dec->d = UINT(dec->Pd);
		dec->unsigned_ = FALSE;
		dec->op = Cmp_LT;
		OK(ENC_WHILELT_P_P_RR_);
	}
	return rc;
}

/* wrffr_f_p.xml */
int wrffr_f_p(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class wrffr_f_p_ */
	/* 00|100101|opc=00|10|1000100100|0|Pn=xxxx|0|0|0|00 */
	if((INSWORD & 0xFFFFFE1F)==0x25289000) {
		decode_fields32(ENC_WRFFR_F_P_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->n = UINT(dec->Pn);
		OK(ENC_WRFFR_F_P_);
	}
	return rc;
}

/* zip1_p_pp.xml */
int zip1_p_pp(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zip2_p_pp_ */
	/* 00000101|size=xx|10|Pm=xxxx|010|opc=00|H=1|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF30FE10)==0x5204400) {
		decode_fields32(ENC_ZIP2_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->part = 1;
		OK(ENC_ZIP2_P_PP_);
	}
	/* class zip1_p_pp_ */
	/* 00000101|size=xx|10|Pm=xxxx|010|opc=00|H=0|0|Pn=xxxx|0|Pd=xxxx */
	if((INSWORD & 0xFF30FE10)==0x5204000) {
		decode_fields32(ENC_ZIP1_P_PP_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Pn);
		dec->m = UINT(dec->Pm);
		dec->d = UINT(dec->Pd);
		dec->part = 0;
		OK(ENC_ZIP1_P_PP_);
	}
	return rc;
}

/* zip1_z_zz.xml */
int zip1_z_zz(context *ctx, Instruction *dec)
{
	int rc = DECODE_STATUS_UNMATCHED;
	/* class zip2_z_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|011|00|H=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5206400) {
		decode_fields32(ENC_ZIP2_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 1;
		OK(ENC_ZIP2_Z_ZZ_);
	}
	/* class zip2_z_zz_q */
	/* 000001011|op=0|1|Zm=xxxxx|000|00|H=1|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5A00400) {
		decode_fields32(ENC_ZIP2_Z_ZZ_Q, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x80;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 1;
		OK(ENC_ZIP2_Z_ZZ_Q);
	}
	/* class zip1_z_zz_ */
	/* 00000101|size=xx|1|Zm=xxxxx|011|00|H=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFF20FC00)==0x5206000) {
		decode_fields32(ENC_ZIP1_Z_ZZ_, dec);
		if(!HaveSVE()) {
			UNDEFINED;
		}
		dec->esize = (8) << (UINT(dec->size));
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 0;
		OK(ENC_ZIP1_Z_ZZ_);
	}
	/* class zip1_z_zz_q */
	/* 000001011|op=0|1|Zm=xxxxx|000|00|H=0|Zn=xxxxx|Zd=xxxxx */
	if((INSWORD & 0xFFE0FC00)==0x5A00000) {
		decode_fields32(ENC_ZIP1_Z_ZZ_Q, dec);
		if(!HaveSVEFP64MatMulExt()) {
			UNDEFINED;
		}
		dec->esize = 0x80;
		dec->n = UINT(dec->Zn);
		dec->m = UINT(dec->Zm);
		dec->d = UINT(dec->Zd);
		dec->part = 0;
		OK(ENC_ZIP1_Z_ZZ_Q);
	}
	return rc;
}

