1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=csky -verify-machineinstrs -csky-no-aliases -no-integrated-as < %s \ 3; RUN: | FileCheck -check-prefix=CSKY %s 4 5@gi = external global i32 6@mi = external global i64 7 8define i32 @constraint_r(i32 %a) nounwind { 9; CSKY-LABEL: constraint_r: 10; CSKY: # %bb.0: 11; CSKY-NEXT: subi16 sp, sp, 4 12; CSKY-NEXT: lrw32 a1, [.LCPI0_0] 13; CSKY-NEXT: ld16.w a1, (a1, 0) 14; CSKY-NEXT: #APP 15; CSKY-NEXT: add a0, a0, a1 16; CSKY-NEXT: #NO_APP 17; CSKY-NEXT: addi16 sp, sp, 4 18; CSKY-NEXT: rts16 19; CSKY-NEXT: .p2align 1 20; CSKY-NEXT: # %bb.1: 21; CSKY-NEXT: .p2align 2 22; CSKY-NEXT: .LCPI0_0: 23; CSKY-NEXT: .long gi 24 %1 = load i32, ptr @gi 25 %2 = tail call i32 asm "add $0, $1, $2", "=r,r,r"(i32 %a, i32 %1) 26 ret i32 %2 27} 28 29define i64 @constraint_r_i64(i32 %a) nounwind { 30; CSKY-LABEL: constraint_r_i64: 31; CSKY: # %bb.0: 32; CSKY-NEXT: subi16 sp, sp, 4 33; CSKY-NEXT: lrw32 a3, [.LCPI1_0] 34; CSKY-NEXT: ld16.w a1, (a3, 0) 35; CSKY-NEXT: ld16.w a2, (a3, 4) 36; CSKY-NEXT: #APP 37; CSKY-NEXT: mula.s32 a1, a0, a0 38; CSKY-NEXT: #NO_APP 39; CSKY-NEXT: mov16 a0, a1 40; CSKY-NEXT: mov16 a1, a2 41; CSKY-NEXT: addi16 sp, sp, 4 42; CSKY-NEXT: rts16 43; CSKY-NEXT: .p2align 1 44; CSKY-NEXT: # %bb.1: 45; CSKY-NEXT: .p2align 2 46; CSKY-NEXT: .LCPI1_0: 47; CSKY-NEXT: .long mi 48 %1 = load i64, ptr @mi 49 %2 = call i64 asm "mula.s32 $0, $1, $2", "=r,r,r,0"(i32 %a, i32 %a, i64 %1) 50 ret i64 %2 51} 52 53define i32 @constraint_a(i32 %a) nounwind { 54; CSKY-LABEL: constraint_a: 55; CSKY: # %bb.0: 56; CSKY-NEXT: subi16 sp, sp, 4 57; CSKY-NEXT: lrw32 a1, [.LCPI2_0] 58; CSKY-NEXT: ld16.w a1, (a1, 0) 59; CSKY-NEXT: #APP 60; CSKY-NEXT: add a0, a0, a1 61; CSKY-NEXT: #NO_APP 62; CSKY-NEXT: addi16 sp, sp, 4 63; CSKY-NEXT: rts16 64; CSKY-NEXT: .p2align 1 65; CSKY-NEXT: # %bb.1: 66; CSKY-NEXT: .p2align 2 67; CSKY-NEXT: .LCPI2_0: 68; CSKY-NEXT: .long gi 69 %1 = load i32, ptr @gi 70 %2 = tail call i32 asm "add $0, $1, $2", "=a,a,a"(i32 %a, i32 %1) 71 ret i32 %2 72} 73 74define i32 @constraint_b(i32 %a) nounwind { 75; CSKY-LABEL: constraint_b: 76; CSKY: # %bb.0: 77; CSKY-NEXT: subi16 sp, sp, 4 78; CSKY-NEXT: lrw32 a1, [.LCPI3_0] 79; CSKY-NEXT: ld16.w a1, (a1, 0) 80; CSKY-NEXT: #APP 81; CSKY-NEXT: add a0, a0, a1 82; CSKY-NEXT: #NO_APP 83; CSKY-NEXT: addi16 sp, sp, 4 84; CSKY-NEXT: rts16 85; CSKY-NEXT: .p2align 1 86; CSKY-NEXT: # %bb.1: 87; CSKY-NEXT: .p2align 2 88; CSKY-NEXT: .LCPI3_0: 89; CSKY-NEXT: .long gi 90 %1 = load i32, ptr @gi 91 %2 = tail call i32 asm "add $0, $1, $2", "=b,b,b"(i32 %a, i32 %1) 92 ret i32 %2 93} 94 95define i32 @constraint_z(i32 %a) nounwind { 96; CSKY-LABEL: constraint_z: 97; CSKY: # %bb.0: 98; CSKY-NEXT: subi16 sp, sp, 4 99; CSKY-NEXT: mov16 sp, a0 100; CSKY-NEXT: lrw32 a0, [.LCPI4_0] 101; CSKY-NEXT: ld16.w a0, (a0, 0) 102; CSKY-NEXT: #APP 103; CSKY-NEXT: add a0, sp, a0 104; CSKY-NEXT: #NO_APP 105; CSKY-NEXT: addi16 sp, sp, 4 106; CSKY-NEXT: rts16 107; CSKY-NEXT: .p2align 1 108; CSKY-NEXT: # %bb.1: 109; CSKY-NEXT: .p2align 2 110; CSKY-NEXT: .LCPI4_0: 111; CSKY-NEXT: .long gi 112 %1 = load i32, ptr @gi 113 %2 = tail call i32 asm "add $0, $1, $2", "=r,z,r"(i32 %a, i32 %1) 114 ret i32 %2 115} 116 117define i32 @constraint_c(i32 %a, i32 %b) nounwind { 118; CSKY-LABEL: constraint_c: 119; CSKY: # %bb.0: 120; CSKY-NEXT: subi16 sp, sp, 4 121; CSKY-NEXT: lrw32 a1, [.LCPI5_0] 122; CSKY-NEXT: ld16.w a1, (a1, 0) 123; CSKY-NEXT: #APP 124; CSKY-NEXT: addc a0, a0, a1 125; CSKY-NEXT: #NO_APP 126; CSKY-NEXT: addi16 sp, sp, 4 127; CSKY-NEXT: rts16 128; CSKY-NEXT: .p2align 1 129; CSKY-NEXT: # %bb.1: 130; CSKY-NEXT: .p2align 2 131; CSKY-NEXT: .LCPI5_0: 132; CSKY-NEXT: .long gi 133 %1 = load i32, ptr @gi 134 %2 = tail call i32 asm "addc $0, $1, $2", "=r,r,r,~{c}"(i32 %a, i32 %1) 135 ret i32 %2 136} 137 138define i32 @constraint_i(i32 %a) nounwind { 139; CSKY-LABEL: constraint_i: 140; CSKY: # %bb.0: 141; CSKY-NEXT: subi16 sp, sp, 4 142; CSKY-NEXT: #APP 143; CSKY-NEXT: addi a0, a0, 113 144; CSKY-NEXT: #NO_APP 145; CSKY-NEXT: addi16 sp, sp, 4 146; CSKY-NEXT: rts16 147 148 %1 = load i32, ptr @gi 149 %2 = tail call i32 asm "addi $0, $1, $2", "=r,r,i"(i32 %a, i32 113) 150 ret i32 %2 151} 152 153define void @constraint_m(ptr %a) nounwind { 154; CSKY-LABEL: constraint_m: 155; CSKY: # %bb.0: 156; CSKY-NEXT: subi16 sp, sp, 4 157; CSKY-NEXT: #APP 158; CSKY-NEXT: #NO_APP 159; CSKY-NEXT: addi16 sp, sp, 4 160; CSKY-NEXT: rts16 161 162 call void asm sideeffect "", "=*m"(ptr elementtype(i32) %a) 163 ret void 164} 165 166define i32 @constraint_m2(ptr %a) nounwind { 167; CSKY-LABEL: constraint_m2: 168; CSKY: # %bb.0: 169; CSKY-NEXT: subi16 sp, sp, 4 170; CSKY-NEXT: #APP 171; CSKY-NEXT: ld.w a0, (a0, 0) 172; CSKY-NEXT: #NO_APP 173; CSKY-NEXT: addi16 sp, sp, 4 174; CSKY-NEXT: rts16 175 176 %1 = tail call i32 asm "ld.w $0, $1", "=r,*m"(ptr elementtype(i32) %a) 177 ret i32 %1 178} 179 180define i32 @modifier_i_imm(i32 %a) nounwind { 181; CSKY-LABEL: modifier_i_imm: 182; CSKY: # %bb.0: 183; CSKY-NEXT: subi16 sp, sp, 4 184; CSKY-NEXT: #APP 185; CSKY-NEXT: addi a0, a0, 1 186; CSKY-NEXT: #NO_APP 187; CSKY-NEXT: addi16 sp, sp, 4 188; CSKY-NEXT: rts16 189 %1 = tail call i32 asm "addi $0, $1, $2", "=r,r,ri"(i32 %a, i32 1) 190 ret i32 %1 191} 192 193define void @operand_global() nounwind { 194; CSKY-LABEL: operand_global: 195; CSKY: # %bb.0: 196; CSKY-NEXT: subi16 sp, sp, 4 197; CSKY-NEXT: #APP 198; CSKY-NEXT: .4byte gi 199; CSKY-NEXT: #NO_APP 200; CSKY-NEXT: addi16 sp, sp, 4 201; CSKY-NEXT: rts16 202 203 tail call void asm sideeffect ".4byte $0", "i"(ptr @gi) 204 ret void 205} 206 207define void @operand_block_address() nounwind { 208; CSKY-LABEL: operand_block_address: 209; CSKY: # %bb.0: 210; CSKY-NEXT: subi16 sp, sp, 4 211; CSKY-NEXT: #APP 212; CSKY-NEXT: br32 .Ltmp0 213; CSKY-NEXT: #NO_APP 214; CSKY-NEXT: .Ltmp0: # Block address taken 215; CSKY-NEXT: # %bb.1: # %bb 216; CSKY-NEXT: addi16 sp, sp, 4 217; CSKY-NEXT: rts16 218 219 call void asm sideeffect "br32 $0", "i"(ptr blockaddress(@operand_block_address, %bb)) 220 br label %bb 221bb: 222 ret void 223} 224 225; TODO: expand tests for more complex constraints, out of range immediates etc 226