diff options
author | Zi Shen Lim <zlim.lnx@gmail.com> | 2014-08-27 00:15:29 -0400 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2014-09-08 09:39:21 -0400 |
commit | 5e6e15a2c4b529fd3cbf367b734842c4d8f6b0fa (patch) | |
tree | 97b01c00b6687c65335d693138dfd2803da3ded9 /arch/arm64/kernel | |
parent | 27f95ba59b34509dc8afa2f89ad51c044df9d7c7 (diff) |
arm64: introduce aarch64_insn_gen_logical_shifted_reg()
Introduce function to generate logical (shifted register)
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')
-rw-r--r-- | arch/arm64/kernel/insn.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c index f73a4bfbb946..0668ee5c5bf9 100644 --- a/arch/arm64/kernel/insn.c +++ b/arch/arm64/kernel/insn.c | |||
@@ -874,3 +874,63 @@ u32 aarch64_insn_gen_data3(enum aarch64_insn_register dst, | |||
874 | return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, | 874 | return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, |
875 | reg2); | 875 | reg2); |
876 | } | 876 | } |
877 | |||
878 | u32 aarch64_insn_gen_logical_shifted_reg(enum aarch64_insn_register dst, | ||
879 | enum aarch64_insn_register src, | ||
880 | enum aarch64_insn_register reg, | ||
881 | int shift, | ||
882 | enum aarch64_insn_variant variant, | ||
883 | enum aarch64_insn_logic_type type) | ||
884 | { | ||
885 | u32 insn; | ||
886 | |||
887 | switch (type) { | ||
888 | case AARCH64_INSN_LOGIC_AND: | ||
889 | insn = aarch64_insn_get_and_value(); | ||
890 | break; | ||
891 | case AARCH64_INSN_LOGIC_BIC: | ||
892 | insn = aarch64_insn_get_bic_value(); | ||
893 | break; | ||
894 | case AARCH64_INSN_LOGIC_ORR: | ||
895 | insn = aarch64_insn_get_orr_value(); | ||
896 | break; | ||
897 | case AARCH64_INSN_LOGIC_ORN: | ||
898 | insn = aarch64_insn_get_orn_value(); | ||
899 | break; | ||
900 | case AARCH64_INSN_LOGIC_EOR: | ||
901 | insn = aarch64_insn_get_eor_value(); | ||
902 | break; | ||
903 | case AARCH64_INSN_LOGIC_EON: | ||
904 | insn = aarch64_insn_get_eon_value(); | ||
905 | break; | ||
906 | case AARCH64_INSN_LOGIC_AND_SETFLAGS: | ||
907 | insn = aarch64_insn_get_ands_value(); | ||
908 | break; | ||
909 | case AARCH64_INSN_LOGIC_BIC_SETFLAGS: | ||
910 | insn = aarch64_insn_get_bics_value(); | ||
911 | break; | ||
912 | default: | ||
913 | BUG_ON(1); | ||
914 | } | ||
915 | |||
916 | switch (variant) { | ||
917 | case AARCH64_INSN_VARIANT_32BIT: | ||
918 | BUG_ON(shift & ~(SZ_32 - 1)); | ||
919 | break; | ||
920 | case AARCH64_INSN_VARIANT_64BIT: | ||
921 | insn |= AARCH64_INSN_SF_BIT; | ||
922 | BUG_ON(shift & ~(SZ_64 - 1)); | ||
923 | break; | ||
924 | default: | ||
925 | BUG_ON(1); | ||
926 | } | ||
927 | |||
928 | |||
929 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); | ||
930 | |||
931 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); | ||
932 | |||
933 | insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg); | ||
934 | |||
935 | return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_6, insn, shift); | ||
936 | } | ||