如果指令不在机器描述中,那么我怀疑它gcc
会发出代码。注1
如果编译器不支持它,您总是可以使用inline-assembler来获取指令。注意 2 由于您的内容非常少见/特定于机器,因此在源代码op-code
中获取它可能没有太多努力。gcc
特别是,有arch和tune/cpu标志。tune/cpu用于更具体的机器,但arch应该允许该架构中的所有机器。如果我理解的话,这op-code
似乎违反了这条规则。
对于gcc
4.6.2,似乎thumb2和cortex-r4是使用这些指令的提示,正如您在gcc
4.7.2 中所指出的,似乎添加了cortex-a15以使用这些指令。在gcc
4.7.2 中,thumb2.md文件不再有udiv
/ sdiv
。但是,它可能包含在其他地方;我不是 100% 熟悉所有的机器描述语言。似乎cortex-a7、cortex-a15和cortex-r5可以在 4.7.2 中启用这些指令。注3
这并不能直接回答问题,但确实提供了一些信息/路径来获得答案。您可以使用 编译模块-mcpu=cortex-r4
,尽管这可能会产生链接器问题。此外,int my_idiv(int a, int b) __attribute__ ((__target__ ("arch=cortexe-r4")));
您可以在其中基于每个功能指定代码生成器使用的机器描述。我自己没有使用过任何这些,但它们只是尝试的可能性。通常,您不想保留错误的机器,因为它可能会生成次优(并且可能是非法的)操作码。您将不得不进行实验,然后可能会提供真正的答案。
注 1:这是针对股票 gcc
4.6.2 和 4.7.2。不知道你的安卓编译器有没有补丁。
gcc-4.6.2/gcc/config/arm$ grep [ius]div *.md
arm.md: "...,sdiv,udiv,other"
cortex-r4.md:;; We guess that division of A/B using sdiv or udiv, on average,
cortex-r4.md:;; This gives a latency of nine for udiv and ten for sdiv.
cortex-r4.md:(define_insn_reservation "cortex_r4_udiv" 9
cortex-r4.md: (eq_attr "insn" "udiv"))
cortex-r4.md:(define_insn_reservation "cortex_r4_sdiv" 10
cortex-r4.md: (eq_attr "insn" "sdiv"))
thumb2.md: "sdiv%?\t%0, %1, %2"
thumb2.md: (set_attr "insn" "sdiv")]
thumb2.md:(define_insn "udivsi3"
thumb2.md: (udiv:SI (match_operand:SI 1 "s_register_operand" "r")
thumb2.md: "udiv%?\t%0, %1, %2"
thumb2.md: (set_attr "insn" "udiv")]
gcc-4.7.2/gcc/config/arm$ grep -i [ius]div *.md
arm.md: "...,sdiv,udiv,other"
arm.md: "TARGET_IDIV"
arm.md: "sdiv%?\t%0, %1, %2"
arm.md: (set_attr "insn" "sdiv")]
arm.md:(define_insn "udivsi3"
arm.md: (udiv:SI (match_operand:SI 1 "s_register_operand" "r")
arm.md: "TARGET_IDIV"
arm.md: "udiv%?\t%0, %1, %2"
arm.md: (set_attr "insn" "udiv")]
cortex-a15.md:(define_insn_reservation "cortex_a15_udiv" 9
cortex-a15.md: (eq_attr "insn" "udiv"))
cortex-a15.md:(define_insn_reservation "cortex_a15_sdiv" 10
cortex-a15.md: (eq_attr "insn" "sdiv"))
cortex-r4.md:;; We guess that division of A/B using sdiv or udiv, on average,
cortex-r4.md:;; This gives a latency of nine for udiv and ten for sdiv.
cortex-r4.md:(define_insn_reservation "cortex_r4_udiv" 9
cortex-r4.md: (eq_attr "insn" "udiv"))
cortex-r4.md:(define_insn_reservation "cortex_r4_sdiv" 10
cortex-r4.md: (eq_attr "insn" "sdiv"))
注意2:如果将选项传递给阻止使用指令的选项,请将预处理器视为汇编程序。例如,您可以使用where opcode is some token pasteed stringified register encode 宏输出。此外,您可以注释您的汇编程序以指定. 所以你可以暂时撒谎说你有一个cortex-r4等。gcc
gas
udiv/sdiv
asm(" .long <opcode>\n");
machine
注3:
gcc-4.7.2/gcc/config/arm$ grep -E 'TARGET_IDIV|arm_arch_arm_hwdiv|FL_ARM_DIV' *
arm.c:#define FL_ARM_DIV (1 << 23) /* Hardware divide (ARM mode). */
arm.c:int arm_arch_arm_hwdiv;
arm.c: arm_arch_arm_hwdiv = (insn_flags & FL_ARM_DIV) != 0;
arm-cores.def:ARM_CORE("cortex-a7", cortexa7, 7A, ... FL_ARM_DIV
arm-cores.def:ARM_CORE("cortex-a15", cortexa15, 7A, ... FL_ARM_DIV
arm-cores.def:ARM_CORE("cortex-r5", cortexr5, 7R, ... FL_ARM_DIV
arm.h: if (TARGET_IDIV) \
arm.h:#define TARGET_IDIV ((TARGET_ARM && arm_arch_arm_hwdiv) \
arm.h:extern int arm_arch_arm_hwdiv;
arm.md: "TARGET_IDIV"
arm.md: "TARGET_IDIV"