* Copyright (c) 2015-2023 Google, Inc. All rights reserved.
* Copyright (c) 2016 ARM Limited. All rights reserved.
* **********************************************************/
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of ARM Limited nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL ARM LIMITED OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
* versions of these routines.
*/
#ifndef STANDALONE_DECODER
# define DR_FAST_IR 1
#endif
* being a client library working with DR on a target program.
*/
#include "configure.h"
#include "dr_api.h"
#include "tools.h"
static byte buf[8192];
reg_id_t Q_registers[31] = { DR_REG_Q1, DR_REG_Q2, DR_REG_Q3, DR_REG_Q4, DR_REG_Q5,
DR_REG_Q6, DR_REG_Q7, DR_REG_Q8, DR_REG_Q9, DR_REG_Q10,
DR_REG_Q11, DR_REG_Q12, DR_REG_Q13, DR_REG_Q14, DR_REG_Q15,
DR_REG_Q16, DR_REG_Q17, DR_REG_Q18, DR_REG_Q19, DR_REG_Q21,
DR_REG_Q22, DR_REG_Q23, DR_REG_Q24, DR_REG_Q25, DR_REG_Q26,
DR_REG_Q27, DR_REG_Q28, DR_REG_Q29, DR_REG_Q30, DR_REG_Q31 };
reg_id_t D_registers[31] = { DR_REG_D1, DR_REG_D2, DR_REG_D3, DR_REG_D4, DR_REG_D5,
DR_REG_D6, DR_REG_D7, DR_REG_D8, DR_REG_D9, DR_REG_D10,
DR_REG_D11, DR_REG_D12, DR_REG_D13, DR_REG_D14, DR_REG_D15,
DR_REG_D16, DR_REG_D17, DR_REG_D18, DR_REG_D19, DR_REG_D21,
DR_REG_D22, DR_REG_D23, DR_REG_D24, DR_REG_D25, DR_REG_D26,
DR_REG_D27, DR_REG_D28, DR_REG_D29, DR_REG_D30, DR_REG_D31 };
#ifdef STANDALONE_DECODER
# define ASSERT(x) \
((void)((!(x)) ? (fprintf(stderr, "ASSERT FAILURE (standalone): %s:%d: %s\n", \
__FILE__, __LINE__, #x), \
abort(), 0) \
: 0))
#else
# define ASSERT(x) \
((void)((!(x)) ? (dr_fprintf(STDERR, "ASSERT FAILURE (client): %s:%d: %s\n", \
__FILE__, __LINE__, #x), \
dr_abort(), 0) \
: 0))
#endif
static void
test_base_disp_extend(dr_extend_type_t ext, bool scaled, opnd_size_t size, uint amount)
{
opnd_t opnd;
dr_extend_type_t ext_out;
bool scaled_out, success;
uint amount_out;
opnd = opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_X2, ext, scaled, 0, 0, size);
ext_out = opnd_get_index_extend(opnd, &scaled_out, &amount_out);
ASSERT(ext == ext_out && scaled == scaled_out && amount == amount_out);
opnd = opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_X2, DR_EXTEND_UXTX, false, 0,
0, size);
success = opnd_set_index_extend(&opnd, ext, scaled);
ASSERT(success);
ext_out = opnd_get_index_extend(opnd, &scaled_out, &amount_out);
ASSERT(ext == ext_out && scaled == scaled_out && amount == amount_out);
}
static void
test_extend(void *dc)
{
opnd_t opnd;
dr_extend_type_t ext;
bool scaled;
uint amount;
test_base_disp_extend(DR_EXTEND_UXTW, true, OPSZ_1, 0);
test_base_disp_extend(DR_EXTEND_UXTX, true, OPSZ_2, 1);
test_base_disp_extend(DR_EXTEND_SXTW, true, OPSZ_4, 2);
test_base_disp_extend(DR_EXTEND_SXTX, true, OPSZ_8, 3);
test_base_disp_extend(DR_EXTEND_UXTW, true, OPSZ_16, 4);
test_base_disp_extend(DR_EXTEND_UXTX, true, OPSZ_0, 3);
test_base_disp_extend(DR_EXTEND_SXTW, false, OPSZ_4, 0);
}
static void
test_instr_encoding(void *dc, uint opcode, instr_t *instr)
{
instr_t *decin;
byte *pc;
ASSERT(instr_get_opcode(instr) == opcode);
instr_disassemble(dc, instr, STDERR);
print("\n");
ASSERT(instr_is_encoding_possible(instr));
pc = instr_encode(dc, instr, buf);
decin = instr_create(dc);
decode(dc, buf, decin);
if (!instr_same(instr, decin)) {
print("Dissassembled as:\n");
instr_disassemble(dc, decin, STDERR);
print("\n");
ASSERT(instr_same(instr, decin));
}
instr_destroy(dc, instr);
instr_destroy(dc, decin);
}
static void
test_add(void *dc)
{
byte *pc;
instr_t *instr;
* ADC <Wd>, <Wn>, <Wm>
*/
instr = INSTR_CREATE_adc(dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
opnd_create_reg(DR_REG_W2));
test_instr_encoding(dc, OP_adc, instr);
instr = INSTR_CREATE_adc(dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_X1),
opnd_create_reg(DR_REG_X2));
test_instr_encoding(dc, OP_adc, instr);
* ADCS <Wd>, <Wn>, <Wm>
*/
instr = INSTR_CREATE_adcs(dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
opnd_create_reg(DR_REG_W2));
test_instr_encoding(dc, OP_adcs, instr);
instr = INSTR_CREATE_adcs(dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_X1),
opnd_create_reg(DR_REG_X2));
test_instr_encoding(dc, OP_adcs, instr);
instr = INSTR_CREATE_add(dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_SP),
opnd_create_reg(DR_REG_X1));
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_sub(dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_SP),
opnd_create_reg(DR_REG_X1));
test_instr_encoding(dc, OP_sub, instr);
* ADDS <Wd>, <Wn>, <Wm>{, <shift> #<amount>}
*/
#define adds_shift(reg, shift_type, amount_imm6) \
instr = INSTR_CREATE_adds_shift( \
dc, opnd_create_reg(DR_REG_##reg##0), opnd_create_reg(DR_REG_##reg##1), \
opnd_create_reg(DR_REG_##reg##2), \
opnd_add_flags(OPND_CREATE_INT(shift_type), DR_OPND_IS_SHIFT), \
opnd_create_immed_int(amount_imm6, OPSZ_6b)); \
test_instr_encoding(dc, OP_adds, instr);
adds_shift(W, DR_SHIFT_LSL, 0);
adds_shift(W, DR_SHIFT_LSL, 0x1F);
adds_shift(W, DR_SHIFT_LSR, 0);
adds_shift(W, DR_SHIFT_LSR, 0x1F);
adds_shift(W, DR_SHIFT_ASR, 0);
adds_shift(W, DR_SHIFT_ASR, 0x1F);
* ADDS <Xd>, <Xn>, <Xm>{, <shift> #<amount>}
* Shift range is 0-63 (imm6) for 64 bit variant
*/
adds_shift(X, DR_SHIFT_LSL, 0);
adds_shift(X, DR_SHIFT_LSL, 0x3F);
adds_shift(X, DR_SHIFT_LSR, 0);
adds_shift(X, DR_SHIFT_LSR, 0x3F);
adds_shift(X, DR_SHIFT_ASR, 0);
adds_shift(X, DR_SHIFT_ASR, 0x3F);
* ADDS <Wd>, <Wn|WSP>, #<imm>{, <shift>}
*/
instr =
INSTR_CREATE_adds_imm(dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
opnd_create_immed_int(0, OPSZ_12b), OPND_CREATE_INT8(0));
test_instr_encoding(dc, OP_adds, instr);
instr = INSTR_CREATE_adds_imm(
dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
opnd_create_immed_int(0xFFF, OPSZ_12b), OPND_CREATE_INT8(0));
test_instr_encoding(dc, OP_adds, instr);
* ADDS <Xd>, <Xn|SP>, #<imm>{, <shift>}
*/
instr =
INSTR_CREATE_adds_imm(dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_X1),
opnd_create_immed_int(0, OPSZ_12b), OPND_CREATE_INT8(0));
test_instr_encoding(dc, OP_adds, instr);
instr = INSTR_CREATE_adds_imm(
dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_X1),
opnd_create_immed_int(0xFFF, OPSZ_12b), OPND_CREATE_INT8(0));
test_instr_encoding(dc, OP_adds, instr);
* ADDS <Wd>, <Wn|WSP>, <Wm>{, <extend> {#<amount>}}
*/
#define adds_extend(reg, extend_type, amount_imm3) \
instr = INSTR_CREATE_adds_extend( \
dc, opnd_create_reg(DR_REG_##reg##0), opnd_create_reg(DR_REG_##reg##1), \
opnd_create_reg(DR_REG_##reg##2), \
opnd_add_flags(OPND_CREATE_INT(extend_type), DR_OPND_IS_EXTEND), \
opnd_create_immed_int(amount_imm3, OPSZ_3b)); \
test_instr_encoding(dc, OP_adds, instr);
adds_extend(W, DR_EXTEND_UXTB, 0);
adds_extend(W, DR_EXTEND_UXTH, 1);
adds_extend(W, DR_EXTEND_UXTW, 2);
adds_extend(W, DR_EXTEND_SXTB, 4);
adds_extend(W, DR_EXTEND_SXTH, 0);
adds_extend(W, DR_EXTEND_SXTW, 1);
adds_extend(X, DR_EXTEND_UXTX, 3);
adds_extend(X, DR_EXTEND_SXTX, 2);
}
static void
adr(void *dc)
{
instr_t *instr =
INSTR_CREATE_adr(dc, opnd_create_reg(DR_REG_X1),
OPND_CREATE_ABSMEM((void *)0x0000000010010208, OPSZ_0));
test_instr_encoding(dc, OP_adr, instr);
print("adr complete\n");
}
static void
adrp(void *dc)
{
instr_t *instr =
INSTR_CREATE_adrp(dc, opnd_create_reg(DR_REG_X1),
OPND_CREATE_ABSMEM((void *)0x0000000020208000, OPSZ_0));
test_instr_encoding(dc, OP_adrp, instr);
print("adrp complete\n");
}
static void
ldpsw_base_post_index(void *dc)
{
int dst_reg_0[] = { DR_REG_X1, DR_REG_X15, DR_REG_X29 };
int dst_reg_1[] = { DR_REG_X2, DR_REG_X16, DR_REG_X30 };
int src_reg[] = { DR_REG_X0, DR_REG_X14, DR_REG_X28 };
int value[] = { 0, 4, 252, -256 };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 4; ii++) {
instr_t *instr = INSTR_CREATE_ldpsw(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_8),
OPND_CREATE_INT(value[ii]));
test_instr_encoding(dc, OP_ldpsw, instr);
}
}
print("ldpsw base post-index complete\n");
}
static void
ldpsw_base_pre_index(void *dc)
{
int dst_reg_0[] = { DR_REG_X1, DR_REG_X15, DR_REG_X29 };
int dst_reg_1[] = { DR_REG_X2, DR_REG_X16, DR_REG_X30 };
int src_reg[] = { DR_REG_X0, DR_REG_X14, DR_REG_X28 };
int value[] = { 0, 4, 252, -256 };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 4; ii++) {
instr_t *instr = INSTR_CREATE_ldpsw(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false,
value[ii], 0, OPSZ_8),
OPND_CREATE_INT(value[ii]));
test_instr_encoding(dc, OP_ldpsw, instr);
}
}
print("ldpsw base pre-index complete\n");
}
static void
ldpsw_base_signed_offset(void *dc)
{
int dst_reg_0[] = { DR_REG_X1, DR_REG_X15, DR_REG_X29 };
int dst_reg_1[] = { DR_REG_X2, DR_REG_X16, DR_REG_X30 };
int src_reg[] = { DR_REG_X0, DR_REG_X14, DR_REG_X28 };
int value[] = { 8, 4, 252, -256 };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 4; ii++) {
instr_t *instr = INSTR_CREATE_ldpsw_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false,
value[ii], 0, OPSZ_8));
test_instr_encoding(dc, OP_ldpsw, instr);
}
}
print("ldpsw base signed offset complete\n");
}
static void
ldpsw(void *dc)
{
ldpsw_base_post_index(dc);
ldpsw_base_pre_index(dc);
ldpsw_base_signed_offset(dc);
print("ldpsw complete\n");
}
static void
test_ldar(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_ldar(
dc, opnd_create_reg(DR_REG_W0),
opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_NULL, 0, false, 0, 0, OPSZ_4));
test_instr_encoding(dc, OP_ldar, instr);
instr = INSTR_CREATE_ldar(
dc, opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_NULL, 0, false, 0, 0, OPSZ_8));
test_instr_encoding(dc, OP_ldar, instr);
instr = INSTR_CREATE_ldarb(
dc, opnd_create_reg(DR_REG_W0),
opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_NULL, 0, false, 0, 0, OPSZ_1));
test_instr_encoding(dc, OP_ldarb, instr);
instr = INSTR_CREATE_ldarh(
dc, opnd_create_reg(DR_REG_W0),
opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_NULL, 0, false, 0, 0, OPSZ_2));
test_instr_encoding(dc, OP_ldarh, instr);
}
static void
test_ldapr(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_ldapr(
dc, opnd_create_reg(DR_REG_W0),
opnd_create_base_disp_aarch64(DR_REG_X1, DR_REG_NULL, 0, false, 0, 0, OPSZ_4));
test_instr_encoding(dc, OP_ldapr, instr);
instr = INSTR_CREATE_ldapr(
dc, opnd_create_reg(DR_REG_X2),
opnd_create_base_disp_aarch64(DR_REG_X3, DR_REG_NULL, 0, false, 0, 0, OPSZ_8));
test_instr_encoding(dc, OP_ldapr, instr);
instr = INSTR_CREATE_ldaprb(
dc, opnd_create_reg(DR_REG_W4),
opnd_create_base_disp_aarch64(DR_REG_X5, DR_REG_NULL, 0, false, 0, 0, OPSZ_1));
test_instr_encoding(dc, OP_ldaprb, instr);
instr = INSTR_CREATE_ldaprh(
dc, opnd_create_reg(DR_REG_W6),
opnd_create_base_disp_aarch64(DR_REG_X7, DR_REG_NULL, 0, false, 0, 0, OPSZ_2));
test_instr_encoding(dc, OP_ldaprh, instr);
}
static void
ld2_simdfp_multiple_structures_no_offset(void *dc)
{
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q14, DR_REG_Q28 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q15, DR_REG_Q29 };
const int src_reg[] = { DR_REG_X2, DR_REG_X16, DR_REG_X30 };
* LD2 { <Vt>.<T>, <Vt2>.<T> }[<imm>], [<Xn|SP>]
*/
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2_multi(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_32),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld2, instr);
}
print("ld2 simdfp multiple structures no offset complete\n");
}
static void
ld2_simdfp_multiple_structures_post_index(void *dc)
{
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q29 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
const int offset_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
* # LD2 { <Vt1>.B, <Vt2>.B }, [<Xn|SP>], <Xm>
*/
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2_multi_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_32),
opnd_create_reg(offset_reg[i]), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld2, instr);
}
* # LD2 { <Vt1>.D, <Vt2>.D }, [<Xn|SP>], #16
* # LD2 { <Vt1>.S, <Vt2>.S }, [<Xn|SP>], #8
*/
const int dst_reg_post_index_0[] = { DR_REG_Q0, DR_REG_D2 };
const int dst_reg_post_index_1[] = { DR_REG_Q1, DR_REG_D3 };
const int bit_size[] = { OPSZ_32, OPSZ_16 };
const int imm[] = { 0x20, 0x10 };
const opnd_t elsz[] = { OPND_CREATE_DOUBLE(), OPND_CREATE_SINGLE() };
for (int i = 0; i < 2; i++) {
instr_t *instr = INSTR_CREATE_ld2_multi_2(
dc, opnd_create_reg(dst_reg_post_index_0[i]),
opnd_create_reg(dst_reg_post_index_1[i]), opnd_create_reg(src_reg[0]),
opnd_create_base_disp_aarch64(src_reg[0], DR_REG_NULL, 0, false, 0, 0,
bit_size[i]),
opnd_create_immed_uint(imm[i], OPSZ_PTR), elsz[i]);
test_instr_encoding(dc, OP_ld2, instr);
}
print("ld2 simdfp multiple structures post-index complete\n");
}
static void
ld2_simdfp_single_structure_no_offset(void *dc)
{
for (int index = 0; index < 16; index++) {
instr_t *instr = INSTR_CREATE_ld2(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_2),
opnd_create_immed_uint(index, OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld2, instr);
}
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q29 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_2),
opnd_create_immed_uint(0x01, OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld2, instr);
}
print("ld2 simdfp single structure no offset complete\n");
}
static void
ld2_simdfp_single_structure_post_index(void *dc)
{
* LD2 { <Vt>.B, <Vt2>.B }[<index>], [<Xn|SP>], #2
*/
for (int index = 1; index < 16; index++) {
instr_t *instr = INSTR_CREATE_ld2_2(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_2),
opnd_create_immed_uint(index, OPSZ_1), opnd_create_immed_uint(0x02, OPSZ_PTR),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld2, instr);
}
const int dst_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q29 };
const int dst_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q30 };
const int src[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2_2(
dc, opnd_create_reg(dst_0[i]), opnd_create_reg(dst_1[i]),
opnd_create_reg(src[i]),
opnd_create_base_disp_aarch64(src[i], DR_REG_NULL, 0, false, 0, 0, OPSZ_2),
opnd_create_immed_uint(0x01, OPSZ_1), opnd_create_immed_uint(0x02, OPSZ_PTR),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld2, instr);
}
* LD2 { <Vt>.B, <Vt2>.B }[<index>], [<Xn|SP>], #2
* LD2 { <Vt>.H, <Vt2>.H }[<index>], [<Xn|SP>], #4
* LD2 { <Vt>.S, <Vt2>.S }[<index>], [<Xn|SP>], #8
* LD2 { <Vt>.D, <Vt2>.D }[<index>], [<Xn|SP>], #16
*/
const int opsz[] = { OPSZ_2, OPSZ_4, OPSZ_8, OPSZ_16 };
const opnd_t elsz[] = { OPND_CREATE_BYTE(), OPND_CREATE_HALF(), OPND_CREATE_SINGLE(),
OPND_CREATE_DOUBLE() };
const int imm[] = { 2, 4, 8, 16 };
for (int i = 0; i < 4; i++) {
instr_t *instr =
INSTR_CREATE_ld2_2(dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0,
false, 0, 0, opsz[i]),
opnd_create_immed_uint(0x01, OPSZ_1),
opnd_create_immed_uint(imm[i], OPSZ_PTR), elsz[i]);
test_instr_encoding(dc, OP_ld2, instr);
}
* LD2 { <Vt>.D, <Vt2>.D }[<index>], [<Xn|SP>], <Xm>
*/
const int offset_reg[] = { DR_REG_X1, DR_REG_X16, DR_REG_X29 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2_2(
dc, opnd_create_reg(dst_0[i]), opnd_create_reg(dst_1[i]),
opnd_create_reg(src[i]),
opnd_create_base_disp_aarch64(src[i], DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
opnd_create_immed_uint(0x01, OPSZ_1), opnd_create_reg(offset_reg[i]),
OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld2, instr);
}
print("ld2 simdfp single structure post-index complete\n");
}
static void
ld2(void *dc)
{
ld2_simdfp_multiple_structures_no_offset(dc);
ld2_simdfp_multiple_structures_post_index(dc);
ld2_simdfp_single_structure_no_offset(dc);
ld2_simdfp_single_structure_post_index(dc);
print("ld2 complete\n");
}
static void
ld3_simdfp_multiple_structures_no_offset(void *dc)
{
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q14, DR_REG_Q28 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q15, DR_REG_Q29 };
const int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q16, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X2, DR_REG_X16, DR_REG_X30 };
* LD3 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>]
*/
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 1; ii++) {
instr_t *instr = INSTR_CREATE_ld3_multi(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_48),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld3, instr);
}
}
print("ld3 simdfp multiple structures no offset complete\n");
}
static void
ld3_simdfp_multiple_structures_post_index(void *dc)
{
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q28 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q29 };
const int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
const int offset_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
* LD3 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>], <Xm>
*/
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld3_multi_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_48),
opnd_create_reg(offset_reg[i]), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld3, instr);
}
const int dst_reg_post_index_0[] = { DR_REG_D0, DR_REG_Q0 };
const int dst_reg_post_index_1[] = { DR_REG_D1, DR_REG_Q1 };
const int dst_reg_post_index_2[] = { DR_REG_D2, DR_REG_Q2 };
const int imm[] = { 0x18, 0x30 };
const int opsz[] = { OPSZ_24, OPSZ_48 };
* LD3 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>], <imm>
*/
for (int i = 0; i < 2; i++) {
instr_t *instr = INSTR_CREATE_ld3_multi_2(
dc, opnd_create_reg(dst_reg_post_index_0[i]),
opnd_create_reg(dst_reg_post_index_1[i]),
opnd_create_reg(dst_reg_post_index_2[i]), opnd_create_reg(src_reg[0]),
opnd_create_base_disp_aarch64(src_reg[0], DR_REG_NULL, 0, false, 0, 0,
opsz[i]),
opnd_create_immed_uint(imm[i], OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld3, instr);
}
print("ld3 simdfp multiple structures post-index complete\n");
}
static void
ld3_simdfp_single_structure_no_offset(void *dc)
{
* LD3 { <Vt>.B, <Vt2>.B, <Vt3>.B }[<index>], [<Xn|SP>]
*/
for (int index = 0; index < 16; index++) {
instr_t *instr = INSTR_CREATE_ld3(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q2),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_3),
opnd_create_immed_uint(index, OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld3, instr);
}
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q28 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q29 };
const int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
* LD3 { <Vt>.S, <Vt2>.S, <Vt3>.S }[<index>], [<Xn|SP>]
*/
for (int i = 0; i < 3; i++) {
instr_t *instr =
INSTR_CREATE_ld3(dc, opnd_create_reg(dst_reg_0[i]),
opnd_create_reg(dst_reg_1[i]), opnd_create_reg(dst_reg_2[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0,
false, 0, 0, OPSZ_12),
opnd_create_immed_uint(0x01, OPSZ_1), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld3, instr);
}
print("ld3 simdfp single structure no offset complete\n");
}
static void
ld3_simdfp_single_structure_post_index(void *dc)
{
* LD3 { <Vt>.B, <Vt2>.B, <Vt3>.B }[<index>], [<Xn|SP>], #3
*/
for (int index = 0; index < 16; index++) {
instr_t *instr = INSTR_CREATE_ld3_2(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_3),
opnd_create_immed_uint(index, OPSZ_1), opnd_create_immed_uint(0x03, OPSZ_1),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld3, instr);
}
* LD3 { <Vt>.H, <Vt2>.H, <Vt3>.H }[<index>], [<Xn|SP>], #6
*/
const int dst_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q28 };
const int dst_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q29 };
const int dst_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q30 };
const int src[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld3_2(
dc, opnd_create_reg(dst_0[i]), opnd_create_reg(dst_1[i]),
opnd_create_reg(dst_2[i]), opnd_create_reg(src[i]),
opnd_create_base_disp_aarch64(src[i], DR_REG_NULL, 0, false, 0, 0, OPSZ_6),
opnd_create_immed_uint(0x01, OPSZ_1), opnd_create_immed_uint(0x06, OPSZ_1),
OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ld3, instr);
}
* LD3 { <Vt>.B, <Vt2>.B, <Vt3>.B }[<index>], [<Xn|SP>], #3
* LD3 { <Vt>.H, <Vt2>.H, <Vt3>.H }[<index>], [<Xn|SP>], #6
* LD3 { <Vt>.S, <Vt2>.S, <Vt3>.S }[<index>], [<Xn|SP>], #12
* LD3 { <Vt>.D, <Vt2>.D, <Vt3>.D }[<index>], [<Xn|SP>], #24
*/
const int opsz[] = { OPSZ_3, OPSZ_6, OPSZ_12, OPSZ_24 };
const int imm[] = { 3, 6, 12, 24 };
const opnd_t elsz[] = { OPND_CREATE_BYTE(), OPND_CREATE_HALF(), OPND_CREATE_SINGLE(),
OPND_CREATE_DOUBLE() };
for (int i = 0; i < 4; i++) {
instr_t *instr =
INSTR_CREATE_ld3_2(dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0,
false, 0, 0, opsz[i]),
opnd_create_immed_uint(0x01, OPSZ_1),
opnd_create_immed_uint(imm[i], OPSZ_1), elsz[i]);
test_instr_encoding(dc, OP_ld3, instr);
}
* LD3 { <Vt>.B, <Vt2>.B, <Vt3>.B }[<index>], [<Xn|SP>], #3
*/
const int offset_reg[] = { DR_REG_X1, DR_REG_X16, DR_REG_X29 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld3_2(
dc, opnd_create_reg(dst_0[i]), opnd_create_reg(dst_1[i]),
opnd_create_reg(dst_2[i]), opnd_create_reg(src[i]),
opnd_create_base_disp_aarch64(src[i], DR_REG_NULL, 0, false, 0, 0, OPSZ_3),
opnd_create_immed_uint(0x01, OPSZ_1), opnd_create_reg(offset_reg[i]),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld3, instr);
}
print("ld3 simdfp single structure post-index complete\n");
}
static void
ld3(void *dc)
{
ld3_simdfp_multiple_structures_no_offset(dc);
ld3_simdfp_multiple_structures_post_index(dc);
ld3_simdfp_single_structure_no_offset(dc);
ld3_simdfp_single_structure_post_index(dc);
print("ld3 complete\n");
}
static void
ld4_simdfp_multiple_structures_no_offset(void *dc)
{
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q14, DR_REG_Q27 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q15, DR_REG_Q28 };
const int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q16, DR_REG_Q29 };
const int dst_reg_3[] = { DR_REG_Q3, DR_REG_Q17, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X2, DR_REG_X16, DR_REG_X30 };
* LD4 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>]
*/
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4_multi(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(dst_reg_3[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_64),
OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld4, instr);
}
print("ld4 simdfp multiple structures no offset complete\n");
}
static void
ld4_simdfp_multiple_structures_post_index(void *dc)
{
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q27 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q28 };
const int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q29 };
const int dst_reg_3[] = { DR_REG_Q3, DR_REG_Q18, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
const int offset_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4_multi_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(dst_reg_3[i]),
opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_64),
opnd_create_reg(offset_reg[i]), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld4, instr);
}
const int dst_reg_post_index_0[] = { DR_REG_D0, DR_REG_Q0 };
const int dst_reg_post_index_1[] = { DR_REG_D1, DR_REG_Q1 };
const int dst_reg_post_index_2[] = { DR_REG_D2, DR_REG_Q2 };
const int dst_reg_post_index_3[] = { DR_REG_D3, DR_REG_Q3 };
const int imm[] = { 0x20, 0x40 };
const int opsz[] = { OPSZ_32, OPSZ_64 };
for (int i = 0; i < 2; i++) {
instr_t *instr = INSTR_CREATE_ld4_multi_2(
dc, opnd_create_reg(dst_reg_post_index_0[i]),
opnd_create_reg(dst_reg_post_index_1[i]),
opnd_create_reg(dst_reg_post_index_2[i]),
opnd_create_reg(dst_reg_post_index_3[i]), opnd_create_reg(src_reg[0]),
opnd_create_base_disp_aarch64(src_reg[0], DR_REG_NULL, 0, false, 0, 0,
opsz[i]),
opnd_create_immed_uint(imm[i], OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld4, instr);
}
print("ld4 simdfp multiple structures post-index complete\n");
}
static void
ld4_simdfp_single_structure_no_offset(void *dc)
{
for (int index = 0; index < 16; index++) {
instr_t *instr = INSTR_CREATE_ld4(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_Q3),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_4),
opnd_create_immed_uint(index, OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld4, instr);
}
const int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q27 };
const int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q28 };
const int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q29 };
const int dst_reg_3[] = { DR_REG_Q3, DR_REG_Q18, DR_REG_Q30 };
const int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(dst_reg_3[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_4),
opnd_create_immed_uint(0x01, OPSZ_1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld4, instr);
}
print("ld4 simdfp single structure no offset complete\n");
}
static void
ld4_simdfp_single_structure_post_index(void *dc)
{
for (int index = 0; index < 16; index++) {
instr_t *instr = INSTR_CREATE_ld4_2(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_4),
opnd_create_immed_uint(index, OPSZ_1), opnd_create_immed_uint(0x04, OPSZ_PTR),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld4, instr);
}
const int dst_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q27 };
const int dst_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q28 };
const int dst_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q29 };
const int dst_3[] = { DR_REG_Q3, DR_REG_Q18, DR_REG_Q30 };
const int src[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4_2(
dc, opnd_create_reg(dst_0[i]), opnd_create_reg(dst_1[i]),
opnd_create_reg(dst_2[i]), opnd_create_reg(dst_3[i]), opnd_create_reg(src[i]),
opnd_create_base_disp_aarch64(src[i], DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
opnd_create_immed_uint(0x01, OPSZ_1), opnd_create_immed_uint(0x10, OPSZ_PTR),
OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld4, instr);
}
const int opsz[] = { OPSZ_4, OPSZ_8, OPSZ_16, OPSZ_32 };
const opnd_t elsz[] = { OPND_CREATE_BYTE(), OPND_CREATE_HALF(), OPND_CREATE_SINGLE(),
OPND_CREATE_DOUBLE() };
const int imm[] = { 4, 8, 16, 32 };
for (int i = 0; i < 4; i++) {
instr_t *instr =
INSTR_CREATE_ld4_2(dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_X0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0,
false, 0, 0, opsz[i]),
opnd_create_immed_uint(0x01, OPSZ_1),
opnd_create_immed_uint(imm[i], OPSZ_PTR), elsz[i]);
test_instr_encoding(dc, OP_ld4, instr);
}
const int offset_reg[] = { DR_REG_X1, DR_REG_X16, DR_REG_X29 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4_2(
dc, opnd_create_reg(dst_0[i]), opnd_create_reg(dst_1[i]),
opnd_create_reg(dst_2[i]), opnd_create_reg(dst_3[i]), opnd_create_reg(src[i]),
opnd_create_base_disp_aarch64(src[i], DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
opnd_create_immed_uint(0x01, OPSZ_1), opnd_create_reg(offset_reg[i]),
OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ld4, instr);
}
print("ld4 simdfp single structure post-index complete\n");
}
static void
ld4(void *dc)
{
ld4_simdfp_multiple_structures_no_offset(dc);
ld4_simdfp_multiple_structures_post_index(dc);
ld4_simdfp_single_structure_no_offset(dc);
ld4_simdfp_single_structure_post_index(dc);
print("ld4 complete\n");
}
static void
ld2r_simdfp_no_offset(void *dc)
{
int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q29 };
int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q30 };
int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X16 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2r(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_8),
OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld2r, instr);
}
print("ld2r simdfp no offset complete\n");
}
static void
ld2r_simdfp_post_index(void *dc)
{
int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q29 };
int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q30 };
int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X29 };
int offset_reg[] = { DR_REG_X1, DR_REG_X16, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld2r_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_8),
opnd_create_reg(offset_reg[i]), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld2r, instr);
}
int opsz[] = { OPSZ_2, OPSZ_4, OPSZ_8, OPSZ_16 };
int imm[] = { 2, 4, 8, 16 };
const opnd_t elsz[] = { OPND_CREATE_BYTE(), OPND_CREATE_HALF(), OPND_CREATE_SINGLE(),
OPND_CREATE_DOUBLE() };
for (int i = 0; i < 4; i++) {
instr_t *instr = INSTR_CREATE_ld2r_2(
dc, opnd_create_reg(dst_reg_0[0]), opnd_create_reg(dst_reg_1[0]),
opnd_create_reg(src_reg[0]),
opnd_create_base_disp_aarch64(src_reg[0], DR_REG_NULL, 0, false, 0, 0,
opsz[i]),
opnd_create_immed_uint(imm[i], OPSZ_1), elsz[i]);
test_instr_encoding(dc, OP_ld2r, instr);
}
print("ld2r simdfp post-index complete\n");
}
static void
ld2r(void *dc)
{
ld2r_simdfp_no_offset(dc);
ld2r_simdfp_post_index(dc);
print("ld2r complete\n");
}
static void
ld3r_simdfp_no_offset(void *dc)
{
int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q28 };
int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q29 };
int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q30 };
int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld3r(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_24),
OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld3r, instr);
}
print("ld3r simdfp no offset complete\n");
}
static void
ld3r_simdfp_post_index(void *dc)
{
int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q28 };
int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q29 };
int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q30 };
int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X29 };
int offset_reg[] = { DR_REG_X1, DR_REG_X16, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld3r_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_24),
opnd_create_reg(offset_reg[i]), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld3r, instr);
}
int opsz[] = { OPSZ_3, OPSZ_6, OPSZ_12, OPSZ_24 };
int imm[] = { 3, 6, 12, 24 };
const opnd_t elsz[] = { OPND_CREATE_BYTE(), OPND_CREATE_HALF(), OPND_CREATE_SINGLE(),
OPND_CREATE_DOUBLE() };
for (int i = 0; i < 4; i++) {
instr_t *instr = INSTR_CREATE_ld3r_2(
dc, opnd_create_reg(dst_reg_0[0]), opnd_create_reg(dst_reg_1[0]),
opnd_create_reg(dst_reg_2[0]), opnd_create_reg(src_reg[0]),
opnd_create_base_disp_aarch64(src_reg[0], DR_REG_NULL, 0, false, 0, 0,
opsz[i]),
opnd_create_immed_uint(imm[i], OPSZ_1), elsz[i]);
test_instr_encoding(dc, OP_ld3r, instr);
}
print("ld3r simdfp post-index complete\n");
}
static void
ld3r(void *dc)
{
ld3r_simdfp_no_offset(dc);
ld3r_simdfp_post_index(dc);
print("ld3r complete\n");
}
static void
ld4r_simdfp_no_offset(void *dc)
{
int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q27 };
int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q28 };
int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q29 };
int dst_reg_3[] = { DR_REG_Q3, DR_REG_Q18, DR_REG_Q30 };
int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4r(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(dst_reg_3[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_32),
OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld4r, instr);
}
print("ld4r simdfp no offset complete\n");
}
static void
ld4r_simdfp_post_index(void *dc)
{
int dst_reg_0[] = { DR_REG_Q0, DR_REG_Q15, DR_REG_Q27 };
int dst_reg_1[] = { DR_REG_Q1, DR_REG_Q16, DR_REG_Q28 };
int dst_reg_2[] = { DR_REG_Q2, DR_REG_Q17, DR_REG_Q29 };
int dst_reg_3[] = { DR_REG_Q3, DR_REG_Q18, DR_REG_Q30 };
int src_reg[] = { DR_REG_X0, DR_REG_X15, DR_REG_X29 };
int offset_reg[] = { DR_REG_X1, DR_REG_X16, DR_REG_X30 };
for (int i = 0; i < 3; i++) {
instr_t *instr = INSTR_CREATE_ld4r_2(
dc, opnd_create_reg(dst_reg_0[i]), opnd_create_reg(dst_reg_1[i]),
opnd_create_reg(dst_reg_2[i]), opnd_create_reg(dst_reg_3[i]),
opnd_create_reg(src_reg[i]),
opnd_create_base_disp_aarch64(src_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_32),
opnd_create_reg(offset_reg[i]), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld4r, instr);
}
int opsz[] = { OPSZ_4, OPSZ_8, OPSZ_16, OPSZ_32 };
int imm[] = { 4, 8, 16, 32 };
const opnd_t elsz[] = { OPND_CREATE_BYTE(), OPND_CREATE_HALF(), OPND_CREATE_SINGLE(),
OPND_CREATE_DOUBLE() };
for (int i = 0; i < 4; i++) {
instr_t *instr = INSTR_CREATE_ld4r_2(
dc, opnd_create_reg(dst_reg_0[0]), opnd_create_reg(dst_reg_1[0]),
opnd_create_reg(dst_reg_2[0]), opnd_create_reg(dst_reg_3[0]),
opnd_create_reg(src_reg[0]),
opnd_create_base_disp_aarch64(src_reg[0], DR_REG_NULL, 0, false, 0, 0,
opsz[i]),
opnd_create_immed_uint(imm[i], OPSZ_1), elsz[i]);
test_instr_encoding(dc, OP_ld4r, instr);
}
print("ld4r simdfp post index complete\n");
}
static void
ld4r(void *dc)
{
ld4r_simdfp_no_offset(dc);
ld4r_simdfp_post_index(dc);
print("ld4r complete\n");
}
static void
test_ldur_stur(void *dc)
{
byte *pc;
instr_t *instr;
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_B0),
opnd_create_base_disp(DR_REG_X0, DR_REG_NULL, 0, 0, OPSZ_1));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_B1),
opnd_create_base_disp(DR_REG_X1, DR_REG_NULL, 0, 255, OPSZ_1));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_H2),
opnd_create_base_disp(DR_REG_X2, DR_REG_NULL, 0, 0, OPSZ_2));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_H3),
opnd_create_base_disp(DR_REG_X3, DR_REG_NULL, 0, -256, OPSZ_2));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_S4),
opnd_create_base_disp(DR_REG_X4, DR_REG_NULL, 0, 0, OPSZ_4));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_S5),
opnd_create_base_disp(DR_REG_X5, DR_REG_NULL, 0, -256, OPSZ_4));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_D6),
opnd_create_base_disp(DR_REG_X6, DR_REG_NULL, 0, 0, OPSZ_8));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_D7),
opnd_create_base_disp(DR_REG_X7, DR_REG_NULL, 0, -256, OPSZ_8));
test_instr_encoding(dc, OP_ldur, instr);
instr =
INSTR_CREATE_ldur(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_base_disp(DR_REG_X8, DR_REG_NULL, 0, 0, OPSZ_16));
test_instr_encoding(dc, OP_ldur, instr);
instr = INSTR_CREATE_ldur(
dc, opnd_create_reg(DR_REG_Q9),
opnd_create_base_disp(DR_REG_X9, DR_REG_NULL, 0, -256, OPSZ_16));
test_instr_encoding(dc, OP_ldur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X10, DR_REG_NULL, 0, 0, OPSZ_1),
opnd_create_reg(DR_REG_B10));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X11, DR_REG_NULL, 0, 0xFF, OPSZ_1),
opnd_create_reg(DR_REG_B11));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X12, DR_REG_NULL, 0, 0, OPSZ_2),
opnd_create_reg(DR_REG_H12));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X13, DR_REG_NULL, 0, 0xFF, OPSZ_2),
opnd_create_reg(DR_REG_H13));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X14, DR_REG_NULL, 0, 0, OPSZ_4),
opnd_create_reg(DR_REG_S14));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X15, DR_REG_NULL, 0, 0xFF, OPSZ_4),
opnd_create_reg(DR_REG_S15));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X16, DR_REG_NULL, 0, 0, OPSZ_8),
opnd_create_reg(DR_REG_D16));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X17, DR_REG_NULL, 0, 0xFF, OPSZ_8),
opnd_create_reg(DR_REG_D17));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X18, DR_REG_NULL, 0, 0, OPSZ_16),
opnd_create_reg(DR_REG_Q18));
test_instr_encoding(dc, OP_stur, instr);
instr = INSTR_CREATE_stur(
dc, opnd_create_base_disp(DR_REG_X19, DR_REG_NULL, 0, 0xFF, OPSZ_16),
opnd_create_reg(DR_REG_Q19));
test_instr_encoding(dc, OP_stur, instr);
}
static void
test_instrs_with_logic_imm(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_and(dc, opnd_create_reg(DR_REG_X10), opnd_create_reg(DR_REG_X9),
OPND_CREATE_INT(0xFFFF));
test_instr_encoding(dc, OP_and, instr);
instr = INSTR_CREATE_and(dc, opnd_create_reg(DR_REG_W5), opnd_create_reg(DR_REG_W5),
OPND_CREATE_INT(0xFF));
test_instr_encoding(dc, OP_and, instr);
instr = INSTR_CREATE_ands(dc, opnd_create_reg(DR_REG_X23),
opnd_create_reg(DR_REG_X19), OPND_CREATE_INT(0xFFFFFF));
test_instr_encoding(dc, OP_ands, instr);
instr = INSTR_CREATE_ands(dc, opnd_create_reg(DR_REG_W3), opnd_create_reg(DR_REG_W8),
OPND_CREATE_INT(0xF));
test_instr_encoding(dc, OP_ands, instr);
}
static void
ldr_base_immediate_post_index(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int reg_dest[] = { DR_REG_X1, DR_REG_X17, DR_REG_X30 };
int value[] = { 129, 255, -256, 170, 85, -86, -171 };
for (int i = 0; i < 3; i++) {
for (int l = 0; l < 7; l++) {
instr_t *instr = INSTR_CREATE_ldr_imm(
dc, opnd_create_reg(reg_32[i]), opnd_create_reg(reg_dest[i]),
opnd_create_base_disp_aarch64(reg_dest[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_4),
OPND_CREATE_INT(value[l]));
test_instr_encoding(dc, OP_ldr, instr);
instr = INSTR_CREATE_ldr_imm(
dc, opnd_create_reg(reg_64[i]), opnd_create_reg(reg_dest[i]),
opnd_create_base_disp_aarch64(reg_dest[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_8),
OPND_CREATE_INT(value[l]));
test_instr_encoding(dc, OP_ldr, instr);
}
}
print("ldr base immediate post-index complete\n");
}
static void
ldr_base_immediate_pre_index(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int reg_dst[] = { DR_REG_X1, DR_REG_X17, DR_REG_X30 };
int value[] = { 129, 255, -256, 170, 85, -86, -171 };
for (int i = 0; i < 3; i++) {
for (int l = 0; l < 7; l++) {
instr_t *instr = INSTR_CREATE_ldr_imm(
dc, opnd_create_reg(reg_32[i]), opnd_create_reg(reg_dst[i]),
opnd_create_base_disp_aarch64(reg_dst[i], DR_REG_NULL, 0, false, value[l],
0, OPSZ_4),
OPND_CREATE_INT(value[l]));
test_instr_encoding(dc, OP_ldr, instr);
instr = INSTR_CREATE_ldr_imm(
dc, opnd_create_reg(reg_64[i]), opnd_create_reg(reg_dst[i]),
opnd_create_base_disp_aarch64(reg_dst[i], DR_REG_NULL, 0, false, value[l],
0, OPSZ_8),
OPND_CREATE_INT(value[l]));
test_instr_encoding(dc, OP_ldr, instr);
}
}
print("ldr base immediate pre-index complete\n");
}
static void
ldr_base_immediate_offset(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int reg_dst[] = { DR_REG_X1, DR_REG_X17, DR_REG_X30 };
int value[] = { 0, 16380, 0b101010101010, 0b010101010101 };
for (int i = 0; i < 3; i++) {
for (int l = 0; l < 4; l++) {
instr_t *instr = INSTR_CREATE_ldr(
dc, opnd_create_reg(reg_32[i]),
opnd_create_base_disp_aarch64(reg_dst[i], DR_REG_NULL, 0, false,
value[l] & 0b111111111100, 0, OPSZ_4));
test_instr_encoding(dc, OP_ldr, instr);
instr = INSTR_CREATE_ldr(
dc, opnd_create_reg(reg_64[i]),
opnd_create_base_disp_aarch64(reg_dst[i], DR_REG_NULL, 0, false,
value[l] & 0b111111111000, 0, OPSZ_8));
test_instr_encoding(dc, OP_ldr, instr);
}
}
print("ldr base immediate offset complete\n");
}
static void
ldr_base_literal(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int64_t value[] = { 0x0000000000000000, 0x000000000007ffff };
for (int i = 0; i < 3; i++) {
for (int l = 0; l < 2; l++) {
instr_t *instr =
INSTR_CREATE_ldr(dc, opnd_create_reg(reg_32[i]),
OPND_CREATE_ABSMEM((void *)value[i], OPSZ_4));
test_instr_encoding(dc, OP_ldr, instr);
instr = INSTR_CREATE_ldr(dc, opnd_create_reg(reg_64[i]),
OPND_CREATE_ABSMEM((void *)value[i], OPSZ_8));
test_instr_encoding(dc, OP_ldr, instr);
}
}
print("ldr base literal complete\n");
}
static void
ldr_base_register(void *dc)
{
int extend[] = { DR_EXTEND_UXTW, DR_EXTEND_UXTX, DR_EXTEND_SXTW, DR_EXTEND_SXTX };
int reg32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int dest_0[] = { DR_REG_X1, DR_REG_X17, DR_REG_X29 };
int dest_1[] = { DR_REG_W2, DR_REG_X18, DR_REG_W28, DR_REG_X27 };
for (int i = 0; i < 4; i++) {
for (int ii = 0; ii < 3; ii++) {
instr_t *instr = INSTR_CREATE_ldr(
dc, opnd_create_reg(reg32[ii]),
opnd_create_base_disp_aarch64(dest_0[ii], dest_1[i], extend[i], false, 0,
0, OPSZ_4));
test_instr_encoding(dc, OP_ldr, instr);
instr = INSTR_CREATE_ldr(dc, opnd_create_reg(reg64[ii]),
opnd_create_base_disp_aarch64(dest_0[ii], dest_1[i],
extend[i], false, 0, 0,
OPSZ_8));
test_instr_encoding(dc, OP_ldr, instr);
}
}
print("ldr base register complete\n");
}
static void
ldr_base_register_extend(void *dc)
{
int extend[] = { DR_EXTEND_UXTW, DR_EXTEND_UXTX, DR_EXTEND_SXTW, DR_EXTEND_SXTX };
int reg32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int dest_0[] = { DR_REG_X1, DR_REG_X17, DR_REG_X29 };
int dest_1[] = { DR_REG_W2, DR_REG_X18, DR_REG_W28, DR_REG_X27 };
for (int i = 0; i < 4; i++) {
for (int ii = 0; ii < 3; ii++) {
opnd_t opnd = opnd_create_base_disp_aarch64(
dest_0[ii], dest_1[i], extend[i], false, 0, DR_OPND_SHIFTED, OPSZ_4);
opnd_set_index_extend(&opnd, extend[i], 2);
instr_t *instr = INSTR_CREATE_ldr(dc, opnd_create_reg(reg32[ii]), opnd);
test_instr_encoding(dc, OP_ldr, instr);
opnd = opnd_create_base_disp_aarch64(dest_0[ii], dest_1[i], extend[i], false,
0, DR_OPND_SHIFTED, OPSZ_8);
opnd_set_index_extend(&opnd, extend[i], 3);
instr = INSTR_CREATE_ldr(dc, opnd_create_reg(reg64[ii]), opnd);
test_instr_encoding(dc, OP_ldr, instr);
}
}
print("ldr base register extend complete\n");
}
static void
ldr(void *dc)
{
ldr_base_immediate_post_index(dc);
ldr_base_immediate_pre_index(dc);
ldr_base_immediate_offset(dc);
#if 0
ldr_base_literal(dc);
#endif
ldr_base_register(dc);
ldr_base_register_extend(dc);
print("ldr complete\n");
}
static void
str_base_immediate_post_index(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W29 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X29 };
int dest_reg[] = { DR_REG_X0, DR_REG_X16, DR_REG_X29 };
int value[] = { 0, 129, 255, -256, 170, 85, -86, -171 };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 8; ii++) {
instr_t *instr = INSTR_CREATE_str_imm(
dc,
opnd_create_base_disp_aarch64(dest_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_4),
opnd_create_reg(reg_32[i]), opnd_create_reg(dest_reg[i]),
OPND_CREATE_INT(value[ii]));
test_instr_encoding(dc, OP_str, instr);
instr = INSTR_CREATE_str_imm(
dc,
opnd_create_base_disp_aarch64(dest_reg[i], DR_REG_NULL, 0, false, 0, 0,
OPSZ_8),
opnd_create_reg(reg_64[i]), opnd_create_reg(dest_reg[i]),
OPND_CREATE_INT(value[ii]));
test_instr_encoding(dc, OP_str, instr);
}
}
print("str base immediate post-index complete\n");
}
static void
str_base_immediate_pre_index(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int dest_reg[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int value[] = { 0, 129, 255, -256, 170, 85, -86, -171 };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 8; ii++) {
instr_t *instr = INSTR_CREATE_str_imm(
dc,
opnd_create_base_disp_aarch64(dest_reg[i], DR_REG_NULL, 0, false,
value[ii], 0, OPSZ_4),
opnd_create_reg(reg_32[i]), opnd_create_reg(dest_reg[i]),
OPND_CREATE_INT(value[ii]));
test_instr_encoding(dc, OP_str, instr);
instr = INSTR_CREATE_str_imm(
dc,
opnd_create_base_disp_aarch64(dest_reg[i], DR_REG_NULL, 0, false,
value[ii], 0, OPSZ_8),
opnd_create_reg(reg_64[i]), opnd_create_reg(dest_reg[i]),
OPND_CREATE_INT(value[ii]));
test_instr_encoding(dc, OP_str, instr);
}
}
print("str base immediate pre-index complete\n");
}
static void
str_base_immediate_unsigned_offset(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = {
DR_REG_X0,
DR_REG_X16,
DR_REG_X30,
};
int reg_dest[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int val_32[] = { 0, 0x204, 0b111111111100, 0b101010101100, 0b010101010100 };
int val_64[] = { 0, 0x1020, 0b1111111111000, 0b101010101000, 0b010101011000 };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 4; ii++) {
instr_t *instr = INSTR_CREATE_str(
dc,
opnd_create_base_disp_aarch64(reg_dest[i], DR_REG_NULL, 0, false,
val_32[ii], 0, OPSZ_4),
opnd_create_reg(reg_32[i]));
test_instr_encoding(dc, OP_str, instr);
instr = INSTR_CREATE_str(dc,
opnd_create_base_disp_aarch64(reg_dest[i],
DR_REG_NULL, 0, false,
val_64[ii], 0, OPSZ_8),
opnd_create_reg(reg_64[i]));
test_instr_encoding(dc, OP_str, instr);
}
}
print("str base immediate unsigned offset complete\n");
}
static void
str_base_register(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int reg_dest_1[] = { DR_REG_X0, DR_REG_X15, DR_REG_X29 };
int reg_dest_2[] = { DR_REG_W1, DR_REG_X16, DR_REG_W30, DR_REG_X28 };
int extend[] = { DR_EXTEND_UXTW, DR_EXTEND_UXTX, DR_EXTEND_SXTW, DR_EXTEND_SXTX };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 4; ii++) {
instr_t *instr = INSTR_CREATE_str(
dc,
opnd_create_base_disp_aarch64(reg_dest_1[i], reg_dest_2[ii], extend[ii],
false, 0, 0, OPSZ_4),
opnd_create_reg(reg_32[i]));
test_instr_encoding(dc, OP_str, instr);
instr = INSTR_CREATE_str(
dc,
opnd_create_base_disp_aarch64(reg_dest_1[i], reg_dest_2[ii], extend[ii],
false, 0, 0, OPSZ_8),
opnd_create_reg(reg_64[i]));
test_instr_encoding(dc, OP_str, instr);
}
}
print("str base register complete\n");
}
static void
str_base_register_extend(void *dc)
{
int reg_32[] = { DR_REG_W0, DR_REG_W16, DR_REG_W30 };
int reg_64[] = { DR_REG_X0, DR_REG_X16, DR_REG_X30 };
int reg_dest_1[] = { DR_REG_X0, DR_REG_X15, DR_REG_X29 };
int reg_dest_2[] = { DR_REG_W1, DR_REG_X16, DR_REG_W30, DR_REG_X28 };
int extend[] = { DR_EXTEND_UXTW, DR_EXTEND_UXTX, DR_EXTEND_SXTW, DR_EXTEND_SXTX };
for (int i = 0; i < 3; i++) {
for (int ii = 0; ii < 4; ii++) {
opnd_t opnd =
opnd_create_base_disp_aarch64(reg_dest_1[i], reg_dest_2[ii], extend[ii],
false, 0, DR_OPND_SHIFTED, OPSZ_4);
opnd_set_index_extend(&opnd, extend[ii], 2);
instr_t *instr = INSTR_CREATE_str(dc, opnd, opnd_create_reg(reg_32[i]));
test_instr_encoding(dc, OP_str, instr);
opnd =
opnd_create_base_disp_aarch64(reg_dest_1[i], reg_dest_2[ii], extend[ii],
false, 0, DR_OPND_SHIFTED, OPSZ_8);
opnd_set_index_extend(&opnd, extend[ii], 3);
instr = INSTR_CREATE_str(dc, opnd, opnd_create_reg(reg_64[i]));
test_instr_encoding(dc, OP_str, instr);
}
}
print("str base register extend complete\n");
}
static void
str(void *dc)
{
str_base_immediate_post_index(dc);
str_base_immediate_pre_index(dc);
str_base_immediate_unsigned_offset(dc);
str_base_register(dc);
str_base_register_extend(dc);
print("str complete\n");
}
static void
test_fmov_general(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_fmov_general(dc, opnd_create_reg(DR_REG_H10),
opnd_create_reg(DR_REG_W9));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_general(dc, opnd_create_reg(DR_REG_S14),
opnd_create_reg(DR_REG_W4));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_general(dc, opnd_create_reg(DR_REG_H23),
opnd_create_reg(DR_REG_X8));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_general(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_X24));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_upper_vec(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_X10));
test_instr_encoding(dc, OP_fmov, instr);
}
static void
test_fmov_vector(void *dc)
{
byte *pc;
instr_t *instr;
* 16 bit floating-point values encoded in instruction's 8 bit field, so
* there is a fixed, limited set of floating-point values which can be set,
* see 'Table C2-2 Floating-point constant values' in section 'Modified
* immediate constants in A64 floating-point instructions.' of the Arm
* Reference Manual.
*/
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_immed_float(1.0f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_immed_float(2.0f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_immed_float(-1.0f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q3),
opnd_create_immed_float(-2.0f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_immed_float(3.5f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_immed_float(4.25f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_immed_float(1.125f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_immed_float(-0.25f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_immed_float(7.0f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_immed_float(1.9375f),
OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_immed_float(0.2109375f),
OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
instr =
INSTR_CREATE_fmov_vector_imm(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_immed_float(31.0f), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmov, instr);
}
static void
test_fmov_scalar(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(1.0f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(-1.0f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(2.0f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(-2.0f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(3.5f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(4.25f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(1.125f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(-1.125f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(0.25f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(-0.25f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(1.9375f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(0.2109375f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_S0),
opnd_create_immed_float(31.0f));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(1.0));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(-1.0));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(2.0));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(-2.0));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(3.5));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(4.25));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(1.125));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(-1.125));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(0.25));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(-0.25));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(1.9375));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(0.2109375));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar_imm(dc, opnd_create_reg(DR_REG_D0),
opnd_create_immed_double(31.0));
test_instr_encoding(dc, OP_fmov, instr);
}
static void
test_asimdsamefp16(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_fmaxnm_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmaxnm_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmla_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D31), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmla, instr);
instr = INSTR_CREATE_fmla_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmla, instr);
instr = INSTR_CREATE_fadd_vector(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fadd_vector(dc, opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fmulx_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmulx, instr);
instr = INSTR_CREATE_fmulx_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmulx, instr);
instr = INSTR_CREATE_fcmeq_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fcmeq, instr);
instr = INSTR_CREATE_fcmeq_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fcmeq, instr);
instr = INSTR_CREATE_fmax_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D22), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_fmax_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q22), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_frecps_vector(dc, opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_frecps, instr);
instr = INSTR_CREATE_frecps_vector(dc, opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_frecps, instr);
instr = INSTR_CREATE_fminnm_vector(dc, opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D11), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fminnm_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fmls_vector(dc, opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmls, instr);
instr = INSTR_CREATE_fmls_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmls, instr);
instr = INSTR_CREATE_fsub_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D24), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fsub_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fmin_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmin, instr);
instr = INSTR_CREATE_fmin_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmin, instr);
instr = INSTR_CREATE_frsqrts_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D19), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_frsqrts, instr);
instr = INSTR_CREATE_frsqrts_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_frsqrts, instr);
instr = INSTR_CREATE_fmaxnmp_vector(dc, opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmaxnmp, instr);
instr = INSTR_CREATE_fmaxnmp_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmaxnmp, instr);
instr = INSTR_CREATE_faddp_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_faddp, instr);
instr = INSTR_CREATE_faddp_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_faddp, instr);
instr = INSTR_CREATE_fmul_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fmul_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fcmge_vector(dc, opnd_create_reg(DR_REG_D14),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fcmge, instr);
instr = INSTR_CREATE_fcmge_vector(dc, opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fcmge, instr);
instr = INSTR_CREATE_facge_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D31), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_facge, instr);
instr = INSTR_CREATE_facge_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_facge, instr);
instr = INSTR_CREATE_fmaxp_vector(dc, opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D5), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmaxp, instr);
instr = INSTR_CREATE_fmaxp_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q5), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fmaxp, instr);
instr = INSTR_CREATE_fdiv_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fdiv_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fminnmp_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D6), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fminnmp, instr);
instr = INSTR_CREATE_fminnmp_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fminnmp, instr);
instr = INSTR_CREATE_fabd_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D12), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fabd, instr);
instr = INSTR_CREATE_fabd_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q12), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fabd, instr);
instr = INSTR_CREATE_fcmgt_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D26), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fcmgt, instr);
instr = INSTR_CREATE_fcmgt_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fcmgt, instr);
instr = INSTR_CREATE_facgt_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D17), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_facgt, instr);
instr = INSTR_CREATE_facgt_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_facgt, instr);
instr = INSTR_CREATE_fminp_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D7), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fminp, instr);
instr = INSTR_CREATE_fminp_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_fminp, instr);
}
static void
test_asimdsame(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_shadd_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_shadd, instr);
instr = INSTR_CREATE_shadd_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_shadd, instr);
instr = INSTR_CREATE_shadd_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_shadd, instr);
instr = INSTR_CREATE_shadd_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_shadd, instr);
instr = INSTR_CREATE_shadd_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_shadd, instr);
instr = INSTR_CREATE_shadd_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_shadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_sqadd_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_sqadd, instr);
instr = INSTR_CREATE_srhadd_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D10), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_srhadd, instr);
instr = INSTR_CREATE_srhadd_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_srhadd, instr);
instr = INSTR_CREATE_srhadd_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_srhadd, instr);
instr = INSTR_CREATE_srhadd_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_srhadd, instr);
instr = INSTR_CREATE_srhadd_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D10), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_srhadd, instr);
instr = INSTR_CREATE_srhadd_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_srhadd, instr);
instr = INSTR_CREATE_shsub_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D20), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_shsub, instr);
instr = INSTR_CREATE_shsub_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_shsub, instr);
instr = INSTR_CREATE_shsub_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_shsub, instr);
instr = INSTR_CREATE_shsub_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_shsub, instr);
instr = INSTR_CREATE_shsub_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_shsub, instr);
instr = INSTR_CREATE_shsub_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_shsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_sqsub_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_sqsub, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D8), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D8), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D8), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmgt_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_cmgt, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D26), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D26), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D26), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_cmge_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_cmge, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_sshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_sqshl_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_sqshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D15), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D15), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_srshl_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_srshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D2), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_sqrshl_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_sqrshl, instr);
instr = INSTR_CREATE_smax_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D8), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smax, instr);
instr = INSTR_CREATE_smax_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smax, instr);
instr = INSTR_CREATE_smax_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D8), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smax, instr);
instr = INSTR_CREATE_smax_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smax, instr);
instr = INSTR_CREATE_smax_vector(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D8), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smax, instr);
instr = INSTR_CREATE_smax_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q8), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smax, instr);
instr = INSTR_CREATE_smin_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smin, instr);
instr = INSTR_CREATE_smin_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smin, instr);
instr = INSTR_CREATE_smin_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smin, instr);
instr = INSTR_CREATE_smin_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smin, instr);
instr = INSTR_CREATE_smin_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smin, instr);
instr = INSTR_CREATE_smin_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smin, instr);
instr = INSTR_CREATE_sabd_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D28), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sabd, instr);
instr = INSTR_CREATE_sabd_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sabd, instr);
instr = INSTR_CREATE_sabd_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D28), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sabd, instr);
instr = INSTR_CREATE_sabd_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sabd, instr);
instr = INSTR_CREATE_sabd_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D28), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sabd, instr);
instr = INSTR_CREATE_sabd_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sabd, instr);
instr = INSTR_CREATE_saba_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D4), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_saba, instr);
instr = INSTR_CREATE_saba_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_saba, instr);
instr = INSTR_CREATE_saba_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_saba, instr);
instr = INSTR_CREATE_saba_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_saba, instr);
instr = INSTR_CREATE_saba_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_saba, instr);
instr = INSTR_CREATE_saba_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_saba, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D14), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D14), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_add_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_add, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D2), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_cmtst_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_cmtst, instr);
instr = INSTR_CREATE_mla_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D4), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_mla, instr);
instr = INSTR_CREATE_mla_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_mla, instr);
instr = INSTR_CREATE_mla_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_mla, instr);
instr = INSTR_CREATE_mla_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_mla, instr);
instr = INSTR_CREATE_mla_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_mla, instr);
instr = INSTR_CREATE_mla_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_mla, instr);
instr = INSTR_CREATE_mul_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D24), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_mul, instr);
instr = INSTR_CREATE_mul_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_mul, instr);
instr = INSTR_CREATE_mul_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D24), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_mul, instr);
instr = INSTR_CREATE_mul_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_mul, instr);
instr = INSTR_CREATE_mul_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_mul, instr);
instr = INSTR_CREATE_mul_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_mul, instr);
instr = INSTR_CREATE_smaxp_vector(dc, opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D7), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smaxp, instr);
instr = INSTR_CREATE_smaxp_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smaxp, instr);
instr = INSTR_CREATE_smaxp_vector(dc, opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D7), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smaxp, instr);
instr = INSTR_CREATE_smaxp_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smaxp, instr);
instr = INSTR_CREATE_smaxp_vector(dc, opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D7), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smaxp, instr);
instr = INSTR_CREATE_smaxp_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smaxp, instr);
instr = INSTR_CREATE_sminp_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D10), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sminp, instr);
instr = INSTR_CREATE_sminp_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sminp, instr);
instr = INSTR_CREATE_sminp_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sminp, instr);
instr = INSTR_CREATE_sminp_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sminp, instr);
instr = INSTR_CREATE_sminp_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D10), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sminp, instr);
instr = INSTR_CREATE_sminp_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sminp, instr);
instr = INSTR_CREATE_sqdmulh_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmulh, instr);
instr = INSTR_CREATE_sqdmulh_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmulh, instr);
instr = INSTR_CREATE_sqdmulh_vector(
dc, opnd_create_reg(DR_REG_D12), opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmulh, instr);
instr = INSTR_CREATE_sqdmulh_vector(
dc, opnd_create_reg(DR_REG_Q12), opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmulh, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D15), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D15), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_addp_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_addp, instr);
instr = INSTR_CREATE_fmaxnm_vector(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmaxnm_vector(dc, opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmaxnm_vector(dc, opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmla_vector(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmla, instr);
instr = INSTR_CREATE_fmla_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmla, instr);
instr = INSTR_CREATE_fmla_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmla, instr);
instr = INSTR_CREATE_fadd_vector(dc, opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fadd_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fadd_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fmulx_vector(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmulx, instr);
instr = INSTR_CREATE_fmulx_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmulx, instr);
instr = INSTR_CREATE_fmulx_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmulx, instr);
instr = INSTR_CREATE_fcmeq_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D14),
opnd_create_reg(DR_REG_D0), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcmeq, instr);
instr = INSTR_CREATE_fcmeq_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcmeq, instr);
instr = INSTR_CREATE_fcmeq_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcmeq, instr);
instr = INSTR_CREATE_fmax_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D21),
opnd_create_reg(DR_REG_D20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_fmax_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_fmax_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_frecps_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_frecps, instr);
instr = INSTR_CREATE_frecps_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_frecps, instr);
instr = INSTR_CREATE_frecps_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_frecps, instr);
instr =
INSTR_CREATE_and_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D25), opnd_create_reg(DR_REG_D10));
test_instr_encoding(dc, OP_and, instr);
instr =
INSTR_CREATE_and_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q25), opnd_create_reg(DR_REG_Q10));
test_instr_encoding(dc, OP_and, instr);
instr =
INSTR_CREATE_bic_vector(dc, opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D31), opnd_create_reg(DR_REG_D15));
test_instr_encoding(dc, OP_bic, instr);
instr =
INSTR_CREATE_bic_vector(dc, opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q31), opnd_create_reg(DR_REG_Q15));
test_instr_encoding(dc, OP_bic, instr);
instr = INSTR_CREATE_fminnm_vector(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D31), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fminnm_vector(dc, opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fminnm_vector(dc, opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fmls_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmls, instr);
instr = INSTR_CREATE_fmls_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmls, instr);
instr = INSTR_CREATE_fmls_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmls, instr);
instr = INSTR_CREATE_fsub_vector(dc, opnd_create_reg(DR_REG_D25),
opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D26), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fsub_vector(dc, opnd_create_reg(DR_REG_Q25),
opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fsub_vector(dc, opnd_create_reg(DR_REG_Q25),
opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fmin_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D31), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmin, instr);
instr = INSTR_CREATE_fmin_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmin, instr);
instr = INSTR_CREATE_fmin_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmin, instr);
instr = INSTR_CREATE_frsqrts_vector(dc, opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D6), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_frsqrts, instr);
instr = INSTR_CREATE_frsqrts_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_frsqrts, instr);
instr = INSTR_CREATE_frsqrts_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_frsqrts, instr);
instr =
INSTR_CREATE_orr_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D2), opnd_create_reg(DR_REG_D0));
test_instr_encoding(dc, OP_orr, instr);
instr =
INSTR_CREATE_orr_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_Q0));
test_instr_encoding(dc, OP_orr, instr);
instr =
INSTR_CREATE_orn_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D4), opnd_create_reg(DR_REG_D3));
test_instr_encoding(dc, OP_orn, instr);
instr =
INSTR_CREATE_orn_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q4), opnd_create_reg(DR_REG_Q3));
test_instr_encoding(dc, OP_orn, instr);
instr = INSTR_CREATE_uhadd_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uhadd, instr);
instr = INSTR_CREATE_uhadd_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uhadd, instr);
instr = INSTR_CREATE_uhadd_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uhadd, instr);
instr = INSTR_CREATE_uhadd_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uhadd, instr);
instr = INSTR_CREATE_uhadd_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uhadd, instr);
instr = INSTR_CREATE_uhadd_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uhadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D31), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D31), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D31), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_uqadd_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q31), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_uqadd, instr);
instr = INSTR_CREATE_urhadd_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_urhadd, instr);
instr = INSTR_CREATE_urhadd_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_urhadd, instr);
instr = INSTR_CREATE_urhadd_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_urhadd, instr);
instr = INSTR_CREATE_urhadd_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_urhadd, instr);
instr = INSTR_CREATE_urhadd_vector(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_urhadd, instr);
instr = INSTR_CREATE_urhadd_vector(dc, opnd_create_reg(DR_REG_Q8),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_urhadd, instr);
instr = INSTR_CREATE_uhsub_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D21),
opnd_create_reg(DR_REG_D16), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uhsub, instr);
instr = INSTR_CREATE_uhsub_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uhsub, instr);
instr = INSTR_CREATE_uhsub_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D21),
opnd_create_reg(DR_REG_D16), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uhsub, instr);
instr = INSTR_CREATE_uhsub_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uhsub, instr);
instr = INSTR_CREATE_uhsub_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D21),
opnd_create_reg(DR_REG_D16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uhsub, instr);
instr = INSTR_CREATE_uhsub_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uhsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D21), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D21), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_uqsub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_uqsub, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhi_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_cmhi, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_cmhs_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_cmhs, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_ushl_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ushl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_uqshl_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_uqshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D6), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D6), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D6), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_urshl_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q6), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_urshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_uqrshl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_uqrshl, instr);
instr = INSTR_CREATE_umax_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D25), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umax, instr);
instr = INSTR_CREATE_umax_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umax, instr);
instr = INSTR_CREATE_umax_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D25), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umax, instr);
instr = INSTR_CREATE_umax_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umax, instr);
instr = INSTR_CREATE_umax_vector(dc, opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umax, instr);
instr = INSTR_CREATE_umax_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umax, instr);
instr = INSTR_CREATE_umin_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D11), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umin, instr);
instr = INSTR_CREATE_umin_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umin, instr);
instr = INSTR_CREATE_umin_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D11), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umin, instr);
instr = INSTR_CREATE_umin_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umin, instr);
instr = INSTR_CREATE_umin_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umin, instr);
instr = INSTR_CREATE_umin_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umin, instr);
instr = INSTR_CREATE_uabd_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uabd, instr);
instr = INSTR_CREATE_uabd_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uabd, instr);
instr = INSTR_CREATE_uabd_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uabd, instr);
instr = INSTR_CREATE_uabd_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uabd, instr);
instr = INSTR_CREATE_uabd_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uabd, instr);
instr = INSTR_CREATE_uabd_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uabd, instr);
instr = INSTR_CREATE_uaba_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D19), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uaba, instr);
instr = INSTR_CREATE_uaba_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uaba, instr);
instr = INSTR_CREATE_uaba_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D19), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uaba, instr);
instr = INSTR_CREATE_uaba_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uaba, instr);
instr = INSTR_CREATE_uaba_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uaba, instr);
instr = INSTR_CREATE_uaba_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uaba, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D28), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D28), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D28), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_sub_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q28), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_sub, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_cmeq_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q23), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_cmeq, instr);
instr = INSTR_CREATE_mls_vector(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_mls, instr);
instr = INSTR_CREATE_mls_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_mls, instr);
instr = INSTR_CREATE_mls_vector(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_mls, instr);
instr = INSTR_CREATE_mls_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_mls, instr);
instr = INSTR_CREATE_mls_vector(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_mls, instr);
instr = INSTR_CREATE_mls_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_mls, instr);
instr = INSTR_CREATE_pmul_vector(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D12), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_pmul, instr);
instr = INSTR_CREATE_pmul_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q12), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_pmul, instr);
instr = INSTR_CREATE_umaxp_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D5), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umaxp, instr);
instr = INSTR_CREATE_umaxp_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q5), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umaxp, instr);
instr = INSTR_CREATE_umaxp_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D5), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umaxp, instr);
instr = INSTR_CREATE_umaxp_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q5), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umaxp, instr);
instr = INSTR_CREATE_umaxp_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D5), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umaxp, instr);
instr = INSTR_CREATE_umaxp_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q5), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umaxp, instr);
instr = INSTR_CREATE_uminp_vector(dc, opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D16), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uminp, instr);
instr = INSTR_CREATE_uminp_vector(dc, opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uminp, instr);
instr = INSTR_CREATE_uminp_vector(dc, opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D16), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uminp, instr);
instr = INSTR_CREATE_uminp_vector(dc, opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uminp, instr);
instr = INSTR_CREATE_uminp_vector(dc, opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uminp, instr);
instr = INSTR_CREATE_uminp_vector(dc, opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uminp, instr);
instr = INSTR_CREATE_sqrdmulh_vector(dc, opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqrdmulh, instr);
instr = INSTR_CREATE_sqrdmulh_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqrdmulh, instr);
instr = INSTR_CREATE_sqrdmulh_vector(
dc, opnd_create_reg(DR_REG_D23), opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqrdmulh, instr);
instr = INSTR_CREATE_sqrdmulh_vector(
dc, opnd_create_reg(DR_REG_Q23), opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqrdmulh, instr);
instr = INSTR_CREATE_fmaxnmp_vector(
dc, opnd_create_reg(DR_REG_D12), opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmaxnmp, instr);
instr = INSTR_CREATE_fmaxnmp_vector(
dc, opnd_create_reg(DR_REG_Q12), opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmaxnmp, instr);
instr = INSTR_CREATE_fmaxnmp_vector(
dc, opnd_create_reg(DR_REG_Q12), opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmaxnmp, instr);
instr = INSTR_CREATE_faddp_vector(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_faddp, instr);
instr = INSTR_CREATE_faddp_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_faddp, instr);
instr = INSTR_CREATE_faddp_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q16), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_faddp, instr);
instr = INSTR_CREATE_fmul_vector(dc, opnd_create_reg(DR_REG_D25),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fmul_vector(dc, opnd_create_reg(DR_REG_Q25),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fmul_vector(dc, opnd_create_reg(DR_REG_Q25),
opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fcmge_vector(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcmge, instr);
instr = INSTR_CREATE_fcmge_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcmge, instr);
instr = INSTR_CREATE_fcmge_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcmge, instr);
instr = INSTR_CREATE_facge_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_facge, instr);
instr = INSTR_CREATE_facge_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_facge, instr);
instr = INSTR_CREATE_facge_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_facge, instr);
instr = INSTR_CREATE_fmaxp_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmaxp, instr);
instr = INSTR_CREATE_fmaxp_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fmaxp, instr);
instr = INSTR_CREATE_fmaxp_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fmaxp, instr);
instr = INSTR_CREATE_fdiv_vector(dc, opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fdiv_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fdiv_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fdiv, instr);
instr =
INSTR_CREATE_eor_vector(dc, opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D1), opnd_create_reg(DR_REG_D20));
test_instr_encoding(dc, OP_eor, instr);
instr =
INSTR_CREATE_eor_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q1), opnd_create_reg(DR_REG_Q20));
test_instr_encoding(dc, OP_eor, instr);
instr =
INSTR_CREATE_bsl_vector(dc, opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D4), opnd_create_reg(DR_REG_D25));
test_instr_encoding(dc, OP_bsl, instr);
instr =
INSTR_CREATE_bsl_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q4), opnd_create_reg(DR_REG_Q25));
test_instr_encoding(dc, OP_bsl, instr);
instr = INSTR_CREATE_fminnmp_vector(
dc, opnd_create_reg(DR_REG_D23), opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fminnmp, instr);
instr = INSTR_CREATE_fminnmp_vector(
dc, opnd_create_reg(DR_REG_Q23), opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fminnmp, instr);
instr = INSTR_CREATE_fminnmp_vector(
dc, opnd_create_reg(DR_REG_Q23), opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fminnmp, instr);
instr = INSTR_CREATE_fabd_vector(dc, opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fabd, instr);
instr = INSTR_CREATE_fabd_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fabd, instr);
instr = INSTR_CREATE_fabd_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fabd, instr);
instr = INSTR_CREATE_fcmgt_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcmgt, instr);
instr = INSTR_CREATE_fcmgt_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcmgt, instr);
instr = INSTR_CREATE_fcmgt_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcmgt, instr);
instr = INSTR_CREATE_facgt_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D12), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_facgt, instr);
instr = INSTR_CREATE_facgt_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q12), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_facgt, instr);
instr = INSTR_CREATE_facgt_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q12), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_facgt, instr);
instr = INSTR_CREATE_fminp_vector(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fminp, instr);
instr = INSTR_CREATE_fminp_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fminp, instr);
instr = INSTR_CREATE_fminp_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q25), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fminp, instr);
instr =
INSTR_CREATE_bit_vector(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D21), opnd_create_reg(DR_REG_D12));
test_instr_encoding(dc, OP_bit, instr);
instr =
INSTR_CREATE_bit_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q21), opnd_create_reg(DR_REG_Q12));
test_instr_encoding(dc, OP_bit, instr);
instr =
INSTR_CREATE_bif_vector(dc, opnd_create_reg(DR_REG_D20),
opnd_create_reg(DR_REG_D3), opnd_create_reg(DR_REG_D3));
test_instr_encoding(dc, OP_bif, instr);
instr =
INSTR_CREATE_bif_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q3), opnd_create_reg(DR_REG_Q3));
test_instr_encoding(dc, OP_bif, instr);
}
static void
test_asimd_mem(void *dc)
{
byte *pc;
instr_t *instr;
Naming convention based on official mnemonics:
INSTR_CREATE_ld1_multi_<n>() where <n> is 1, 2, 3 or 4
LD1 { <Vt>.<T> }, [<Xn|SP>]
LD1 { <Vt>.<T>, <Vt2>.<T> }, [<Xn|SP>]
LD1 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>]
LD1 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>]
<T> is one of 8B, 16B, 4H, 8H, 2S, 4S, 1D, 2D */
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_D0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_Q0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_D0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_Q0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_D0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_Q0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_D0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld1, instr);
instr = INSTR_CREATE_ld1_multi_1(
dc, opnd_create_reg(DR_REG_Q0),
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ld1, instr);
Naming convention based on official mnemonics:
INSTR_CREATE_st1_multi_<n>() where <n> is 1, 2, 3 or 4
ST1 { <Vt>.<T> }, [<Xn|SP>]
ST1 { <Vt>.<T>, <Vt2>.<T> }, [<Xn|SP>]
ST1 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T> }, [<Xn|SP>]
ST1 { <Vt>.<T>, <Vt2>.<T>, <Vt3>.<T>, <Vt4>.<T> }, [<Xn|SP>]
<T> is one of 8B, 16B, 4H, 8H, 2S, 4S, 1D, 2D */
instr = INSTR_CREATE_st1_multi_1(
dc, opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
opnd_create_reg(DR_REG_D0), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc,
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc, opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
opnd_create_reg(DR_REG_D0), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc,
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc, opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
opnd_create_reg(DR_REG_D0), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc,
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc, opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_8),
opnd_create_reg(DR_REG_D0), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_st1, instr);
instr = INSTR_CREATE_st1_multi_1(
dc,
opnd_create_base_disp_aarch64(DR_REG_X0, DR_REG_NULL, 0, false, 0, 0, OPSZ_16),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_st1, instr);
}
static void
test_floatdp1(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_fmov_scalar(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D27));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar(dc, opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S27));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fmov_scalar(dc, opnd_create_reg(DR_REG_H2),
opnd_create_reg(DR_REG_H27));
test_instr_encoding(dc, OP_fmov, instr);
instr = INSTR_CREATE_fabs_scalar(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D0));
test_instr_encoding(dc, OP_fabs, instr);
instr = INSTR_CREATE_fabs_scalar(dc, opnd_create_reg(DR_REG_S30),
opnd_create_reg(DR_REG_S0));
test_instr_encoding(dc, OP_fabs, instr);
instr = INSTR_CREATE_fabs_scalar(dc, opnd_create_reg(DR_REG_H30),
opnd_create_reg(DR_REG_H0));
test_instr_encoding(dc, OP_fabs, instr);
instr = INSTR_CREATE_fneg_scalar(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D29));
test_instr_encoding(dc, OP_fneg, instr);
instr = INSTR_CREATE_fneg_scalar(dc, opnd_create_reg(DR_REG_S13),
opnd_create_reg(DR_REG_S29));
test_instr_encoding(dc, OP_fneg, instr);
instr = INSTR_CREATE_fneg_scalar(dc, opnd_create_reg(DR_REG_H13),
opnd_create_reg(DR_REG_H29));
test_instr_encoding(dc, OP_fneg, instr);
instr = INSTR_CREATE_fsqrt_scalar(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D17));
test_instr_encoding(dc, OP_fsqrt, instr);
instr = INSTR_CREATE_fsqrt_scalar(dc, opnd_create_reg(DR_REG_S31),
opnd_create_reg(DR_REG_S17));
test_instr_encoding(dc, OP_fsqrt, instr);
instr = INSTR_CREATE_fsqrt_scalar(dc, opnd_create_reg(DR_REG_H31),
opnd_create_reg(DR_REG_H17));
test_instr_encoding(dc, OP_fsqrt, instr);
instr = INSTR_CREATE_fcvt_scalar(dc, opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_S2));
test_instr_encoding(dc, OP_fcvt, instr);
instr = INSTR_CREATE_fcvt_scalar(dc, opnd_create_reg(DR_REG_H31),
opnd_create_reg(DR_REG_S20));
test_instr_encoding(dc, OP_fcvt, instr);
instr = INSTR_CREATE_frintn_scalar(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D15));
test_instr_encoding(dc, OP_frintn, instr);
instr = INSTR_CREATE_frintn_scalar(dc, opnd_create_reg(DR_REG_S4),
opnd_create_reg(DR_REG_S15));
test_instr_encoding(dc, OP_frintn, instr);
instr = INSTR_CREATE_frintn_scalar(dc, opnd_create_reg(DR_REG_H4),
opnd_create_reg(DR_REG_H15));
test_instr_encoding(dc, OP_frintn, instr);
instr = INSTR_CREATE_frintp_scalar(dc, opnd_create_reg(DR_REG_D23),
opnd_create_reg(DR_REG_D2));
test_instr_encoding(dc, OP_frintp, instr);
instr = INSTR_CREATE_frintp_scalar(dc, opnd_create_reg(DR_REG_S23),
opnd_create_reg(DR_REG_S2));
test_instr_encoding(dc, OP_frintp, instr);
instr = INSTR_CREATE_frintp_scalar(dc, opnd_create_reg(DR_REG_H23),
opnd_create_reg(DR_REG_H2));
test_instr_encoding(dc, OP_frintp, instr);
instr = INSTR_CREATE_frintm_scalar(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D8));
test_instr_encoding(dc, OP_frintm, instr);
instr = INSTR_CREATE_frintm_scalar(dc, opnd_create_reg(DR_REG_S26),
opnd_create_reg(DR_REG_S8));
test_instr_encoding(dc, OP_frintm, instr);
instr = INSTR_CREATE_frintm_scalar(dc, opnd_create_reg(DR_REG_H26),
opnd_create_reg(DR_REG_H8));
test_instr_encoding(dc, OP_frintm, instr);
instr = INSTR_CREATE_frintz_scalar(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D24));
test_instr_encoding(dc, OP_frintz, instr);
instr = INSTR_CREATE_frintz_scalar(dc, opnd_create_reg(DR_REG_S22),
opnd_create_reg(DR_REG_S24));
test_instr_encoding(dc, OP_frintz, instr);
instr = INSTR_CREATE_frintz_scalar(dc, opnd_create_reg(DR_REG_H22),
opnd_create_reg(DR_REG_H24));
test_instr_encoding(dc, OP_frintz, instr);
instr = INSTR_CREATE_frinta_scalar(dc, opnd_create_reg(DR_REG_D26),
opnd_create_reg(DR_REG_D18));
test_instr_encoding(dc, OP_frinta, instr);
instr = INSTR_CREATE_frinta_scalar(dc, opnd_create_reg(DR_REG_S26),
opnd_create_reg(DR_REG_S18));
test_instr_encoding(dc, OP_frinta, instr);
instr = INSTR_CREATE_frinta_scalar(dc, opnd_create_reg(DR_REG_H26),
opnd_create_reg(DR_REG_H18));
test_instr_encoding(dc, OP_frinta, instr);
instr = INSTR_CREATE_frintx_scalar(dc, opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29));
test_instr_encoding(dc, OP_frintx, instr);
instr = INSTR_CREATE_frintx_scalar(dc, opnd_create_reg(DR_REG_S16),
opnd_create_reg(DR_REG_S29));
test_instr_encoding(dc, OP_frintx, instr);
instr = INSTR_CREATE_frintx_scalar(dc, opnd_create_reg(DR_REG_H16),
opnd_create_reg(DR_REG_H29));
test_instr_encoding(dc, OP_frintx, instr);
instr = INSTR_CREATE_frinti_scalar(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D19));
test_instr_encoding(dc, OP_frinti, instr);
instr = INSTR_CREATE_frinti_scalar(dc, opnd_create_reg(DR_REG_S11),
opnd_create_reg(DR_REG_S19));
test_instr_encoding(dc, OP_frinti, instr);
instr = INSTR_CREATE_frinti_scalar(dc, opnd_create_reg(DR_REG_H11),
opnd_create_reg(DR_REG_H19));
test_instr_encoding(dc, OP_frinti, instr);
instr = INSTR_CREATE_fcvt_scalar(dc, opnd_create_reg(DR_REG_S23),
opnd_create_reg(DR_REG_D8));
test_instr_encoding(dc, OP_fcvt, instr);
instr = INSTR_CREATE_fcvt_scalar(dc, opnd_create_reg(DR_REG_H29),
opnd_create_reg(DR_REG_D15));
test_instr_encoding(dc, OP_fcvt, instr);
instr = INSTR_CREATE_fcvt_scalar(dc, opnd_create_reg(DR_REG_S28),
opnd_create_reg(DR_REG_H24));
test_instr_encoding(dc, OP_fcvt, instr);
instr = INSTR_CREATE_fcvt_scalar(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_H0));
test_instr_encoding(dc, OP_fcvt, instr);
}
static void
test_floatdp2(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_fmul_scalar(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30));
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fmul_scalar(dc, opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S27),
opnd_create_reg(DR_REG_S30));
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fmul_scalar(dc, opnd_create_reg(DR_REG_H2),
opnd_create_reg(DR_REG_H27),
opnd_create_reg(DR_REG_H30));
test_instr_encoding(dc, OP_fmul, instr);
instr = INSTR_CREATE_fdiv_scalar(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D29));
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fdiv_scalar(dc, opnd_create_reg(DR_REG_S0),
opnd_create_reg(DR_REG_S13),
opnd_create_reg(DR_REG_S29));
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fdiv_scalar(dc, opnd_create_reg(DR_REG_H0),
opnd_create_reg(DR_REG_H13),
opnd_create_reg(DR_REG_H29));
test_instr_encoding(dc, OP_fdiv, instr);
instr = INSTR_CREATE_fadd_scalar(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D10));
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fadd_scalar(dc, opnd_create_reg(DR_REG_S31),
opnd_create_reg(DR_REG_S17),
opnd_create_reg(DR_REG_S10));
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fadd_scalar(dc, opnd_create_reg(DR_REG_H31),
opnd_create_reg(DR_REG_H17),
opnd_create_reg(DR_REG_H10));
test_instr_encoding(dc, OP_fadd, instr);
instr = INSTR_CREATE_fsub_scalar(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_D20));
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fsub_scalar(dc, opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S31),
opnd_create_reg(DR_REG_S20));
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fsub_scalar(dc, opnd_create_reg(DR_REG_H2),
opnd_create_reg(DR_REG_H31),
opnd_create_reg(DR_REG_H20));
test_instr_encoding(dc, OP_fsub, instr);
instr = INSTR_CREATE_fmax_scalar(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D23));
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_fmax_scalar(dc, opnd_create_reg(DR_REG_S4),
opnd_create_reg(DR_REG_S15),
opnd_create_reg(DR_REG_S23));
test_instr_encoding(dc, OP_fmax, instr);
instr = INSTR_CREATE_fmax_scalar(dc, opnd_create_reg(DR_REG_H4),
opnd_create_reg(DR_REG_H15),
opnd_create_reg(DR_REG_H23));
test_instr_encoding(dc, OP_fmax, instr);
instr =
INSTR_CREATE_fmin_scalar(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D26), opnd_create_reg(DR_REG_D8));
test_instr_encoding(dc, OP_fmin, instr);
instr =
INSTR_CREATE_fmin_scalar(dc, opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S26), opnd_create_reg(DR_REG_S8));
test_instr_encoding(dc, OP_fmin, instr);
instr =
INSTR_CREATE_fmin_scalar(dc, opnd_create_reg(DR_REG_H2),
opnd_create_reg(DR_REG_H26), opnd_create_reg(DR_REG_H8));
test_instr_encoding(dc, OP_fmin, instr);
instr = INSTR_CREATE_fmaxnm_scalar(dc, opnd_create_reg(DR_REG_D22),
opnd_create_reg(DR_REG_D24),
opnd_create_reg(DR_REG_D26));
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmaxnm_scalar(dc, opnd_create_reg(DR_REG_S22),
opnd_create_reg(DR_REG_S24),
opnd_create_reg(DR_REG_S26));
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fmaxnm_scalar(dc, opnd_create_reg(DR_REG_H22),
opnd_create_reg(DR_REG_H24),
opnd_create_reg(DR_REG_H26));
test_instr_encoding(dc, OP_fmaxnm, instr);
instr = INSTR_CREATE_fminnm_scalar(dc, opnd_create_reg(DR_REG_D18),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29));
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fminnm_scalar(dc, opnd_create_reg(DR_REG_S18),
opnd_create_reg(DR_REG_S16),
opnd_create_reg(DR_REG_S29));
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fminnm_scalar(dc, opnd_create_reg(DR_REG_H18),
opnd_create_reg(DR_REG_H16),
opnd_create_reg(DR_REG_H29));
test_instr_encoding(dc, OP_fminnm, instr);
instr = INSTR_CREATE_fnmul_scalar(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D23));
test_instr_encoding(dc, OP_fnmul, instr);
instr = INSTR_CREATE_fnmul_scalar(dc, opnd_create_reg(DR_REG_S11),
opnd_create_reg(DR_REG_S19),
opnd_create_reg(DR_REG_S23));
test_instr_encoding(dc, OP_fnmul, instr);
instr = INSTR_CREATE_fnmul_scalar(dc, opnd_create_reg(DR_REG_H11),
opnd_create_reg(DR_REG_H19),
opnd_create_reg(DR_REG_H23));
test_instr_encoding(dc, OP_fnmul, instr);
}
static void
test_floatdp3(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_fmadd_scalar(
dc, opnd_create_reg(DR_REG_D2), opnd_create_reg(DR_REG_D27),
opnd_create_reg(DR_REG_D30), opnd_create_reg(DR_REG_D0));
test_instr_encoding(dc, OP_fmadd, instr);
instr = INSTR_CREATE_fmadd_scalar(
dc, opnd_create_reg(DR_REG_S2), opnd_create_reg(DR_REG_S27),
opnd_create_reg(DR_REG_S30), opnd_create_reg(DR_REG_S0));
test_instr_encoding(dc, OP_fmadd, instr);
instr = INSTR_CREATE_fmadd_scalar(
dc, opnd_create_reg(DR_REG_H2), opnd_create_reg(DR_REG_H27),
opnd_create_reg(DR_REG_H30), opnd_create_reg(DR_REG_H0));
test_instr_encoding(dc, OP_fmadd, instr);
instr = INSTR_CREATE_fmsub_scalar(
dc, opnd_create_reg(DR_REG_D13), opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D31), opnd_create_reg(DR_REG_D17));
test_instr_encoding(dc, OP_fmsub, instr);
instr = INSTR_CREATE_fmsub_scalar(
dc, opnd_create_reg(DR_REG_S13), opnd_create_reg(DR_REG_S29),
opnd_create_reg(DR_REG_S31), opnd_create_reg(DR_REG_S17));
test_instr_encoding(dc, OP_fmsub, instr);
instr = INSTR_CREATE_fmsub_scalar(
dc, opnd_create_reg(DR_REG_H13), opnd_create_reg(DR_REG_H29),
opnd_create_reg(DR_REG_H31), opnd_create_reg(DR_REG_H17));
test_instr_encoding(dc, OP_fmsub, instr);
instr = INSTR_CREATE_fnmadd_scalar(
dc, opnd_create_reg(DR_REG_D10), opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D31), opnd_create_reg(DR_REG_D20));
test_instr_encoding(dc, OP_fnmadd, instr);
instr = INSTR_CREATE_fnmadd_scalar(
dc, opnd_create_reg(DR_REG_S10), opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S31), opnd_create_reg(DR_REG_S20));
test_instr_encoding(dc, OP_fnmadd, instr);
instr = INSTR_CREATE_fnmadd_scalar(
dc, opnd_create_reg(DR_REG_H10), opnd_create_reg(DR_REG_H2),
opnd_create_reg(DR_REG_H31), opnd_create_reg(DR_REG_H20));
test_instr_encoding(dc, OP_fnmadd, instr);
instr = INSTR_CREATE_fnmsub_scalar(
dc, opnd_create_reg(DR_REG_D4), opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D23), opnd_create_reg(DR_REG_D2));
test_instr_encoding(dc, OP_fnmsub, instr);
instr = INSTR_CREATE_fnmsub_scalar(
dc, opnd_create_reg(DR_REG_S4), opnd_create_reg(DR_REG_S15),
opnd_create_reg(DR_REG_S23), opnd_create_reg(DR_REG_S2));
test_instr_encoding(dc, OP_fnmsub, instr);
instr = INSTR_CREATE_fnmsub_scalar(
dc, opnd_create_reg(DR_REG_H4), opnd_create_reg(DR_REG_H15),
opnd_create_reg(DR_REG_H23), opnd_create_reg(DR_REG_H2));
test_instr_encoding(dc, OP_fnmsub, instr);
}
static void
test_asimddiff(void *dc)
{
byte *pc;
instr_t *instr;
instr = INSTR_CREATE_saddl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_saddl, instr);
instr = INSTR_CREATE_saddl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_saddl, instr);
instr = INSTR_CREATE_saddl_vector(dc, opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_saddl, instr);
instr = INSTR_CREATE_saddl2_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_saddl2, instr);
instr = INSTR_CREATE_saddl2_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_saddl2, instr);
instr = INSTR_CREATE_saddl2_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q26), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_saddl2, instr);
instr = INSTR_CREATE_saddw_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_D16), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_saddw, instr);
instr = INSTR_CREATE_saddw_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_D16), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_saddw, instr);
instr = INSTR_CREATE_saddw_vector(dc, opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_D16), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_saddw, instr);
instr = INSTR_CREATE_saddw2_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_saddw2, instr);
instr = INSTR_CREATE_saddw2_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_saddw2, instr);
instr = INSTR_CREATE_saddw2_vector(dc, opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_saddw2, instr);
instr = INSTR_CREATE_ssubl_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ssubl, instr);
instr = INSTR_CREATE_ssubl_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ssubl, instr);
instr = INSTR_CREATE_ssubl_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ssubl, instr);
instr = INSTR_CREATE_ssubl2_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ssubl2, instr);
instr = INSTR_CREATE_ssubl2_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ssubl2, instr);
instr = INSTR_CREATE_ssubl2_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ssubl2, instr);
instr = INSTR_CREATE_ssubw_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D21), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ssubw, instr);
instr = INSTR_CREATE_ssubw_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D21), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ssubw, instr);
instr = INSTR_CREATE_ssubw_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ssubw, instr);
instr = INSTR_CREATE_ssubw2_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_ssubw2, instr);
instr = INSTR_CREATE_ssubw2_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_ssubw2, instr);
instr = INSTR_CREATE_ssubw2_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ssubw2, instr);
instr = INSTR_CREATE_addhn_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_addhn, instr);
instr = INSTR_CREATE_addhn_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_addhn, instr);
instr = INSTR_CREATE_addhn_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_addhn, instr);
instr = INSTR_CREATE_addhn2_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_addhn2, instr);
instr = INSTR_CREATE_addhn2_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_addhn2, instr);
instr = INSTR_CREATE_addhn2_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q4), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_addhn2, instr);
instr = INSTR_CREATE_sabal_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D11), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sabal, instr);
instr = INSTR_CREATE_sabal_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D11), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sabal, instr);
instr = INSTR_CREATE_sabal_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D11), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sabal, instr);
instr = INSTR_CREATE_sabal2_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sabal2, instr);
instr = INSTR_CREATE_sabal2_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sabal2, instr);
instr = INSTR_CREATE_sabal2_vector(dc, opnd_create_reg(DR_REG_Q28),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sabal2, instr);
instr = INSTR_CREATE_subhn_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_subhn, instr);
instr = INSTR_CREATE_subhn_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_subhn, instr);
instr = INSTR_CREATE_subhn_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_subhn, instr);
instr = INSTR_CREATE_subhn2_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_subhn2, instr);
instr = INSTR_CREATE_subhn2_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_subhn2, instr);
instr = INSTR_CREATE_subhn2_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q7), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_subhn2, instr);
instr = INSTR_CREATE_sabdl_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D15), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sabdl, instr);
instr = INSTR_CREATE_sabdl_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sabdl, instr);
instr = INSTR_CREATE_sabdl_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D15), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sabdl, instr);
instr = INSTR_CREATE_sabdl2_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_sabdl2, instr);
instr = INSTR_CREATE_sabdl2_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sabdl2, instr);
instr = INSTR_CREATE_sabdl2_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sabdl2, instr);
instr = INSTR_CREATE_smlal_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smlal, instr);
instr = INSTR_CREATE_smlal_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smlal, instr);
instr = INSTR_CREATE_smlal_vector(dc, opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smlal, instr);
instr = INSTR_CREATE_smlal2_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smlal2, instr);
instr = INSTR_CREATE_smlal2_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smlal2, instr);
instr = INSTR_CREATE_smlal2_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smlal2, instr);
instr = INSTR_CREATE_sqdmlal_vector(dc, opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D5), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmlal, instr);
instr = INSTR_CREATE_sqdmlal_vector(dc, opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D5), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmlal, instr);
instr = INSTR_CREATE_sqdmlal2_vector(dc, opnd_create_reg(DR_REG_Q25),
opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmlal2, instr);
instr = INSTR_CREATE_sqdmlal2_vector(
dc, opnd_create_reg(DR_REG_Q25), opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmlal2, instr);
instr = INSTR_CREATE_smlsl_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D8), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smlsl, instr);
instr = INSTR_CREATE_smlsl_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D8), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smlsl, instr);
instr = INSTR_CREATE_smlsl_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D8), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smlsl, instr);
instr = INSTR_CREATE_smlsl2_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smlsl2, instr);
instr = INSTR_CREATE_smlsl2_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smlsl2, instr);
instr = INSTR_CREATE_smlsl2_vector(dc, opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smlsl2, instr);
instr = INSTR_CREATE_sqdmlsl_vector(dc, opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D20), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmlsl, instr);
instr = INSTR_CREATE_sqdmlsl_vector(
dc, opnd_create_reg(DR_REG_Q14), opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmlsl, instr);
instr = INSTR_CREATE_sqdmlsl2_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmlsl2, instr);
instr = INSTR_CREATE_sqdmlsl2_vector(
dc, opnd_create_reg(DR_REG_Q26), opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q15), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmlsl2, instr);
instr = INSTR_CREATE_smull_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D0), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smull, instr);
instr = INSTR_CREATE_smull_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D0), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smull, instr);
instr = INSTR_CREATE_smull_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D0), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smull, instr);
instr = INSTR_CREATE_smull2_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_smull2, instr);
instr = INSTR_CREATE_smull2_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_smull2, instr);
instr = INSTR_CREATE_smull2_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q10),
opnd_create_reg(DR_REG_Q10), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_smull2, instr);
instr = INSTR_CREATE_sqdmull_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_D14),
opnd_create_reg(DR_REG_D18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmull, instr);
instr = INSTR_CREATE_sqdmull_vector(
dc, opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_D14),
opnd_create_reg(DR_REG_D18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmull, instr);
instr = INSTR_CREATE_sqdmull2_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_sqdmull2, instr);
instr = INSTR_CREATE_sqdmull2_vector(
dc, opnd_create_reg(DR_REG_Q12), opnd_create_reg(DR_REG_Q27),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_sqdmull2, instr);
instr = INSTR_CREATE_pmull_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_pmull, instr);
instr = INSTR_CREATE_pmull_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D2), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_pmull, instr);
instr = INSTR_CREATE_pmull2_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_pmull2, instr);
instr = INSTR_CREATE_pmull2_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_pmull2, instr);
instr = INSTR_CREATE_uaddl_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uaddl, instr);
instr = INSTR_CREATE_uaddl_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uaddl, instr);
instr = INSTR_CREATE_uaddl_vector(dc, opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_D16),
opnd_create_reg(DR_REG_D29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uaddl, instr);
instr = INSTR_CREATE_uaddl2_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uaddl2, instr);
instr = INSTR_CREATE_uaddl2_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uaddl2, instr);
instr = INSTR_CREATE_uaddl2_vector(dc, opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uaddl2, instr);
instr = INSTR_CREATE_uaddw_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D12), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uaddw, instr);
instr = INSTR_CREATE_uaddw_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D12), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uaddw, instr);
instr = INSTR_CREATE_uaddw_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q14),
opnd_create_reg(DR_REG_D12), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uaddw, instr);
instr = INSTR_CREATE_uaddw2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uaddw2, instr);
instr = INSTR_CREATE_uaddw2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uaddw2, instr);
instr = INSTR_CREATE_uaddw2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q18),
opnd_create_reg(DR_REG_Q17), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uaddw2, instr);
instr = INSTR_CREATE_usubl_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D14), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_usubl, instr);
instr = INSTR_CREATE_usubl_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D14), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_usubl, instr);
instr = INSTR_CREATE_usubl_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_usubl, instr);
instr = INSTR_CREATE_usubl2_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_usubl2, instr);
instr = INSTR_CREATE_usubl2_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q1), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_usubl2, instr);
instr = INSTR_CREATE_usubl2_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q1), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_usubl2, instr);
instr = INSTR_CREATE_usubw_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_D1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_usubw, instr);
instr = INSTR_CREATE_usubw_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_D1), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_usubw, instr);
instr = INSTR_CREATE_usubw_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_D1), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_usubw, instr);
instr = INSTR_CREATE_usubw2_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_usubw2, instr);
instr = INSTR_CREATE_usubw2_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_usubw2, instr);
instr = INSTR_CREATE_usubw2_vector(dc, opnd_create_reg(DR_REG_Q2),
opnd_create_reg(DR_REG_Q3),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_usubw2, instr);
instr = INSTR_CREATE_raddhn_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_raddhn, instr);
instr = INSTR_CREATE_raddhn_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_raddhn, instr);
instr = INSTR_CREATE_raddhn_vector(dc, opnd_create_reg(DR_REG_D31),
opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_raddhn, instr);
instr = INSTR_CREATE_raddhn2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_raddhn2, instr);
instr = INSTR_CREATE_raddhn2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_raddhn2, instr);
instr = INSTR_CREATE_raddhn2_vector(
dc, opnd_create_reg(DR_REG_Q13), opnd_create_reg(DR_REG_Q16),
opnd_create_reg(DR_REG_Q14), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_raddhn2, instr);
instr = INSTR_CREATE_uabal_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D22), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uabal, instr);
instr = INSTR_CREATE_uabal_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D22), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uabal, instr);
instr = INSTR_CREATE_uabal_vector(dc, opnd_create_reg(DR_REG_Q23),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D22), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uabal, instr);
instr = INSTR_CREATE_uabal2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uabal2, instr);
instr = INSTR_CREATE_uabal2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uabal2, instr);
instr = INSTR_CREATE_uabal2_vector(dc, opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uabal2, instr);
instr = INSTR_CREATE_rsubhn_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_rsubhn, instr);
instr = INSTR_CREATE_rsubhn_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_rsubhn, instr);
instr = INSTR_CREATE_rsubhn_vector(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_Q7),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_rsubhn, instr);
instr = INSTR_CREATE_rsubhn2_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_rsubhn2, instr);
instr = INSTR_CREATE_rsubhn2_vector(dc, opnd_create_reg(DR_REG_Q21),
opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_rsubhn2, instr);
instr = INSTR_CREATE_rsubhn2_vector(
dc, opnd_create_reg(DR_REG_Q21), opnd_create_reg(DR_REG_Q20),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_rsubhn2, instr);
instr = INSTR_CREATE_uabdl_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D25), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uabdl, instr);
instr = INSTR_CREATE_uabdl_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D25), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uabdl, instr);
instr = INSTR_CREATE_uabdl_vector(dc, opnd_create_reg(DR_REG_Q26),
opnd_create_reg(DR_REG_D15),
opnd_create_reg(DR_REG_D25), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uabdl, instr);
instr = INSTR_CREATE_uabdl2_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_uabdl2, instr);
instr = INSTR_CREATE_uabdl2_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_uabdl2, instr);
instr = INSTR_CREATE_uabdl2_vector(dc, opnd_create_reg(DR_REG_Q30),
opnd_create_reg(DR_REG_Q13),
opnd_create_reg(DR_REG_Q27), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_uabdl2, instr);
instr = INSTR_CREATE_umlal_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D1), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umlal, instr);
instr = INSTR_CREATE_umlal_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D1), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umlal, instr);
instr = INSTR_CREATE_umlal_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D1), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umlal, instr);
instr = INSTR_CREATE_umlal2_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umlal2, instr);
instr = INSTR_CREATE_umlal2_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umlal2, instr);
instr = INSTR_CREATE_umlal2_vector(dc, opnd_create_reg(DR_REG_Q29),
opnd_create_reg(DR_REG_Q24),
opnd_create_reg(DR_REG_Q30), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umlal2, instr);
instr = INSTR_CREATE_umlsl_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D21), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umlsl, instr);
instr = INSTR_CREATE_umlsl_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D21), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umlsl, instr);
instr = INSTR_CREATE_umlsl_vector(dc, opnd_create_reg(DR_REG_Q31),
opnd_create_reg(DR_REG_D9),
opnd_create_reg(DR_REG_D21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umlsl, instr);
instr = INSTR_CREATE_umlsl2_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umlsl2, instr);
instr = INSTR_CREATE_umlsl2_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umlsl2, instr);
instr = INSTR_CREATE_umlsl2_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q19),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umlsl2, instr);
instr = INSTR_CREATE_umull_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D2), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umull, instr);
instr = INSTR_CREATE_umull_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D2), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umull, instr);
instr = INSTR_CREATE_umull_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D2), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umull, instr);
instr = INSTR_CREATE_umull2_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_BYTE());
test_instr_encoding(dc, OP_umull2, instr);
instr = INSTR_CREATE_umull2_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_HALF());
test_instr_encoding(dc, OP_umull2, instr);
instr = INSTR_CREATE_umull2_vector(dc, opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q6),
opnd_create_reg(DR_REG_Q3), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_umull2, instr);
}
* which are aliases of SYS instruction variants:
* DC ZVA, Xt DC CVAC, Xt DC CVAU, Xt DC CIVAC Xt
* DC IVAC Xt DC ISW Xt DC CSW Xt DC CISW Xt
* IC IVAU, Xt IC IALLU IC IALLUIS
*/
#define SYS_CACHE_TEST_ALL_REGS(cache, op) \
do { \
for (int x = DR_REG_START_GPR; x < DR_REG_STOP_GPR; x++) { \
instr = INSTR_CREATE_##cache##_##op(dc, opnd_create_reg(x)); \
test_instr_encoding(dc, OP_##cache##_##op, instr); \
} \
} while (0)
static void
test_sys_cache(void *dc)
{
instr_t *instr;
*
* Data cache operations are aliases of SYS:
* DC <dc_op>, <Xt>
* is equivalent to
* SYS #<op1>, C7, <Cm>, #<op2>, <Xt>
*/
instr = INSTR_CREATE_dc_zva(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_zva, instr);
SYS_CACHE_TEST_ALL_REGS(dc, zva);
instr = INSTR_CREATE_dc_cvac(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_cvac, instr);
SYS_CACHE_TEST_ALL_REGS(dc, cvac);
instr = INSTR_CREATE_dc_cvau(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_cvau, instr);
SYS_CACHE_TEST_ALL_REGS(dc, cvau);
instr = INSTR_CREATE_dc_civac(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_civac, instr);
SYS_CACHE_TEST_ALL_REGS(dc, civac);
instr = INSTR_CREATE_dc_ivac(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_ivac, instr);
SYS_CACHE_TEST_ALL_REGS(dc, ivac);
* address. The register holds SetWay and cache level input.
* DC ISW Xt => SYS #0 C7 C6 #2, Xt
*/
instr = INSTR_CREATE_dc_isw(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_isw, instr);
SYS_CACHE_TEST_ALL_REGS(dc, isw);
instr = INSTR_CREATE_dc_csw(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_csw, instr);
SYS_CACHE_TEST_ALL_REGS(dc, csw);
instr = INSTR_CREATE_dc_cisw(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_dc_cisw, instr);
SYS_CACHE_TEST_ALL_REGS(dc, cisw);
* Similarly, instruction cache operations are also aliases of SYS:
* IC <ic_op>{, <Xt>}
* is equivalent to
* SYS #<op1>, C7, <Cm>, #<op2>{, <Xt>}
*/
instr = INSTR_CREATE_ic_ivau(dc, opnd_create_reg(DR_REG_X0));
test_instr_encoding(dc, OP_ic_ivau, instr);
SYS_CACHE_TEST_ALL_REGS(ic, ivau);
instr = INSTR_CREATE_ic_iallu(dc);
test_instr_encoding(dc, OP_ic_iallu, instr);
instr = INSTR_CREATE_ic_ialluis(dc);
test_instr_encoding(dc, OP_ic_ialluis, instr);
}
static void
test_exclusive_memops(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_ldxr(dc, opnd_create_reg(DR_REG_X0),
OPND_CREATE_MEM64(DR_REG_X1, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldxr, instr);
instr = INSTR_CREATE_ldxrb(dc, opnd_create_reg(DR_REG_W0),
OPND_CREATE_MEM8(DR_REG_X1, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldxrb, instr);
instr = INSTR_CREATE_ldxrh(dc, opnd_create_reg(DR_REG_W0),
OPND_CREATE_MEM16(DR_REG_X1, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldxrh, instr);
instr = INSTR_CREATE_ldxp(dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
OPND_CREATE_MEM64(DR_REG_X2, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldxp, instr);
instr =
INSTR_CREATE_ldxp(dc, opnd_create_reg(DR_REG_X0), opnd_create_reg(DR_REG_X1),
opnd_create_base_disp(DR_REG_X2, DR_REG_NULL, 0, 0, OPSZ_16));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldxp, instr);
instr = INSTR_CREATE_ldaxr(dc, opnd_create_reg(DR_REG_X0),
OPND_CREATE_MEM64(DR_REG_X1, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldaxr, instr);
instr = INSTR_CREATE_ldaxrb(dc, opnd_create_reg(DR_REG_W0),
OPND_CREATE_MEM8(DR_REG_X1, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldaxrb, instr);
instr = INSTR_CREATE_ldaxrh(dc, opnd_create_reg(DR_REG_W0),
OPND_CREATE_MEM16(DR_REG_X1, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldaxrh, instr);
instr = INSTR_CREATE_ldaxp(dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
OPND_CREATE_MEM64(DR_REG_X2, 0));
ASSERT(instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_ldaxp, instr);
instr = INSTR_CREATE_stxr(dc, OPND_CREATE_MEM64(DR_REG_X1, 0),
opnd_create_reg(DR_REG_W2), opnd_create_reg(DR_REG_X0));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stxr, instr);
instr = INSTR_CREATE_stxrb(dc, OPND_CREATE_MEM8(DR_REG_X1, 0),
opnd_create_reg(DR_REG_W2), opnd_create_reg(DR_REG_W0));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stxrb, instr);
instr = INSTR_CREATE_stxrh(dc, OPND_CREATE_MEM16(DR_REG_X1, 0),
opnd_create_reg(DR_REG_W2), opnd_create_reg(DR_REG_W0));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stxrh, instr);
instr =
INSTR_CREATE_stxp(dc, OPND_CREATE_MEM64(DR_REG_X2, 0), opnd_create_reg(DR_REG_W3),
opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stxp, instr);
instr = INSTR_CREATE_stxp(
dc, opnd_create_base_disp(DR_REG_X2, DR_REG_NULL, 0, 0, OPSZ_16),
opnd_create_reg(DR_REG_W3), opnd_create_reg(DR_REG_X0),
opnd_create_reg(DR_REG_X1));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stxp, instr);
instr = INSTR_CREATE_stlxr(dc, OPND_CREATE_MEM64(DR_REG_X1, 0),
opnd_create_reg(DR_REG_W2), opnd_create_reg(DR_REG_X0));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stlxr, instr);
instr = INSTR_CREATE_stlxrb(dc, OPND_CREATE_MEM8(DR_REG_X1, 0),
opnd_create_reg(DR_REG_W2), opnd_create_reg(DR_REG_W0));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stlxrb, instr);
instr = INSTR_CREATE_stlxrh(dc, OPND_CREATE_MEM16(DR_REG_X1, 0),
opnd_create_reg(DR_REG_W2), opnd_create_reg(DR_REG_W0));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stlxrh, instr);
instr = INSTR_CREATE_stlxp(dc, OPND_CREATE_MEM64(DR_REG_X2, 0),
opnd_create_reg(DR_REG_W3), opnd_create_reg(DR_REG_W0),
opnd_create_reg(DR_REG_W1));
ASSERT(instr_is_exclusive_store(instr));
test_instr_encoding(dc, OP_stlxp, instr);
instr = INSTR_CREATE_clrex(dc);
ASSERT(!instr_is_exclusive_store(instr) && !instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_clrex, instr);
instr = INSTR_CREATE_clrex_imm(dc, 2);
ASSERT(!instr_is_exclusive_store(instr) && !instr_is_exclusive_load(instr));
test_instr_encoding(dc, OP_clrex, instr);
}
static void
test_xinst(void *dc)
{
instr_t *instr;
instr =
XINST_CREATE_load_pair(dc, opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1),
OPND_CREATE_MEM64(DR_REG_X2, 0));
test_instr_encoding(dc, OP_ldp, instr);
instr =
XINST_CREATE_store_pair(dc, OPND_CREATE_MEM64(DR_REG_X2, 0),
opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1));
test_instr_encoding(dc, OP_stp, instr);
instr = XINST_CREATE_call_reg(dc, opnd_create_reg(DR_REG_X5));
test_instr_encoding(dc, OP_blr, instr);
}
static void
test_opnd(void *dc)
{
opnd_t op = opnd_create_reg_ex(DR_REG_X28, OPSZ_4, DR_OPND_EXTENDED);
ASSERT(opnd_get_reg(op) == DR_REG_X28);
ASSERT(opnd_is_reg_partial(op));
ASSERT(opnd_get_size(op) == OPSZ_4);
ASSERT(opnd_get_flags(op) == DR_OPND_EXTENDED);
bool found = opnd_replace_reg(&op, DR_REG_W28, DR_REG_W0);
ASSERT(!found);
found = opnd_replace_reg(&op, DR_REG_X28, DR_REG_X0);
ASSERT(found);
ASSERT(opnd_get_reg(op) == DR_REG_X0);
ASSERT(opnd_is_reg_partial(op));
ASSERT(opnd_get_size(op) == OPSZ_4);
ASSERT(opnd_get_flags(op) == DR_OPND_EXTENDED);
op = opnd_create_base_disp_aarch64(DR_REG_X7, DR_REG_NULL, DR_EXTEND_SXTX, true, 42,
DR_OPND_EXTENDED, OPSZ_8);
ASSERT(opnd_get_base(op) == DR_REG_X7);
ASSERT(opnd_get_flags(op) == DR_OPND_EXTENDED);
bool scaled;
uint amount;
dr_extend_type_t extend = opnd_get_index_extend(op, &scaled, &amount);
ASSERT(extend == DR_EXTEND_SXTX && scaled && amount == 3);
found = opnd_replace_reg(&op, DR_REG_W7, DR_REG_W1);
ASSERT(!found);
found = opnd_replace_reg(&op, DR_REG_X7, DR_REG_X1);
ASSERT(found);
ASSERT(opnd_get_base(op) == DR_REG_X1);
ASSERT(opnd_get_flags(op) == DR_OPND_EXTENDED);
extend = opnd_get_index_extend(op, &scaled, &amount);
ASSERT(extend == DR_EXTEND_SXTX && scaled && amount == 3);
op = opnd_create_base_disp_aarch64(DR_REG_X7, DR_REG_X4, DR_EXTEND_UXTW, true, 0,
DR_OPND_EXTENDED, OPSZ_8);
ASSERT(opnd_get_base(op) == DR_REG_X7);
ASSERT(opnd_get_index(op) == DR_REG_X4);
ASSERT(opnd_get_flags(op) == DR_OPND_EXTENDED);
extend = opnd_get_index_extend(op, &scaled, &amount);
ASSERT(extend == DR_EXTEND_UXTW && scaled && amount == 3);
found = opnd_replace_reg(&op, DR_REG_W4, DR_REG_W1);
ASSERT(!found);
found = opnd_replace_reg(&op, DR_REG_X4, DR_REG_X1);
ASSERT(found);
ASSERT(opnd_get_base(op) == DR_REG_X7);
ASSERT(opnd_get_index(op) == DR_REG_X1);
ASSERT(opnd_get_flags(op) == DR_OPND_EXTENDED);
extend = opnd_get_index_extend(op, &scaled, &amount);
ASSERT(extend == DR_EXTEND_UXTW && scaled && amount == 3);
instr_t *instr =
INSTR_CREATE_stxp(dc, OPND_CREATE_MEM64(DR_REG_X2, 0), opnd_create_reg(DR_REG_W3),
opnd_create_reg(DR_REG_W0), opnd_create_reg(DR_REG_W1));
found = instr_replace_reg_resize(instr, DR_REG_X3, DR_REG_X28);
ASSERT(found);
found = instr_replace_reg_resize(instr, DR_REG_W2, DR_REG_W14);
ASSERT(found);
ASSERT(opnd_get_base(instr_get_dst(instr, 0)) == DR_REG_X14);
ASSERT(opnd_get_reg(instr_get_dst(instr, 1)) == DR_REG_W28);
ASSERT(opnd_get_reg(instr_get_src(instr, 0)) == DR_REG_W0);
ASSERT(opnd_get_reg(instr_get_src(instr, 1)) == DR_REG_W1);
instr_destroy(dc, instr);
ASSERT(reg_to_pointer_sized(DR_REG_WZR) == DR_REG_XZR);
ASSERT(reg_32_to_64(DR_REG_WZR) == DR_REG_XZR);
ASSERT(reg_64_to_32(DR_REG_XZR) == DR_REG_WZR);
ASSERT(reg_resize_to_opsz(DR_REG_XZR, OPSZ_4) == DR_REG_WZR);
ASSERT(reg_resize_to_opsz(DR_REG_WZR, OPSZ_8) == DR_REG_XZR);
ASSERT(!reg_is_gpr(DR_REG_XZR));
ASSERT(!reg_is_gpr(DR_REG_WZR));
* register negate and shift across replace and other operations.
*/
}
static void
test_mov_instr_addr_encoding(void *dc, instr_t *instr, uint opcode, uint target_off,
uint right_shift_amt, uint mask)
{
ASSERT(opcode == OP_movz || opcode == OP_movk);
instr_t *decin;
byte *pc;
ASSERT(instr_get_opcode(instr) == opcode);
ASSERT(instr_is_encoding_possible(instr));
pc = instr_encode(dc, instr, buf);
decin = instr_create(dc);
decode(dc, buf, decin);
ASSERT(instr_get_opcode(decin) == opcode);
uint src_op = opcode == OP_movz ? 0 : 1;
uint expected_imm = (((ptr_int_t)buf + target_off) >> right_shift_amt) & mask;
ASSERT(opnd_get_immed_int(instr_get_src(decin, src_op)) == expected_imm);
instr_destroy(dc, instr);
instr_destroy(dc, decin);
}
#ifdef DR_FAST_IR
static void
test_mov_instr_addr(void *dc)
{
instr_t *label_instr = instr_create_0dst_0src(dc, OP_LABEL);
label_instr->offset = 0x100;
instr_t *movz_instr_sh0_2b = INSTR_CREATE_movz(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_2, 0),
OPND_CREATE_INT(0));
movz_instr_sh0_2b->offset = 0x10;
test_mov_instr_addr_encoding(dc, movz_instr_sh0_2b, OP_movz, 0xf0, 0, 0xffff);
instr_t *movz_instr_sh16_2b = INSTR_CREATE_movk(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_2, 16),
OPND_CREATE_INT(0));
movz_instr_sh16_2b->offset = 0x20;
test_mov_instr_addr_encoding(dc, movz_instr_sh16_2b, OP_movk, 0xe0, 16, 0xffff);
instr_t *movz_instr_sh32_2b = INSTR_CREATE_movz(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_2, 32),
OPND_CREATE_INT(0));
movz_instr_sh32_2b->offset = 0x30;
test_mov_instr_addr_encoding(dc, movz_instr_sh32_2b, OP_movz, 0xd0, 32, 0xffff);
instr_t *movz_instr_sh48_2b = INSTR_CREATE_movk(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_2, 48),
OPND_CREATE_INT(0));
movz_instr_sh48_2b->offset = 0x40;
test_mov_instr_addr_encoding(dc, movz_instr_sh48_2b, OP_movk, 0xc0, 48, 0xffff);
instr_t *movz_instr_sh0_1b = INSTR_CREATE_movk(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_1, 0),
OPND_CREATE_INT(0));
movz_instr_sh0_1b->offset = 0x10;
test_mov_instr_addr_encoding(dc, movz_instr_sh0_1b, OP_movk, 0xf0, 0, 0xff);
instr_t *movz_instr_sh16_1b = INSTR_CREATE_movz(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_1, 16),
OPND_CREATE_INT(0));
movz_instr_sh16_1b->offset = 0x20;
test_mov_instr_addr_encoding(dc, movz_instr_sh16_1b, OP_movz, 0xe0, 16, 0xff);
instr_t *movz_instr_sh32_1b = INSTR_CREATE_movk(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_1, 32),
OPND_CREATE_INT(0));
movz_instr_sh32_1b->offset = 0x30;
test_mov_instr_addr_encoding(dc, movz_instr_sh32_1b, OP_movk, 0xd0, 32, 0xff);
instr_t *movz_instr_sh48_1b = INSTR_CREATE_movz(
dc, opnd_create_reg(DR_REG_X0), opnd_create_instr_ex(label_instr, OPSZ_1, 48),
OPND_CREATE_INT(0));
movz_instr_sh48_1b->offset = 0x40;
test_mov_instr_addr_encoding(dc, movz_instr_sh48_1b, OP_movz, 0xc0, 48, 0xff);
instr_destroy(dc, label_instr);
}
#endif
static void
test_fcvtas_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtas_scalar(dc, opnd_create_reg(DR_REG_W20),
opnd_create_reg(DR_REG_S1));
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_scalar(dc, opnd_create_reg(DR_REG_X7),
opnd_create_reg(DR_REG_S3));
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_scalar(dc, opnd_create_reg(DR_REG_W0),
opnd_create_reg(DR_REG_D22));
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_scalar(dc, opnd_create_reg(DR_REG_X21),
opnd_create_reg(DR_REG_D0));
test_instr_encoding(dc, OP_fcvtas, instr);
}
static void
test_fcvtas_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtas_vector(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D1), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_vector(dc, opnd_create_reg(DR_REG_Q0),
opnd_create_reg(DR_REG_Q9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q29), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_scalar(dc, opnd_create_reg(DR_REG_S30),
opnd_create_reg(DR_REG_S30));
test_instr_encoding(dc, OP_fcvtas, instr);
instr = INSTR_CREATE_fcvtas_scalar(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D12));
test_instr_encoding(dc, OP_fcvtas, instr);
}
static void
test_fcvtns_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtns_scalar(dc, opnd_create_reg(DR_REG_W21),
opnd_create_reg(DR_REG_S8));
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_scalar(dc, opnd_create_reg(DR_REG_X14),
opnd_create_reg(DR_REG_S21));
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_scalar(dc, opnd_create_reg(DR_REG_W7),
opnd_create_reg(DR_REG_D29));
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_scalar(dc, opnd_create_reg(DR_REG_X9),
opnd_create_reg(DR_REG_D17));
test_instr_encoding(dc, OP_fcvtns, instr);
}
static void
test_fcvtns_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtns_vector(dc, opnd_create_reg(DR_REG_D5),
opnd_create_reg(DR_REG_D9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q19), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_vector(dc, opnd_create_reg(DR_REG_Q17),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_scalar(dc, opnd_create_reg(DR_REG_S9),
opnd_create_reg(DR_REG_S2));
test_instr_encoding(dc, OP_fcvtns, instr);
instr = INSTR_CREATE_fcvtns_scalar(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D7));
test_instr_encoding(dc, OP_fcvtns, instr);
}
static void
test_fcvtps_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtps_scalar(dc, opnd_create_reg(DR_REG_W19),
opnd_create_reg(DR_REG_S7));
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_scalar(dc, opnd_create_reg(DR_REG_X5),
opnd_create_reg(DR_REG_S4));
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_scalar(dc, opnd_create_reg(DR_REG_W8),
opnd_create_reg(DR_REG_D10));
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_scalar(dc, opnd_create_reg(DR_REG_X9),
opnd_create_reg(DR_REG_D18));
test_instr_encoding(dc, OP_fcvtps, instr);
}
static void
test_fcvtps_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtps_vector(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_vector(dc, opnd_create_reg(DR_REG_Q4),
opnd_create_reg(DR_REG_Q20), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_vector(dc, opnd_create_reg(DR_REG_Q15),
opnd_create_reg(DR_REG_Q0), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_scalar(dc, opnd_create_reg(DR_REG_S29),
opnd_create_reg(DR_REG_S4));
test_instr_encoding(dc, OP_fcvtps, instr);
instr = INSTR_CREATE_fcvtps_scalar(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D16));
test_instr_encoding(dc, OP_fcvtps, instr);
}
static void
test_fcvtpu_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtpu_scalar(dc, opnd_create_reg(DR_REG_W1),
opnd_create_reg(DR_REG_S2));
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_scalar(dc, opnd_create_reg(DR_REG_X14),
opnd_create_reg(DR_REG_S14));
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_scalar(dc, opnd_create_reg(DR_REG_W4),
opnd_create_reg(DR_REG_D2));
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_scalar(dc, opnd_create_reg(DR_REG_X9),
opnd_create_reg(DR_REG_D1));
test_instr_encoding(dc, OP_fcvtpu, instr);
}
static void
test_fcvtpu_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtpu_vector(dc, opnd_create_reg(DR_REG_D1),
opnd_create_reg(DR_REG_D24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_vector(dc, opnd_create_reg(DR_REG_Q22),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q11), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_scalar(dc, opnd_create_reg(DR_REG_S27),
opnd_create_reg(DR_REG_S21));
test_instr_encoding(dc, OP_fcvtpu, instr);
instr = INSTR_CREATE_fcvtpu_scalar(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D18));
test_instr_encoding(dc, OP_fcvtpu, instr);
}
static void
test_fcvtzs_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzs_scalar(dc, opnd_create_reg(DR_REG_W11),
opnd_create_reg(DR_REG_S8));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar(dc, opnd_create_reg(DR_REG_X14),
opnd_create_reg(DR_REG_S3));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar(dc, opnd_create_reg(DR_REG_W0),
opnd_create_reg(DR_REG_D28));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar(dc, opnd_create_reg(DR_REG_X9),
opnd_create_reg(DR_REG_D1));
test_instr_encoding(dc, OP_fcvtzs, instr);
}
static void
test_fcvtzs_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzs_vector(dc, opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_D8), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q21), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_vector(dc, opnd_create_reg(DR_REG_Q11),
opnd_create_reg(DR_REG_Q2), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar(dc, opnd_create_reg(DR_REG_S3),
opnd_create_reg(DR_REG_S3));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D7));
test_instr_encoding(dc, OP_fcvtzs, instr);
}
static void
test_fcvtzs_scalar_fixed_gpr(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_W7),
opnd_create_reg(DR_REG_S8),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_X13),
opnd_create_reg(DR_REG_S21),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_W30),
opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_X12),
opnd_create_reg(DR_REG_D15),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
}
static void
test_fcvtzs_scalar_fixed(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S0),
opnd_create_reg(DR_REG_S1),
opnd_create_immed_int(1, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S3),
opnd_create_immed_int(2, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S4),
opnd_create_reg(DR_REG_S5),
opnd_create_immed_int(4, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S6),
opnd_create_reg(DR_REG_S7),
opnd_create_immed_int(8, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S8),
opnd_create_reg(DR_REG_S9),
opnd_create_immed_int(16, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S10),
opnd_create_reg(DR_REG_S11),
opnd_create_immed_int(32, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S28),
opnd_create_reg(DR_REG_S29),
opnd_create_immed_int(21, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_S30),
opnd_create_reg(DR_REG_S31),
opnd_create_immed_int(31, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D1),
opnd_create_immed_int(1, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D3),
opnd_create_immed_int(2, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D5),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D7),
opnd_create_immed_int(8, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D13),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D29),
opnd_create_immed_int(21, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
instr = INSTR_CREATE_fcvtzs_scalar_fixed(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D31),
opnd_create_immed_int(42, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzs, instr);
}
static void
test_fcvtzu_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzu_scalar(dc, opnd_create_reg(DR_REG_W7),
opnd_create_reg(DR_REG_S8));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar(dc, opnd_create_reg(DR_REG_X13),
opnd_create_reg(DR_REG_S21));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar(dc, opnd_create_reg(DR_REG_W0),
opnd_create_reg(DR_REG_D9));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar(dc, opnd_create_reg(DR_REG_X12),
opnd_create_reg(DR_REG_D12));
test_instr_encoding(dc, OP_fcvtzu, instr);
}
static void
test_fcvtzu_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzu_vector(dc, opnd_create_reg(DR_REG_D7),
opnd_create_reg(DR_REG_D9), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector(dc, opnd_create_reg(DR_REG_Q1),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector(dc, opnd_create_reg(DR_REG_Q5),
opnd_create_reg(DR_REG_Q18), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar(dc, opnd_create_reg(DR_REG_S9),
opnd_create_reg(DR_REG_S10));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_D0));
test_instr_encoding(dc, OP_fcvtzu, instr);
}
static void
test_fcvtzu_scalar_fixed_gpr(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_W7),
opnd_create_reg(DR_REG_S8),
opnd_create_immed_int(4, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_X13),
opnd_create_reg(DR_REG_S21),
opnd_create_immed_int(16, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_W30),
opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_X12),
opnd_create_reg(DR_REG_D15),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
}
static void
test_fcvtzu_scalar_fixed(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S0),
opnd_create_reg(DR_REG_S1),
opnd_create_immed_int(1, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S2),
opnd_create_reg(DR_REG_S3),
opnd_create_immed_int(2, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S4),
opnd_create_reg(DR_REG_S5),
opnd_create_immed_int(4, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S6),
opnd_create_reg(DR_REG_S7),
opnd_create_immed_int(8, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S8),
opnd_create_reg(DR_REG_S9),
opnd_create_immed_int(16, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S10),
opnd_create_reg(DR_REG_S11),
opnd_create_immed_int(32, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S28),
opnd_create_reg(DR_REG_S29),
opnd_create_immed_int(21, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_S30),
opnd_create_reg(DR_REG_S31),
opnd_create_immed_int(31, OPSZ_5b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D0),
opnd_create_reg(DR_REG_D1),
opnd_create_immed_int(1, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D3),
opnd_create_immed_int(2, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D4),
opnd_create_reg(DR_REG_D5),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D6),
opnd_create_reg(DR_REG_D7),
opnd_create_immed_int(8, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D10),
opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D12),
opnd_create_reg(DR_REG_D13),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D28),
opnd_create_reg(DR_REG_D29),
opnd_create_immed_int(21, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_scalar_fixed(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D31),
opnd_create_immed_int(42, OPSZ_6b));
test_instr_encoding(dc, OP_fcvtzu, instr);
}
static void
test_fcvtzu_vector_fixed(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_immed_int(1, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_Q3),
opnd_create_immed_int(2, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q4), opnd_create_reg(DR_REG_Q5),
opnd_create_immed_int(4, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q6), opnd_create_reg(DR_REG_Q7),
opnd_create_immed_int(8, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q8), opnd_create_reg(DR_REG_Q9),
opnd_create_immed_int(16, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q10), opnd_create_reg(DR_REG_Q11),
opnd_create_immed_int(32, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q28), opnd_create_reg(DR_REG_Q29),
opnd_create_immed_int(21, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q30), opnd_create_reg(DR_REG_Q31),
opnd_create_immed_int(31, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q0), opnd_create_reg(DR_REG_Q1),
opnd_create_immed_int(1, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q2), opnd_create_reg(DR_REG_Q3),
opnd_create_immed_int(2, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q4), opnd_create_reg(DR_REG_Q5),
opnd_create_immed_int(4, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q6), opnd_create_reg(DR_REG_Q7),
opnd_create_immed_int(8, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q8), opnd_create_reg(DR_REG_Q9),
opnd_create_immed_int(16, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q10), opnd_create_reg(DR_REG_Q11),
opnd_create_immed_int(32, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q12), opnd_create_reg(DR_REG_Q13),
opnd_create_immed_int(64, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q28), opnd_create_reg(DR_REG_Q29),
opnd_create_immed_int(21, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_Q30), opnd_create_reg(DR_REG_Q31),
opnd_create_immed_int(42, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D0), opnd_create_reg(DR_REG_D1),
opnd_create_immed_int(1, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D2), opnd_create_reg(DR_REG_D3),
opnd_create_immed_int(2, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D4), opnd_create_reg(DR_REG_D5),
opnd_create_immed_int(4, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D6), opnd_create_reg(DR_REG_D7),
opnd_create_immed_int(8, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D8), opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(16, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D10), opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(32, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D28), opnd_create_reg(DR_REG_D29),
opnd_create_immed_int(21, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
instr = INSTR_CREATE_fcvtzu_vector_fixed(
dc, opnd_create_reg(DR_REG_D30), opnd_create_reg(DR_REG_D31),
opnd_create_immed_int(31, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_fcvtzu, instr);
}
static void
test_sli_vector(void *dc)
{
instr_t *instr;
for (uint shift_amount = 0; shift_amount <= 7; shift_amount++) {
instr = INSTR_CREATE_sli_vector(
dc, opnd_create_reg(Q_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]), OPND_CREATE_BYTE(),
opnd_create_immed_int(shift_amount, OPSZ_3b));
test_instr_encoding(dc, OP_sli, instr);
}
for (uint shift_amount = 0; shift_amount <= 15; shift_amount++) {
instr = INSTR_CREATE_sli_vector(
dc, opnd_create_reg(Q_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]), OPND_CREATE_HALF(),
opnd_create_immed_int(shift_amount, OPSZ_4b));
test_instr_encoding(dc, OP_sli, instr);
}
for (uint shift_amount = 0; shift_amount <= 31; shift_amount++) {
instr = INSTR_CREATE_sli_vector(
dc, opnd_create_reg(Q_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]),
OPND_CREATE_SINGLE(), opnd_create_immed_int(shift_amount, OPSZ_5b));
test_instr_encoding(dc, OP_sli, instr);
}
for (uint shift_amount = 0; shift_amount <= 63; shift_amount++) {
instr = INSTR_CREATE_sli_vector(
dc, opnd_create_reg(Q_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]),
OPND_CREATE_DOUBLE(), opnd_create_immed_int(shift_amount, OPSZ_6b));
test_instr_encoding(dc, OP_sli, instr);
}
}
static void
test_uqshrn_vector(void *dc)
{
instr_t *instr;
for (uint shift_amount = 1; shift_amount <= 8; shift_amount++) {
instr = INSTR_CREATE_uqshrn_vector(
dc, opnd_create_reg(D_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]), OPND_CREATE_HALF(),
opnd_create_immed_int(shift_amount, OPSZ_3b));
test_instr_encoding(dc, OP_uqshrn, instr);
}
for (uint shift_amount = 1; shift_amount <= 16; shift_amount++) {
instr = INSTR_CREATE_uqshrn_vector(
dc, opnd_create_reg(D_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]),
OPND_CREATE_SINGLE(), opnd_create_immed_int(shift_amount, OPSZ_4b));
test_instr_encoding(dc, OP_uqshrn, instr);
}
for (uint shift_amount = 1; shift_amount <= 32; shift_amount++) {
instr = INSTR_CREATE_uqshrn_vector(
dc, opnd_create_reg(D_registers[(2 * shift_amount - 1) % 30]),
opnd_create_reg(Q_registers[(2 * shift_amount - 2) % 30]),
OPND_CREATE_DOUBLE(), opnd_create_immed_int(shift_amount, OPSZ_5b));
test_instr_encoding(dc, OP_uqshrn, instr);
}
}
static void
test_ucvtf_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_ucvtf_scalar(dc, opnd_create_reg(DR_REG_S4),
opnd_create_reg(DR_REG_W9));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_W28));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar(dc, opnd_create_reg(DR_REG_S1),
opnd_create_reg(DR_REG_X21));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar(dc, opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_X2));
test_instr_encoding(dc, OP_ucvtf, instr);
}
static void
test_ucvtf_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_ucvtf_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D7), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q1), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar(dc, opnd_create_reg(DR_REG_S17),
opnd_create_reg(DR_REG_S20));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar(dc, opnd_create_reg(DR_REG_D14),
opnd_create_reg(DR_REG_D14));
test_instr_encoding(dc, OP_ucvtf, instr);
}
static void
test_ucvtf_scalar_fixed_gpr(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S5),
opnd_create_reg(DR_REG_W8),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S13),
opnd_create_reg(DR_REG_X7),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_W0),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_X11),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
}
static void
test_ucvtf_scalar_fixed(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S9),
opnd_create_reg(DR_REG_S8),
opnd_create_immed_int(1, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S21),
opnd_create_reg(DR_REG_S4),
opnd_create_immed_int(2, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S20),
opnd_create_reg(DR_REG_S19),
opnd_create_immed_int(4, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S6),
opnd_create_reg(DR_REG_S7),
opnd_create_immed_int(8, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S12),
opnd_create_reg(DR_REG_S30),
opnd_create_immed_int(16, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S18),
opnd_create_reg(DR_REG_S9),
opnd_create_immed_int(32, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S22),
opnd_create_reg(DR_REG_S21),
opnd_create_immed_int(21, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S11),
opnd_create_reg(DR_REG_S19),
opnd_create_immed_int(31, OPSZ_5b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(1, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D3),
opnd_create_immed_int(2, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D17),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(8, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D4),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D21),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D29),
opnd_create_immed_int(21, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
instr = INSTR_CREATE_ucvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D13),
opnd_create_immed_int(42, OPSZ_6b));
test_instr_encoding(dc, OP_ucvtf, instr);
}
static void
test_ucvtf_vector_fixed(void *dc)
{
instr_t *instr;
for (uint fbits = 1; fbits <= 32; fbits *= 2) {
instr = INSTR_CREATE_ucvtf_vector_fixed(
dc, opnd_create_reg(Q_registers[(fbits - 1) % 30]),
opnd_create_reg(Q_registers[(fbits - 1) % 30]),
opnd_create_immed_int(fbits, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ucvtf, instr);
}
for (uint fbits = 1; fbits <= 64; fbits *= 2) {
instr = INSTR_CREATE_ucvtf_vector_fixed(
dc, opnd_create_reg(Q_registers[(fbits - 1) % 30]),
opnd_create_reg(Q_registers[(fbits - 1) % 30]),
opnd_create_immed_int(fbits, OPSZ_6b), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_ucvtf, instr);
}
for (uint fbits = 1; fbits <= 32; fbits *= 2) {
instr = INSTR_CREATE_ucvtf_vector_fixed(
dc, opnd_create_reg(D_registers[(fbits - 1) % 30]),
opnd_create_reg(D_registers[(fbits - 1) % 30]),
opnd_create_immed_int(fbits, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_ucvtf, instr);
}
}
static void
test_scvtf_scalar(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_scvtf_scalar(dc, opnd_create_reg(DR_REG_S4),
opnd_create_reg(DR_REG_W9));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar(dc, opnd_create_reg(DR_REG_D11),
opnd_create_reg(DR_REG_W28));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar(dc, opnd_create_reg(DR_REG_S1),
opnd_create_reg(DR_REG_X21));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar(dc, opnd_create_reg(DR_REG_D3),
opnd_create_reg(DR_REG_X2));
test_instr_encoding(dc, OP_scvtf, instr);
}
static void
test_scvtf_vector(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_scvtf_vector(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D7), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_vector(dc, opnd_create_reg(DR_REG_Q12),
opnd_create_reg(DR_REG_Q24), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_vector(dc, opnd_create_reg(DR_REG_Q9),
opnd_create_reg(DR_REG_Q1), OPND_CREATE_DOUBLE());
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar(dc, opnd_create_reg(DR_REG_S17),
opnd_create_reg(DR_REG_S20));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar(dc, opnd_create_reg(DR_REG_D14),
opnd_create_reg(DR_REG_D14));
test_instr_encoding(dc, OP_scvtf, instr);
}
static void
test_scvtf_scalar_fixed_gpr(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S5),
opnd_create_reg(DR_REG_W8),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S13),
opnd_create_reg(DR_REG_X7),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_W0),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_X11),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
}
static void
test_scvtf_scalar_fixed(void *dc)
{
instr_t *instr;
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S9),
opnd_create_reg(DR_REG_S8),
opnd_create_immed_int(1, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S21),
opnd_create_reg(DR_REG_S4),
opnd_create_immed_int(2, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S20),
opnd_create_reg(DR_REG_S19),
opnd_create_immed_int(4, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S6),
opnd_create_reg(DR_REG_S7),
opnd_create_immed_int(8, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S12),
opnd_create_reg(DR_REG_S30),
opnd_create_immed_int(16, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S18),
opnd_create_reg(DR_REG_S9),
opnd_create_immed_int(32, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S22),
opnd_create_reg(DR_REG_S21),
opnd_create_immed_int(21, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_S11),
opnd_create_reg(DR_REG_S19),
opnd_create_immed_int(31, OPSZ_5b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D13),
opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(1, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D2),
opnd_create_reg(DR_REG_D3),
opnd_create_immed_int(2, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D19),
opnd_create_reg(DR_REG_D17),
opnd_create_immed_int(4, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D9),
opnd_create_immed_int(8, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D11),
opnd_create_immed_int(16, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D8),
opnd_create_reg(DR_REG_D4),
opnd_create_immed_int(32, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D29),
opnd_create_reg(DR_REG_D21),
opnd_create_immed_int(64, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D30),
opnd_create_reg(DR_REG_D29),
opnd_create_immed_int(21, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
instr = INSTR_CREATE_scvtf_scalar_fixed(dc, opnd_create_reg(DR_REG_D17),
opnd_create_reg(DR_REG_D13),
opnd_create_immed_int(42, OPSZ_6b));
test_instr_encoding(dc, OP_scvtf, instr);
}
static void
test_scvtf_vector_fixed(void *dc)
{
instr_t *instr;
for (uint fbits = 1; fbits <= 32; fbits *= 2) {
instr = INSTR_CREATE_scvtf_vector_fixed(
dc, opnd_create_reg(Q_registers[(fbits - 1) % 30]),
opnd_create_reg(Q_registers[(fbits - 1) % 30]),
opnd_create_immed_int(fbits, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_scvtf, instr);
}
for (uint fbits = 1; fbits <= 32; fbits *= 2) {
instr = INSTR_CREATE_scvtf_vector_fixed(
dc, opnd_create_reg(D_registers[(fbits - 1) % 30]),
opnd_create_reg(D_registers[(fbits - 1) % 30]),
opnd_create_immed_int(fbits, OPSZ_5b), OPND_CREATE_SINGLE());
test_instr_encoding(dc, OP_scvtf, instr);
}
}
* CCMP <Wn>, #<imm>, #<nzcv>, <cond>
* CCMP <Xn>, #<imm>, #<nzcv>, <cond>
* CCMN <Wn>, #<imm>, #<nzcv>, <cond>
* CCMN <Xn>, #<imm>, #<nzcv>, <cond>
*/
#define CCM_R_I(cmptype, reg) \
do { \
nzcv = 0; \
cond = 0; \
imm = 0; \
for (int rsrc = DR_REG_##reg##0; rsrc < DR_REG_##reg##SP; rsrc++) { \
instr = INSTR_CREATE_ccm##cmptype( \
dc, opnd_create_reg(rsrc), opnd_create_immed_int(imm++, OPSZ_5b), \
opnd_create_immed_int(nzcv++, OPSZ_4b), conds[cond++]); \
test_instr_encoding(dc, OP_ccm##cmptype, instr); \
imm = imm > 31 ? 0 : imm; \
nzcv = nzcv > 15 ? 0 : nzcv; \
cond = cond > 17 ? 0 : cond; \
} \
} while (0)
* CCMP <Wn>, <Wm>, #<nzcv>, <cond>
* CCMP <Xn>, <Xm>, #<nzcv>, <cond>
* CCMN <Wn>, <Wm>, #<nzcv>, <cond>
* CCMN <Xn>, <Xm>, #<nzcv>, <cond>
*/
#define CCM_R_R(cmptype, reg) \
do { \
nzcv = 0; \
cond = 0; \
rsrc1 = DR_REG_##reg##30; \
for (int rsrc0 = DR_REG_##reg##0; rsrc0 < DR_REG_##reg##SP; rsrc0++) { \
instr = INSTR_CREATE_ccm##cmptype( \
dc, opnd_create_reg(rsrc0), opnd_create_reg(rsrc1--), \
opnd_create_immed_int(nzcv++, OPSZ_4b), conds[cond++]); \
test_instr_encoding(dc, OP_ccm##cmptype, instr); \
nzcv = nzcv > 15 ? 0 : nzcv; \
cond = cond > 17 ? 0 : cond; \
} \
} while (0)
static void
test_ccmp_ccmn(void *dc)
{
instr_t *instr;
dr_pred_type_t conds[] = { DR_PRED_EQ, DR_PRED_NE, DR_PRED_CS, DR_PRED_CC, DR_PRED_MI,
DR_PRED_PL, DR_PRED_VS, DR_PRED_VC, DR_PRED_HI, DR_PRED_LS,
DR_PRED_GE, DR_PRED_LT, DR_PRED_GT, DR_PRED_LE, DR_PRED_AL,
DR_PRED_NV, DR_PRED_HS, DR_PRED_LO };
instr = INSTR_CREATE_ccmp(dc, opnd_create_reg(DR_REG_W28),
opnd_create_immed_int(10, OPSZ_5b),
opnd_create_immed_int(0b1010, OPSZ_4b), DR_PRED_GE);
test_instr_encoding(dc, OP_ccmp, instr);
int imm;
int nzcv;
int cond;
CCM_R_I(p, W);
instr = INSTR_CREATE_ccmp(dc, opnd_create_reg(DR_REG_X0),
opnd_create_immed_int(10, OPSZ_5b),
opnd_create_immed_int(0b1010, OPSZ_4b), DR_PRED_EQ);
test_instr_encoding(dc, OP_ccmp, instr);
CCM_R_I(p, X);
instr =
INSTR_CREATE_ccmp(dc, opnd_create_reg(DR_REG_W28), opnd_create_reg(DR_REG_W29),
opnd_create_immed_int(0b1010, OPSZ_4b), DR_PRED_GE);
test_instr_encoding(dc, OP_ccmp, instr);
int rsrc1;
CCM_R_R(p, W);
instr =
INSTR_CREATE_ccmp(dc, opnd_create_reg(DR_REG_X28), opnd_create_reg(DR_REG_X29),
opnd_create_immed_int(0b1010, OPSZ_4b), DR_PRED_GE);
test_instr_encoding(dc, OP_ccmp, instr);
CCM_R_R(p, X);
instr = INSTR_CREATE_ccmn(dc, opnd_create_reg(DR_REG_W0),
opnd_create_immed_int(0x1f, OPSZ_5b),
opnd_create_immed_int(0b0101, OPSZ_4b), DR_PRED_EQ);
test_instr_encoding(dc, OP_ccmn, instr);
CCM_R_I(n, W);
instr = INSTR_CREATE_ccmn(dc, opnd_create_reg(DR_REG_X15),
opnd_create_immed_int(0, OPSZ_5b),
opnd_create_immed_int(0b1001, OPSZ_4b), DR_PRED_LT);
test_instr_encoding(dc, OP_ccmn, instr);
CCM_R_I(n, X);
instr =
INSTR_CREATE_ccmn(dc, opnd_create_reg(DR_REG_W30), opnd_create_reg(DR_REG_W29),
opnd_create_immed_int(0b1010, OPSZ_4b), DR_PRED_VS);
test_instr_encoding(dc, OP_ccmn, instr);
CCM_R_R(n, W);
instr = INSTR_CREATE_ccmn(dc, opnd_create_reg(DR_REG_X9), opnd_create_reg(DR_REG_X10),
opnd_create_immed_int(0b1111, OPSZ_4b), DR_PRED_PL);
test_instr_encoding(dc, OP_ccmn, instr);
CCM_R_R(n, X);
}
static void
test_internal_encode(void *dcontext)
{
instr_t *label = INSTR_CREATE_label(dcontext);
* pull in those libraries. We know DR's used values are very high and that
* 7 is safe (and un-aligned to test i#5297).
*/
instr_set_note(label, (void *)(ptr_uint_t)7);
instr_t *jmp = INSTR_CREATE_b(dcontext, opnd_create_instr(label));
uint flags = instr_get_arith_flags(jmp, DR_QUERY_DEFAULT);
instr_destroy(dcontext, label);
instr_destroy(dcontext, jmp);
}
int
main(int argc, char *argv[])
{
#ifdef STANDALONE_DECODER
void *dcontext = GLOBAL_DCONTEXT;
#else
void *dcontext = dr_standalone_init();
#endif
test_extend(dcontext);
print("test_extend complete\n");
test_add(dcontext);
print("test_add complete\n");
test_ldar(dcontext);
print("test_ldar complete\n");
test_ldapr(dcontext);
print("test_ldapr complete\n");
test_ldur_stur(dcontext);
print("test_ldur_stur complete\n");
test_instrs_with_logic_imm(dcontext);
print("test_instrs_with_logic_imm complete\n");
test_fmov_general(dcontext);
print("test_fmov_general complete\n");
test_fmov_vector(dcontext);
print("test_fmov_vector complete\n");
test_fmov_scalar(dcontext);
print("test_fmov_scalar complete\n");
test_asimdsamefp16(dcontext);
print("test_asimdsamefp16 complete\n");
test_asimdsame(dcontext);
print("test_asimdsame complete\n");
test_asimd_mem(dcontext);
print("test_asimd_mem complete\n");
test_floatdp1(dcontext);
print("test_floatdp1 complete\n");
test_floatdp2(dcontext);
print("test_floatdp2 complete\n");
test_floatdp3(dcontext);
print("test_floatdp3 complete\n");
test_asimddiff(dcontext);
print("test_asimddiff complete\n");
test_sys_cache(dcontext);
print("test_sys_cache complete\n");
test_exclusive_memops(dcontext);
print("test_exclusive_memops complete\n");
test_xinst(dcontext);
print("test_xinst complete\n");
test_opnd(dcontext);
print("test_opnd complete\n");
#ifdef DR_FAST_IR
test_mov_instr_addr(dcontext);
#endif
print("test_mov_instr_addr complete\n");
test_fcvtas_scalar(dcontext);
print("test_fcvtas_scalar complete\n");
test_fcvtas_vector(dcontext);
print("test_fcvtas_vector complete\n");
test_fcvtns_scalar(dcontext);
print("test_fcvtns_scalar complete\n");
test_fcvtns_vector(dcontext);
print("test_fcvtns_vector complete\n");
test_fcvtps_scalar(dcontext);
print("test_fcvtps_scalar complete\n");
test_fcvtps_vector(dcontext);
print("test_fcvtps_vector complete\n");
test_fcvtpu_scalar(dcontext);
print("test_fcvtpu_scalar complete\n");
test_fcvtpu_vector(dcontext);
print("test_fcvtpu_vector complete\n");
test_fcvtzs_scalar(dcontext);
print("test_fcvtzs_scalar complete\n");
test_fcvtzs_vector(dcontext);
print("test_fcvtzs_vector complete\n");
test_fcvtzs_scalar_fixed_gpr(dcontext);
print("test_fcvtzs_scalar_fixed_gpr complete\n");
test_fcvtzs_scalar_fixed(dcontext);
print("test_fcvtzs_scalar_fixed complete\n");
test_fcvtzu_scalar(dcontext);
print("test_fcvtzu_scalar complete\n");
test_fcvtzu_vector(dcontext);
print("test_fcvtzu_vector complete\n");
test_fcvtzu_scalar_fixed_gpr(dcontext);
print("test_fcvtzu_scalar_fixed_gpr complete\n");
test_fcvtzu_scalar_fixed(dcontext);
print("test_fcvtzu_scalar_fixed complete\n");
test_fcvtzu_vector_fixed(dcontext);
print("test_fcvtzu_vector_fixed complete\n");
test_sli_vector(dcontext);
print("test_sli_vector_fixed complete\n");
test_uqshrn_vector(dcontext);
print("test_uqshrn_vector_fixed complete\n");
test_ucvtf_scalar(dcontext);
print("test_ucvtf_scalar complete\n");
test_ucvtf_vector(dcontext);
print("test_ucvtf_vector complete\n");
test_ucvtf_scalar_fixed_gpr(dcontext);
print("test_ucvtf_scalar_fixed_gpr complete\n");
test_ucvtf_scalar_fixed(dcontext);
print("test_ucvtf_scalar_fixed complete\n");
test_ucvtf_vector_fixed(dcontext);
print("test_ucvtf_vector_fixed complete\n");
test_scvtf_scalar(dcontext);
print("test_scvtf_scalar complete\n");
test_scvtf_vector(dcontext);
print("test_scvtf_vector complete\n");
test_scvtf_scalar_fixed_gpr(dcontext);
print("test_scvtf_scalar_fixed_gpr complete\n");
test_scvtf_scalar_fixed(dcontext);
print("test_scvtf_scalar_fixed complete\n");
test_scvtf_vector_fixed(dcontext);
print("test_scvtf_vector_fixed complete\n");
test_ccmp_ccmn(dcontext);
print("test_ccmp_ccmn complete\n");
ldr(dcontext);
str(dcontext);
#if 0
adr(dcontext);
adrp(dcontext);
#endif
ldpsw(dcontext);
ld2(dcontext);
ld3(dcontext);
ld4(dcontext);
ld2r(dcontext);
ld3r(dcontext);
ld4r(dcontext);
test_internal_encode(dcontext);
print("All tests complete\n");
#ifndef STANDALONE_DECODER
dr_standalone_exit();
#endif
return 0;
}