diff options
author | Zi Shen Lim <zlim.lnx@gmail.com> | 2014-08-27 05:15:26 +0100 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2014-09-08 14:39:20 +0100 |
commit | 546dd36b44613c770655531ee3ada6a9e9907d71 (patch) | |
tree | f1ae6369b410eb0825b0d59f4ff1e67303e64a3f /arch/arm64/kernel/insn.c | |
parent | 5fdc639a7a5b187f75b7408ee7ae9f9c06771218 (diff) | |
download | linux-stable-546dd36b44613c770655531ee3ada6a9e9907d71.tar.gz linux-stable-546dd36b44613c770655531ee3ada6a9e9907d71.tar.bz2 linux-stable-546dd36b44613c770655531ee3ada6a9e9907d71.zip |
arm64: introduce aarch64_insn_gen_data1()
Introduce function to generate data-processing (1 source) instructions.
Signed-off-by: Zi Shen Lim <zlim.lnx@gmail.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'arch/arm64/kernel/insn.c')
-rw-r--r-- | arch/arm64/kernel/insn.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c index d7a4dd48e959..81ef3b59348b 100644 --- a/arch/arm64/kernel/insn.c +++ b/arch/arm64/kernel/insn.c @@ -747,3 +747,40 @@ u32 aarch64_insn_gen_add_sub_shifted_reg(enum aarch64_insn_register dst, return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_6, insn, shift); } + +u32 aarch64_insn_gen_data1(enum aarch64_insn_register dst, + enum aarch64_insn_register src, + enum aarch64_insn_variant variant, + enum aarch64_insn_data1_type type) +{ + u32 insn; + + switch (type) { + case AARCH64_INSN_DATA1_REVERSE_16: + insn = aarch64_insn_get_rev16_value(); + break; + case AARCH64_INSN_DATA1_REVERSE_32: + insn = aarch64_insn_get_rev32_value(); + break; + case AARCH64_INSN_DATA1_REVERSE_64: + BUG_ON(variant != AARCH64_INSN_VARIANT_64BIT); + insn = aarch64_insn_get_rev64_value(); + break; + default: + BUG_ON(1); + } + + switch (variant) { + case AARCH64_INSN_VARIANT_32BIT: + break; + case AARCH64_INSN_VARIANT_64BIT: + insn |= AARCH64_INSN_SF_BIT; + break; + default: + BUG_ON(1); + } + + insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); + + return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); +} |