1*9880d681SAndroid Build Coastguard Worker; Positive test for inline register constraints 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -no-integrated-as -march=mipsel -relocation-model=pic < %s | \ 4*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck -check-prefixes=ALL,LE32,GAS %s 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -no-integrated-as -march=mips -relocation-model=pic < %s | \ 6*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck -check-prefixes=ALL,BE32,GAS %s 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; IAS might not print in the same way since it parses the assembly. 9*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -relocation-model=pic < %s | \ 10*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck -check-prefixes=ALL,LE32,IAS %s 11*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips -relocation-model=pic < %s | \ 12*9880d681SAndroid Build Coastguard Worker; RUN: FileCheck -check-prefixes=ALL,BE32,IAS %s 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker%union.u_tag = type { i64 } 15*9880d681SAndroid Build Coastguard Worker%struct.anon = type { i32, i32 } 16*9880d681SAndroid Build Coastguard Worker@uval = common global %union.u_tag zeroinitializer, align 8 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker; X with -3 19*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_X() nounwind { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_X: 22*9880d681SAndroid Build Coastguard Worker; ALL: #APP 23*9880d681SAndroid Build Coastguard Worker; GAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, 0xfffffffffffffffd 24*9880d681SAndroid Build Coastguard Worker; IAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3 25*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 26*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "addiu $0, $1, ${2:X}", "=r,r,I"(i32 7, i32 -3) ; 27*9880d681SAndroid Build Coastguard Worker ret i32 0 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; x with -3 31*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_x() nounwind { 32*9880d681SAndroid Build Coastguard Workerentry: 33*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_x: 34*9880d681SAndroid Build Coastguard Worker; ALL: #APP 35*9880d681SAndroid Build Coastguard Worker; GAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, 0xfffd 36*9880d681SAndroid Build Coastguard Worker; This is _also_ -3 because uimm16 values are silently coerced to simm16 when 37*9880d681SAndroid Build Coastguard Worker; it would otherwise fail to match. 38*9880d681SAndroid Build Coastguard Worker; IAS: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3 39*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 40*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "addiu $0, $1, ${2:x}", "=r,r,I"(i32 7, i32 -3) ; 41*9880d681SAndroid Build Coastguard Worker ret i32 0 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; d with -3 45*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_d() nounwind { 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_d: 48*9880d681SAndroid Build Coastguard Worker; ALL: #APP 49*9880d681SAndroid Build Coastguard Worker; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3 50*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 51*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "addiu $0, $1, ${2:d}", "=r,r,I"(i32 7, i32 -3) ; 52*9880d681SAndroid Build Coastguard Worker ret i32 0 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; m with -3 56*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_m() nounwind { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_m: 59*9880d681SAndroid Build Coastguard Worker; ALL: #APP 60*9880d681SAndroid Build Coastguard Worker; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, -4 61*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 62*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "addiu $0, $1, ${2:m}", "=r,r,I"(i32 7, i32 -3) ; 63*9880d681SAndroid Build Coastguard Worker ret i32 0 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker; z with -3 67*9880d681SAndroid Build Coastguard Workerdefine void @constraint_z_0() nounwind { 68*9880d681SAndroid Build Coastguard Workerentry: 69*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_z_0: 70*9880d681SAndroid Build Coastguard Worker; ALL: #APP 71*9880d681SAndroid Build Coastguard Worker; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, -3 72*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 73*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "addiu $0, $1, ${2:z}", "=r,r,I"(i32 7, i32 -3) ; 74*9880d681SAndroid Build Coastguard Worker ret void 75*9880d681SAndroid Build Coastguard Worker} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker; z with 0 78*9880d681SAndroid Build Coastguard Workerdefine void @constraint_z_1() nounwind { 79*9880d681SAndroid Build Coastguard Workerentry: 80*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_z_1: 81*9880d681SAndroid Build Coastguard Worker; ALL: #APP 82*9880d681SAndroid Build Coastguard Worker; GAS: addu ${{[0-9]+}}, ${{[0-9]+}}, $0 83*9880d681SAndroid Build Coastguard Worker; IAS: move ${{[0-9]+}}, ${{[0-9]+}} 84*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 85*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "addu $0, $1, ${2:z}", "=r,r,I"(i32 7, i32 0) nounwind 86*9880d681SAndroid Build Coastguard Worker ret void 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; z with non-zero and the "r"(register) and "J"(integer zero) constraints 90*9880d681SAndroid Build Coastguard Workerdefine void @constraint_z_2() nounwind { 91*9880d681SAndroid Build Coastguard Workerentry: 92*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_z_2: 93*9880d681SAndroid Build Coastguard Worker; ALL: #APP 94*9880d681SAndroid Build Coastguard Worker; ALL: mtc0 ${{[1-9][0-9]?}}, ${{[0-9]+}} 95*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 96*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "mtc0 ${0:z}, $$12", "Jr"(i32 7) nounwind 97*9880d681SAndroid Build Coastguard Worker ret void 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; z with zero and the "r"(register) and "J"(integer zero) constraints 101*9880d681SAndroid Build Coastguard Workerdefine void @constraint_z_3() nounwind { 102*9880d681SAndroid Build Coastguard Workerentry: 103*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_z_3: 104*9880d681SAndroid Build Coastguard Worker; ALL: #APP 105*9880d681SAndroid Build Coastguard Worker; GAS: mtc0 $0, ${{[0-9]+}} 106*9880d681SAndroid Build Coastguard Worker; IAS: mtc0 $zero, ${{[0-9]+}}, 0 107*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 108*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "mtc0 ${0:z}, $$12", "Jr"(i32 0) nounwind 109*9880d681SAndroid Build Coastguard Worker ret void 110*9880d681SAndroid Build Coastguard Worker} 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Worker; z with non-zero and just the "r"(register) constraint 113*9880d681SAndroid Build Coastguard Workerdefine void @constraint_z_4() nounwind { 114*9880d681SAndroid Build Coastguard Workerentry: 115*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_z_4: 116*9880d681SAndroid Build Coastguard Worker; ALL: #APP 117*9880d681SAndroid Build Coastguard Worker; ALL: mtc0 ${{[1-9][0-9]?}}, ${{[0-9]+}} 118*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 119*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "mtc0 ${0:z}, $$12", "r"(i32 7) nounwind 120*9880d681SAndroid Build Coastguard Worker ret void 121*9880d681SAndroid Build Coastguard Worker} 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker; z with zero and just the "r"(register) constraint 124*9880d681SAndroid Build Coastguard Workerdefine void @constraint_z_5() nounwind { 125*9880d681SAndroid Build Coastguard Workerentry: 126*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_z_5: 127*9880d681SAndroid Build Coastguard Worker; FIXME: Check for $0, instead of other registers. 128*9880d681SAndroid Build Coastguard Worker; We should be using $0 directly in this case, not real registers. 129*9880d681SAndroid Build Coastguard Worker; When the materialization of 0 gets fixed, this test will fail. 130*9880d681SAndroid Build Coastguard Worker; ALL: #APP 131*9880d681SAndroid Build Coastguard Worker; ALL: mtc0 ${{[1-9][0-9]?}}, ${{[0-9]+}} 132*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 133*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "mtc0 ${0:z}, $$12", "r"(i32 0) nounwind 134*9880d681SAndroid Build Coastguard Worker ret void 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; A long long in 32 bit mode (use to assert) 138*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_longlong() nounwind { 139*9880d681SAndroid Build Coastguard Workerentry: 140*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_longlong: 141*9880d681SAndroid Build Coastguard Worker; ALL: #APP 142*9880d681SAndroid Build Coastguard Worker; ALL: addiu ${{[0-9]+}}, ${{[0-9]+}}, 3 143*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 144*9880d681SAndroid Build Coastguard Worker tail call i64 asm sideeffect "addiu $0, $1, $2 \0A\09", "=r,r,X"(i64 1229801703532086340, i64 3) nounwind 145*9880d681SAndroid Build Coastguard Worker ret i32 0 146*9880d681SAndroid Build Coastguard Worker} 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Worker; In little endian the source reg will be 4 bytes into the long long 149*9880d681SAndroid Build Coastguard Worker; In big endian the source reg will also be 4 bytes into the long long 150*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_D() nounwind { 151*9880d681SAndroid Build Coastguard Workerentry: 152*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_D: 153*9880d681SAndroid Build Coastguard Worker; ALL: lw ${{[0-9]+}}, %got(uval)(${{[0-9,a-z]+}}) 154*9880d681SAndroid Build Coastguard Worker; ALL: lw $[[SECOND:[0-9]+]], 4(${{[0-9]+}}) 155*9880d681SAndroid Build Coastguard Worker; ALL: lw $[[FIRST:[0-9]+]], 0(${{[0-9]+}}) 156*9880d681SAndroid Build Coastguard Worker; ALL: #APP 157*9880d681SAndroid Build Coastguard Worker; LE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}} 158*9880d681SAndroid Build Coastguard Worker; BE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}} 159*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 160*9880d681SAndroid Build Coastguard Worker %bosco = load i64, i64* getelementptr inbounds (%union.u_tag, %union.u_tag* @uval, i32 0, i32 0), align 8 161*9880d681SAndroid Build Coastguard Worker %trunc1 = trunc i64 %bosco to i32 162*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "or $0, ${1:D}, $2", "=r,r,r"(i64 %bosco, i32 %trunc1) nounwind 163*9880d681SAndroid Build Coastguard Worker ret i32 0 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; In little endian the source reg will be 0 bytes into the long long 167*9880d681SAndroid Build Coastguard Worker; In big endian the source reg will be 4 bytes into the long long 168*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_L() nounwind { 169*9880d681SAndroid Build Coastguard Workerentry: 170*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_L: 171*9880d681SAndroid Build Coastguard Worker; ALL: lw ${{[0-9]+}}, %got(uval)(${{[0-9,a-z]+}}) 172*9880d681SAndroid Build Coastguard Worker; ALL: lw $[[SECOND:[0-9]+]], 4(${{[0-9]+}}) 173*9880d681SAndroid Build Coastguard Worker; ALL: lw $[[FIRST:[0-9]+]], 0(${{[0-9]+}}) 174*9880d681SAndroid Build Coastguard Worker; ALL: #APP 175*9880d681SAndroid Build Coastguard Worker; LE32: or ${{[0-9]+}}, $[[FIRST]], ${{[0-9]+}} 176*9880d681SAndroid Build Coastguard Worker; BE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}} 177*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 178*9880d681SAndroid Build Coastguard Worker %bosco = load i64, i64* getelementptr inbounds (%union.u_tag, %union.u_tag* @uval, i32 0, i32 0), align 8 179*9880d681SAndroid Build Coastguard Worker %trunc1 = trunc i64 %bosco to i32 180*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "or $0, ${1:L}, $2", "=r,r,r"(i64 %bosco, i32 %trunc1) nounwind 181*9880d681SAndroid Build Coastguard Worker ret i32 0 182*9880d681SAndroid Build Coastguard Worker} 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker; In little endian the source reg will be 4 bytes into the long long 185*9880d681SAndroid Build Coastguard Worker; In big endian the source reg will be 0 bytes into the long long 186*9880d681SAndroid Build Coastguard Workerdefine i32 @constraint_M() nounwind { 187*9880d681SAndroid Build Coastguard Workerentry: 188*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: constraint_M: 189*9880d681SAndroid Build Coastguard Worker; ALL: lw ${{[0-9]+}}, %got(uval)(${{[0-9,a-z]+}}) 190*9880d681SAndroid Build Coastguard Worker; ALL: lw $[[SECOND:[0-9]+]], 4(${{[0-9]+}}) 191*9880d681SAndroid Build Coastguard Worker; ALL: lw $[[FIRST:[0-9]+]], 0(${{[0-9]+}}) 192*9880d681SAndroid Build Coastguard Worker; ALL: #APP 193*9880d681SAndroid Build Coastguard Worker; LE32: or ${{[0-9]+}}, $[[SECOND]], ${{[0-9]+}} 194*9880d681SAndroid Build Coastguard Worker; BE32: or ${{[0-9]+}}, $[[FIRST]], ${{[0-9]+}} 195*9880d681SAndroid Build Coastguard Worker; ALL: #NO_APP 196*9880d681SAndroid Build Coastguard Worker %bosco = load i64, i64* getelementptr inbounds (%union.u_tag, %union.u_tag* @uval, i32 0, i32 0), align 8 197*9880d681SAndroid Build Coastguard Worker %trunc1 = trunc i64 %bosco to i32 198*9880d681SAndroid Build Coastguard Worker tail call i32 asm sideeffect "or $0, ${1:M}, $2", "=r,r,r"(i64 %bosco, i32 %trunc1) nounwind 199*9880d681SAndroid Build Coastguard Worker ret i32 0 200*9880d681SAndroid Build Coastguard Worker} 201