Next: Stack and Calling, Previous: Register Classes, Up: Target Macros
机器特定的约束可以使用这些宏来定义,来替代在Define Constraints中描述的机器描述结构。 这种机制已经被废弃;旧的port应该转换为新的机制。
对于起始于str,其起始字母为c的约束,返回其长度。 这允许你具有比单个字母更长的寄存器类别/常量/额外约束; 你不需要定义该宏,如果你只用单个字母的约束。 该宏的定义应该使用DEFAULT_CONSTRAINT_LEN,对于你不想特别处理的所有字符。 在genoutput.c中有一些合理性检查,用来为md文件检查约束的长度。
一个C表达式,其为寄存器类别定义了机器相关的操作数约束字母。 如果char为这样的字母,则值应该为对应的寄存器类别。否则, 值应该为
NO_REGS
。寄存器字母‘r’,对应于类别GENERAL_REGS
, 将不被传给该宏;你不需要处理它。
类似于
REG_CLASS_FROM_LETTER
,不过你还得到在str中传递的字符串, 所以你可以使用后缀来区别不同的变种。
一个C表达式,其定义了机器相关操作数约束字母(‘I’, ‘J’, ‘K’, ... ‘P’),指定了整数值的特定范围。如果c为那些字母中的, 则表达式应该检查value,一个整数,如果在合适的范围中则返回1,否则返回0。 如果c不是那些字母中的,则值应该为0,而不管value是多少。
类似
CONST_OK_FOR_LETTER_P
,但是你还得到在str中传递的字符串, 所以你可以使用后缀来区别不同的变种。
一个C表达式,定义了机器相关操作数约束字母, 指定了
const_double
值的特定范围(‘G’或‘H’)。如果c为那些字母中的,则表达式应该检查value, 一个代码为
const_double
的RTX,如果在合适的范围中则返回1,否则返回0。 如果c不是那些字母中的,则值应该为0,而不管value是多少。
const_double
用于所有的浮点常量和DImode
定点常量。 一个给定的字母可以接受一种或者这两种类型的值。 其可以使用GET_MODE
来区别这些类型。
类似
CONST_DOUBLE_OK_FOR_LETTER_P
,但是你还得到在str中传递的字符串, 所以你可以使用后缀来区别不同的变种。
一个C表达式,定义了可选的机器相关约束字母, 其可以用于为target机器隔离特定类型的操作数,通常为内存引用。 任何没有在其它地方定义并且不被
REG_CLASS_FROM_LETTER
/ REG_CLASS_FROM_CONSTRAINT匹配的字母都可以使用。 通常该宏将不被定义。如果对于特定的target机器需要该宏,则应该返回1, 如果value对应于由约束字母c表示的操作数类型。 如果c没有作为extra约束定义,则值应该为0,而不管value是多少。
例如,则ROMP上,加载指令不能将它们的输出放在r0中, 如果内存引用包含了一个符号地址。 约束字母‘Q’被定义来表示不包含符号地址的内存地址。 一个可选项使用‘Q’约束在输入上并且‘r’在输出上来指定。 下一个可选项指定了‘m’在输入上并且不包含r0的寄存器类别在输出上。
类似
EXTRA_CONSTRAINT
,但是你还得到在str中传递的字符串, 所以你可以使用后缀来区别不同的变种。
一个C表达式,定义了可选的机器相关约束字母, 在那些由
EXTRA_CONSTRAINT
接受的字母中, 其应该被重载过程作为内存约束来对待。其应该返回1,如果由str起始,并且第一个字母为c的约束所表示的操作数 类型所包含的所有内存引用为简单的基址寄存器。这允许重载过程来重载操作数, 如果其不直接对应于操作数类型c,通过将其地址复制到基址寄存器中。
例如,在S/390上,一些指令不接受任意的内存引用,只接受那些不使用索引寄存器的。 约束字母‘Q’被通过
EXTRA_CONSTRAINT
定义,来表示这种类型的内存地址。 如果字母‘Q’被标记为EXTRA_MEMORY_CONSTRAINT
, 则一个‘Q’常量可以处理任何内存操作数, 因为重载过程知道其可以通过将内存地址复制到基址寄存器中如果需要的话。 这类似于可以处理任何内存操作数的‘o’约束的方式。
一个C表达式,定义了可选的机器相关约束字母,在那些由
EXTRA_CONSTRAINT
/EXTRA_CONSTRAINT_STR
接受的字母中, 其应该被重载过程作为地址约束来对待。其应该返回1,如果由str起始,并且第一个字母为c的约束所表示的操作数 类型所包含的所有内存引用为简单的基址寄存器。这允许重载过程来重载操作数, 如果其不直接对应于操作数类型str,通过将其地址复制到基址寄存器中。
标记为
EXTRA_ADDRESS_CONSTRAINT
的约束只能与address_operand
断言 一起使用。其类似于‘p’约束。