1; RUN: llc < %s -march=avr -mattr=movw | FileCheck %s 2 3; CHECK-LABEL: no_operands: 4define void @no_operands() { 5 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}} 6 call void asm sideeffect "add r24, r22", ""() nounwind 7 ret void 8} 9 10; CHECK-LABEL: input_operand: 11define void @input_operand(i8 %a) { 12 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}} 13 call void asm sideeffect "add $0, $0", "r"(i8 %a) nounwind 14 ret void 15} 16 17; CHECK-LABEL: simple_upper_regs: 18define void @simple_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3, 19 i8 %p4, i8 %p5, i8 %p6, i8 %p7) { 20 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} 21 call void asm sideeffect "some_instr $0, $1, $2, $3, $4, $5, $6, $7", 22 "a,a,a,a,a,a,a,a" (i8 %p0, i8 %p1, i8 %p2, i8 %p3, 23 i8 %p4, i8 %p5, i8 %p6, i8 %p7) nounwind 24 ret void 25} 26 27; CHECK-LABEL: upper_regs: 28define void @upper_regs(i8 %p0) { 29 ; CHECK: some_instr {{r[0-9]+}} 30 call void asm sideeffect "some_instr $0", "d" (i8 %p0) nounwind 31 ret void 32} 33 34; CHECK-LABEL: lower_regs: 35define void @lower_regs(i8 %p0) { 36 ; CHECK: some_instr {{r[0-9]+}} 37 call void asm sideeffect "some_instr $0", "l" (i8 %p0) nounwind 38 ret void 39} 40 41; CHECK-LABEL: special_upper_regs: 42define void @special_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3) { 43 ; CHECK: some_instr {{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}} 44 call void asm sideeffect "some_instr $0,$1,$2,$3", "w,w,w,w" (i8 %p0, i8 %p1, i8 %p2, i8 %p3) nounwind 45 ret void 46} 47 48; CHECK-LABEL: xyz_reg: 49define void @xyz_reg(i16 %var) { 50 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} 51 call void asm sideeffect "some_instr $0, $1, $2", "x,y,z" (i16 %var, i16 %var, i16 %var) nounwind 52 ret void 53} 54 55;TODO 56; How to use SP reg properly in inline asm?? 57; define void @sp_reg(i16 %var) 58 59; CHECK-LABEL: ptr_reg: 60define void @ptr_reg(i16 %var0, i16 %var1, i16 %var2) { 61 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}} 62 call void asm sideeffect "some_instr $0, $1, $2", "e,e,e" (i16 %var0, i16 %var1, i16 %var2) nounwind 63 ret void 64} 65 66; CHECK-LABEL: base_ptr_reg: 67define void @base_ptr_reg(i16 %var0, i16 %var1) { 68 ; CHECK: some_instr r28, r30 69 call void asm sideeffect "some_instr $0, $1", "b,b" (i16 %var0, i16 %var1) nounwind 70 ret void 71} 72 73; CHECK-LABEL: input_output_operand: 74define i8 @input_output_operand(i8 %a, i8 %b) { 75 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}} 76 %1 = call i8 asm "add $0, $1", "=r,r"(i8 %a) nounwind 77 ret i8 %1 78} 79 80; CHECK-LABEL: temp_reg: 81define void @temp_reg(i8 %a) { 82 ; CHECK: some_instr {{r[0-9]+}} 83 call void asm sideeffect "some_instr $0", "t" (i8 %a) nounwind 84 ret void 85} 86 87; CHECK-LABEL: int_0_63: 88define void @int_0_63() { 89 ; CHECK: some_instr 5 90 call void asm sideeffect "some_instr $0", "I" (i8 5) nounwind 91 ret void 92} 93 94; CHECK-LABEL: int_minus63_0: 95define void @int_minus63_0() { 96 ; CHECK: some_instr -5 97 call void asm sideeffect "some_instr $0", "J" (i8 -5) nounwind 98 ret void 99} 100 101; CHECK-LABEL: int_2_2: 102define void @int_2_2() { 103 ; CHECK: some_instr 2 104 call void asm sideeffect "some_instr $0", "K" (i8 2) nounwind 105 ret void 106} 107 108; CHECK-LABEL: int_0_0: 109define void @int_0_0() { 110 ; CHECK: some_instr 0 111 call void asm sideeffect "some_instr $0", "L" (i8 0) nounwind 112 ret void 113} 114 115; CHECK-LABEL: int_0_255: 116define void @int_0_255() { 117 ; CHECK: some_instr 254 118 call void asm sideeffect "some_instr $0", "M" (i8 254) nounwind 119 ret void 120} 121 122; CHECK-LABEL: int_minus1_minus1: 123define void @int_minus1_minus1() { 124 ; CHECK: some_instr -1 125 call void asm sideeffect "some_instr $0", "N" (i8 -1) nounwind 126 ret void 127} 128 129; CHECK-LABEL: int_8_or_16_or_24: 130define void @int_8_or_16_or_24() { 131 ; CHECK: some_instr 8, 16, 24 132 call void asm sideeffect "some_instr $0, $1, $2", "O,O,O" (i8 8, i8 16, i8 24) nounwind 133 ret void 134} 135 136; CHECK-LABEL: int_1_1: 137define void @int_1_1() { 138 ; CHECK: some_instr 1 139 call void asm sideeffect "some_instr $0", "P" (i8 1) nounwind 140 ret void 141} 142 143; CHECK-LABEL: int_minus6_5: 144define void @int_minus6_5() { 145 ; CHECK: some_instr -6 146 call void asm sideeffect "some_instr $0", "R" (i8 -6) nounwind 147 ret void 148} 149 150; CHECK-LABEL: float_0_0: 151define void @float_0_0() { 152 ; CHECK: some_instr 0 153 call void asm sideeffect "some_instr $0", "G" (float 0.0) nounwind 154 ret void 155} 156 157 158; Memory constraint 159 160@a = internal global i16 0, align 4 161@b = internal global i16 0, align 4 162 163; CHECK-LABEL: mem_global: 164define void @mem_global() { 165 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}} 166 call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* @a, i16* @b) 167 ret void 168} 169 170; CHECK-LABEL: mem_params: 171define void @mem_params(i16* %a, i16* %b) { 172 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}} 173 call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* %a, i16* %b) 174 ret void 175} 176 177; CHECK-LABEL: mem_local: 178define void @mem_local() { 179 %a = alloca i16 180 %b = alloca i16 181 ; CHECK: some_instr {{X|Y|Z}}+3, {{X|Y|Z}}+1 182 call void asm "some_instr $0, $1", "=*Q,=*Q"(i16* %a, i16* %b) 183 ret void 184} 185 186; CHECK-LABEL: mem_mixed: 187define void @mem_mixed() { 188 %a = alloca i16 189 %b = alloca i16 190 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}+3, {{X|Y|Z}}+1 191 call void asm "some_instr $0, $1, $2", "=*Q,=*Q,=*Q"(i16* @a, i16* %a, i16* %b) 192 ret void 193} 194 195; CHECK-LABEL: mem_gep: 196define i8 @mem_gep(i8* %p) { 197entry: 198; CHECK: movw {{r[0-9]+}}, [[REG:r[0-9]+]] 199 %arrayidx = getelementptr inbounds i8, i8* %p, i16 1 200; CHECK: ld [[REG]], {{X|Y|Z}}+1 201 %0 = tail call i8 asm sideeffect "ld $0, $1\0A\09", "=r,*Q"(i8* %arrayidx) 202 ret i8 %0 203} 204