https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93526
Bug ID: 93526
Summary: x86-64: %c cannot be used in asm for "i" constraint
operand and arbitrary constant value
Product: gcc
Version: 9.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: jbeulich at suse dot com
Target Milestone: ---
In
//#define VAL 0x7fffffffUL // works
//#define VAL 0x80000000 // works, but produces -0x80000000L
#define VAL 0x80000000U // works, but produces -0x80000000L
//#define VAL -0x80000000L // works
//#define VAL 0x80000000L
//#define VAL 0x80000000UL
//#define VAL 0xffff80000000UL
unsigned long ul = VAL;
void test(void) {
asm ( ".equ C1, %c0; .global C1" :: "i" (VAL) );
asm ( ".equ C2, %c0; .global C2" :: "n" (VAL) );
// these all work
asm ( ".equ C3, -%n0; .global C3" :: "i" (VAL) );
asm ( ".equ C4, %p0; .global C4" :: "i" (VAL) );
asm ( ".equ C5, %P0; .global C5" :: "i" (VAL) );
}
play with the various values for VAL. The ones not marked "works" will produce
"operand is not a condition code" errors. But even among the ones that work
there looks to be a signedness issue with the produced constants in some cases.
(I realize the 'n' modifier is not documented. Perhaps it should be, or else
consider it here just for completeness.)