1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=avr | FileCheck %s 3 4define void @add_r_i8(i8 signext %0, i8 signext %1) { 5; CHECK-LABEL: add_r_i8: 6; CHECK: ; %bb.0: 7; CHECK-NEXT: mov r20, r22 8; CHECK-NEXT: mov r22, r24 9; CHECK-NEXT: ;APP 10; CHECK-NEXT: mov r24, r22 11; CHECK-NEXT: add r24, r20 12; CHECK-NEXT: ;NO_APP 13; CHECK-NEXT: call foo8 14; CHECK-NEXT: ret 15 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=r,r,r"(i8 %0, i8 %1) 16 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 17 ret void 18} 19 20declare void @foo8(i8 signext, i8 signext, i8 signext) 21 22define void @add_r_i16(i16 signext %0, i16 signext %1) { 23; CHECK-LABEL: add_r_i16: 24; CHECK: ; %bb.0: 25; CHECK-NEXT: mov r20, r22 26; CHECK-NEXT: mov r21, r23 27; CHECK-NEXT: mov r22, r24 28; CHECK-NEXT: mov r23, r25 29; CHECK-NEXT: ;APP 30; CHECK-NEXT: mov r24, r22 31; CHECK-NEXT: mov r25, r23 32; CHECK-NEXT: add r24, r20 33; CHECK-NEXT: adc r25, r21 34; CHECK-NEXT: ;NO_APP 35; CHECK-NEXT: call foo16 36; CHECK-NEXT: ret 37 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=r,r,r"(i16 %0, i16 %1) 38 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 39 ret void 40} 41 42declare void @foo16(i16 signext, i16 signext, i16 signext) 43 44define void @add_a_i8(i8 signext %0, i8 signext %1) { 45; CHECK-LABEL: add_a_i8: 46; CHECK: ; %bb.0: 47; CHECK-NEXT: mov r20, r22 48; CHECK-NEXT: mov r22, r24 49; CHECK-NEXT: ;APP 50; CHECK-NEXT: mov r23, r22 51; CHECK-NEXT: add r23, r20 52; CHECK-NEXT: ;NO_APP 53; CHECK-NEXT: mov r24, r23 54; CHECK-NEXT: call foo8 55; CHECK-NEXT: ret 56 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=a,a,a"(i8 %0, i8 %1) 57 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 58 ret void 59} 60 61define void @add_a_i16(i16 signext %0, i16 signext %1) { 62; CHECK-LABEL: add_a_i16: 63; CHECK: ; %bb.0: 64; CHECK-NEXT: mov r20, r22 65; CHECK-NEXT: mov r21, r23 66; CHECK-NEXT: mov r22, r24 67; CHECK-NEXT: mov r23, r25 68; CHECK-NEXT: ;APP 69; CHECK-NEXT: mov r18, r22 70; CHECK-NEXT: mov r19, r23 71; CHECK-NEXT: add r18, r20 72; CHECK-NEXT: adc r19, r21 73; CHECK-NEXT: ;NO_APP 74; CHECK-NEXT: mov r24, r18 75; CHECK-NEXT: mov r25, r19 76; CHECK-NEXT: call foo16 77; CHECK-NEXT: ret 78 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=a,a,a"(i16 %0, i16 %1) 79 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 80 ret void 81} 82 83define void @add_d_i8(i8 signext %0, i8 signext %1) { 84; CHECK-LABEL: add_d_i8: 85; CHECK: ; %bb.0: 86; CHECK-NEXT: mov r20, r22 87; CHECK-NEXT: mov r22, r24 88; CHECK-NEXT: ;APP 89; CHECK-NEXT: mov r24, r22 90; CHECK-NEXT: add r24, r20 91; CHECK-NEXT: ;NO_APP 92; CHECK-NEXT: call foo8 93; CHECK-NEXT: ret 94 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=d,d,d"(i8 %0, i8 %1) 95 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 96 ret void 97} 98 99define void @add_d_i16(i16 signext %0, i16 signext %1) { 100; CHECK-LABEL: add_d_i16: 101; CHECK: ; %bb.0: 102; CHECK-NEXT: mov r20, r22 103; CHECK-NEXT: mov r21, r23 104; CHECK-NEXT: mov r22, r24 105; CHECK-NEXT: mov r23, r25 106; CHECK-NEXT: ;APP 107; CHECK-NEXT: mov r24, r22 108; CHECK-NEXT: mov r25, r23 109; CHECK-NEXT: add r24, r20 110; CHECK-NEXT: adc r25, r21 111; CHECK-NEXT: ;NO_APP 112; CHECK-NEXT: call foo16 113; CHECK-NEXT: ret 114 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=d,d,d"(i16 %0, i16 %1) 115 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 116 ret void 117} 118 119define void @add_l_i8(i8 signext %0, i8 signext %1) { 120; CHECK-LABEL: add_l_i8: 121; CHECK: ; %bb.0: 122; CHECK-NEXT: push r13 123; CHECK-NEXT: push r14 124; CHECK-NEXT: push r15 125; CHECK-NEXT: mov r15, r22 126; CHECK-NEXT: mov r14, r24 127; CHECK-NEXT: ;APP 128; CHECK-NEXT: mov r13, r14 129; CHECK-NEXT: add r13, r15 130; CHECK-NEXT: ;NO_APP 131; CHECK-NEXT: mov r24, r13 132; CHECK-NEXT: mov r22, r14 133; CHECK-NEXT: mov r20, r15 134; CHECK-NEXT: call foo8 135; CHECK-NEXT: pop r15 136; CHECK-NEXT: pop r14 137; CHECK-NEXT: pop r13 138; CHECK-NEXT: ret 139 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=l,l,l"(i8 %0, i8 %1) 140 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 141 ret void 142} 143 144define void @add_l_i16(i16 signext %0, i16 signext %1) { 145; CHECK-LABEL: add_l_i16: 146; CHECK: ; %bb.0: 147; CHECK-NEXT: push r10 148; CHECK-NEXT: push r11 149; CHECK-NEXT: push r12 150; CHECK-NEXT: push r13 151; CHECK-NEXT: push r14 152; CHECK-NEXT: push r15 153; CHECK-NEXT: mov r14, r22 154; CHECK-NEXT: mov r15, r23 155; CHECK-NEXT: mov r12, r24 156; CHECK-NEXT: mov r13, r25 157; CHECK-NEXT: ;APP 158; CHECK-NEXT: mov r10, r12 159; CHECK-NEXT: mov r11, r13 160; CHECK-NEXT: add r10, r14 161; CHECK-NEXT: adc r11, r15 162; CHECK-NEXT: ;NO_APP 163; CHECK-NEXT: mov r24, r10 164; CHECK-NEXT: mov r25, r11 165; CHECK-NEXT: mov r22, r12 166; CHECK-NEXT: mov r23, r13 167; CHECK-NEXT: mov r20, r14 168; CHECK-NEXT: mov r21, r15 169; CHECK-NEXT: call foo16 170; CHECK-NEXT: pop r15 171; CHECK-NEXT: pop r14 172; CHECK-NEXT: pop r13 173; CHECK-NEXT: pop r12 174; CHECK-NEXT: pop r11 175; CHECK-NEXT: pop r10 176; CHECK-NEXT: ret 177 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=l,l,l"(i16 %0, i16 %1) 178 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 179 ret void 180} 181 182define void @add_b_i8(i8 signext %0, i8 signext %1) { 183; CHECK-LABEL: add_b_i8: 184; CHECK: ; %bb.0: 185; CHECK-NEXT: mov r20, r22 186; CHECK-NEXT: mov r22, r24 187; CHECK-NEXT: mov r30, r22 188; CHECK-NEXT: ;APP 189; CHECK-NEXT: mov r30, r30 190; CHECK-NEXT: add r30, r20 191; CHECK-NEXT: ;NO_APP 192; CHECK-NEXT: mov r24, r30 193; CHECK-NEXT: call foo8 194; CHECK-NEXT: ret 195 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=b,b,r"(i8 %0, i8 %1) 196 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 197 ret void 198} 199 200define void @add_b_i16(i16 signext %0, i16 signext %1) { 201; CHECK-LABEL: add_b_i16: 202; CHECK: ; %bb.0: 203; CHECK-NEXT: mov r20, r22 204; CHECK-NEXT: mov r21, r23 205; CHECK-NEXT: mov r22, r24 206; CHECK-NEXT: mov r23, r25 207; CHECK-NEXT: mov r30, r22 208; CHECK-NEXT: mov r31, r23 209; CHECK-NEXT: ;APP 210; CHECK-NEXT: mov r30, r30 211; CHECK-NEXT: mov r31, r31 212; CHECK-NEXT: add r30, r20 213; CHECK-NEXT: adc r31, r21 214; CHECK-NEXT: ;NO_APP 215; CHECK-NEXT: mov r24, r30 216; CHECK-NEXT: mov r25, r31 217; CHECK-NEXT: call foo16 218; CHECK-NEXT: ret 219 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=b,b,r"(i16 %0, i16 %1) 220 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 221 ret void 222} 223 224define void @add_e_i8(i8 signext %0, i8 signext %1) { 225; CHECK-LABEL: add_e_i8: 226; CHECK: ; %bb.0: 227; CHECK-NEXT: mov r30, r22 228; CHECK-NEXT: mov r22, r24 229; CHECK-NEXT: mov r26, r22 230; CHECK-NEXT: mov r27, r23 231; CHECK-NEXT: ;APP 232; CHECK-NEXT: mov r26, r26 233; CHECK-NEXT: add r26, r30 234; CHECK-NEXT: ;NO_APP 235; CHECK-NEXT: mov r24, r26 236; CHECK-NEXT: ; kill: def $r22 killed $r22 killed $r23r22 237; CHECK-NEXT: mov r20, r30 238; CHECK-NEXT: call foo8 239; CHECK-NEXT: ret 240 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=e,e,e"(i8 %0, i8 %1) 241 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 242 ret void 243} 244 245define void @add_e_i16(i16 signext %0, i16 signext %1) { 246; CHECK-LABEL: add_e_i16: 247; CHECK: ; %bb.0: 248; CHECK-NEXT: mov r30, r22 249; CHECK-NEXT: mov r31, r23 250; CHECK-NEXT: mov r22, r24 251; CHECK-NEXT: mov r23, r25 252; CHECK-NEXT: mov r26, r22 253; CHECK-NEXT: mov r27, r23 254; CHECK-NEXT: ;APP 255; CHECK-NEXT: mov r26, r26 256; CHECK-NEXT: mov r27, r27 257; CHECK-NEXT: add r26, r30 258; CHECK-NEXT: adc r27, r31 259; CHECK-NEXT: ;NO_APP 260; CHECK-NEXT: mov r24, r26 261; CHECK-NEXT: mov r25, r27 262; CHECK-NEXT: mov r20, r30 263; CHECK-NEXT: mov r21, r31 264; CHECK-NEXT: call foo16 265; CHECK-NEXT: ret 266 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=e,e,e"(i16 %0, i16 %1) 267 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 268 ret void 269} 270 271define void @add_t_i8(i8 signext %0, i8 signext %1) { 272; CHECK-LABEL: add_t_i8: 273; CHECK: ; %bb.0: 274; CHECK-NEXT: mov r20, r22 275; CHECK-NEXT: mov r22, r24 276; CHECK-NEXT: ;APP 277; CHECK-NEXT: mov r0, r22 278; CHECK-NEXT: add r0, r20 279; CHECK-NEXT: ;NO_APP 280; CHECK-NEXT: mov r24, r0 281; CHECK-NEXT: call foo8 282; CHECK-NEXT: ret 283 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=t,r,r"(i8 %0, i8 %1) 284 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 285 ret void 286} 287 288define void @add_w_i8(i8 signext %0, i8 signext %1) { 289; CHECK-LABEL: add_w_i8: 290; CHECK: ; %bb.0: 291; CHECK-NEXT: mov r26, r22 292; CHECK-NEXT: mov r30, r24 293; CHECK-NEXT: ;APP 294; CHECK-NEXT: mov r24, r30 295; CHECK-NEXT: add r24, r26 296; CHECK-NEXT: ;NO_APP 297; CHECK-NEXT: ; kill: def $r24 killed $r24 killed $r25r24 298; CHECK-NEXT: mov r22, r30 299; CHECK-NEXT: mov r20, r26 300; CHECK-NEXT: call foo8 301; CHECK-NEXT: ret 302 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=w,w,w"(i8 %0, i8 %1) 303 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 304 ret void 305} 306 307define void @add_w_i16(i16 signext %0, i16 signext %1) { 308; CHECK-LABEL: add_w_i16: 309; CHECK: ; %bb.0: 310; CHECK-NEXT: mov r26, r22 311; CHECK-NEXT: mov r27, r23 312; CHECK-NEXT: mov r30, r24 313; CHECK-NEXT: mov r31, r25 314; CHECK-NEXT: ;APP 315; CHECK-NEXT: mov r24, r30 316; CHECK-NEXT: mov r25, r31 317; CHECK-NEXT: add r24, r26 318; CHECK-NEXT: adc r25, r27 319; CHECK-NEXT: ;NO_APP 320; CHECK-NEXT: mov r22, r30 321; CHECK-NEXT: mov r23, r31 322; CHECK-NEXT: mov r20, r26 323; CHECK-NEXT: mov r21, r27 324; CHECK-NEXT: call foo16 325; CHECK-NEXT: ret 326 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=w,w,w"(i16 %0, i16 %1) 327 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 328 ret void 329} 330 331define void @add_xyz_i8(i8 signext %0, i8 signext %1) { 332; CHECK-LABEL: add_xyz_i8: 333; CHECK: ; %bb.0: 334; CHECK-NEXT: push r28 335; CHECK-NEXT: push r29 336; CHECK-NEXT: mov r20, r22 337; CHECK-NEXT: mov r22, r24 338; CHECK-NEXT: mov r28, r22 339; CHECK-NEXT: mov r29, r23 340; CHECK-NEXT: mov r26, r20 341; CHECK-NEXT: mov r27, r21 342; CHECK-NEXT: ;APP 343; CHECK-NEXT: mov r30, r28 344; CHECK-NEXT: add r30, r26 345; CHECK-NEXT: ;NO_APP 346; CHECK-NEXT: mov r24, r30 347; CHECK-NEXT: mov r25, r31 348; CHECK-NEXT: ; kill: def $r24 killed $r24 killed $r25r24 349; CHECK-NEXT: ; kill: def $r22 killed $r22 killed $r23r22 350; CHECK-NEXT: ; kill: def $r20 killed $r20 killed $r21r20 351; CHECK-NEXT: call foo8 352; CHECK-NEXT: pop r29 353; CHECK-NEXT: pop r28 354; CHECK-NEXT: ret 355 %3 = tail call i8 asm sideeffect "mov $0, $1\0Aadd $0, $2", "=z,y,x"(i8 %0, i8 %1) 356 tail call void @foo8(i8 signext %3, i8 signext %0, i8 signext %1) 357 ret void 358} 359 360define void @add_xyz_i16(i16 signext %0, i16 signext %1) { 361; CHECK-LABEL: add_xyz_i16: 362; CHECK: ; %bb.0: 363; CHECK-NEXT: push r28 364; CHECK-NEXT: push r29 365; CHECK-NEXT: mov r20, r22 366; CHECK-NEXT: mov r21, r23 367; CHECK-NEXT: mov r22, r24 368; CHECK-NEXT: mov r23, r25 369; CHECK-NEXT: mov r28, r22 370; CHECK-NEXT: mov r29, r23 371; CHECK-NEXT: mov r26, r20 372; CHECK-NEXT: mov r27, r21 373; CHECK-NEXT: ;APP 374; CHECK-NEXT: mov r30, r28 375; CHECK-NEXT: mov r31, r29 376; CHECK-NEXT: add r30, r26 377; CHECK-NEXT: adc r31, r27 378; CHECK-NEXT: ;NO_APP 379; CHECK-NEXT: mov r24, r30 380; CHECK-NEXT: mov r25, r31 381; CHECK-NEXT: call foo16 382; CHECK-NEXT: pop r29 383; CHECK-NEXT: pop r28 384; CHECK-NEXT: ret 385 %3 = tail call i16 asm sideeffect "mov ${0:A}, ${1:A}\0Amov ${0:B}, ${1:B}\0Aadd ${0:A}, ${2:A}\0Aadc ${0:B}, ${2:B}", "=z,y,x"(i16 %0, i16 %1) 386 tail call void @foo16(i16 signext %3, i16 signext %0, i16 signext %1) 387 ret void 388} 389