205 lines · plain
1; RUN: llc < %s -mtriple=avr -mattr=movw -no-integrated-as | FileCheck %s2; XFAIL: *3 4; CHECK-LABEL: no_operands:5define void @no_operands() {6 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}7 call void asm sideeffect "add r24, r22", ""() nounwind8 ret void9}10 11; CHECK-LABEL: input_operand:12define void @input_operand(i8 %a) {13 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}14 call void asm sideeffect "add $0, $0", "r"(i8 %a) nounwind15 ret void16}17 18; CHECK-LABEL: simple_upper_regs:19define void @simple_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3,20 i8 %p4, i8 %p5, i8 %p6, i8 %p7) {21 ; 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]+}}22 call void asm sideeffect "some_instr $0, $1, $2, $3, $4, $5, $6, $7",23 "a,a,a,a,a,a,a,a" (i8 %p0, i8 %p1, i8 %p2, i8 %p3,24 i8 %p4, i8 %p5, i8 %p6, i8 %p7) nounwind25 ret void26}27 28; CHECK-LABEL: upper_regs:29define void @upper_regs(i8 %p0) {30 ; CHECK: some_instr {{r[0-9]+}}31 call void asm sideeffect "some_instr $0", "d" (i8 %p0) nounwind32 ret void33}34 35; CHECK-LABEL: lower_regs:36define void @lower_regs(i8 %p0) {37 ; CHECK: some_instr {{r[0-9]+}}38 call void asm sideeffect "some_instr $0", "l" (i8 %p0) nounwind39 ret void40}41 42; CHECK-LABEL: special_upper_regs:43define void @special_upper_regs(i8 %p0, i8 %p1, i8 %p2, i8 %p3) {44 ; CHECK: some_instr {{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}},{{r[0-9]+}}45 call void asm sideeffect "some_instr $0,$1,$2,$3", "w,w,w,w" (i8 %p0, i8 %p1, i8 %p2, i8 %p3) nounwind46 ret void47}48 49; CHECK-LABEL: xyz_reg:50define void @xyz_reg(i16 %var) {51 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}52 call void asm sideeffect "some_instr $0, $1, $2", "x,y,z" (i16 %var, i16 %var, i16 %var) nounwind53 ret void54}55 56;TODO57; How to use SP reg properly in inline asm??58; define void @sp_reg(i16 %var)59 60; CHECK-LABEL: ptr_reg:61define void @ptr_reg(i16 %var0, i16 %var1, i16 %var2) {62 ; CHECK: some_instr {{r[0-9]+}}, {{r[0-9]+}}, {{r[0-9]+}}63 call void asm sideeffect "some_instr $0, $1, $2", "e,e,e" (i16 %var0, i16 %var1, i16 %var2) nounwind64 ret void65}66 67; CHECK-LABEL: base_ptr_reg:68define void @base_ptr_reg(i16 %var0, i16 %var1) {69 ; CHECK: some_instr r28, r3070 call void asm sideeffect "some_instr $0, $1", "b,b" (i16 %var0, i16 %var1) nounwind71 ret void72}73 74; CHECK-LABEL: input_output_operand:75define i8 @input_output_operand(i8 %a, i8 %b) {76 ; CHECK: add {{r[0-9]+}}, {{r[0-9]+}}77 %1 = call i8 asm "add $0, $1", "=r,r"(i8 %a) nounwind78 ret i8 %179}80 81; CHECK-LABEL: temp_reg:82define void @temp_reg(i8 %a) {83 ; CHECK: some_instr {{r[0-9]+}}84 call void asm sideeffect "some_instr $0", "t" (i8 %a) nounwind85 ret void86}87 88; CHECK-LABEL: int_0_63:89define void @int_0_63() {90 ; CHECK: some_instr 591 call void asm sideeffect "some_instr $0", "I" (i8 5) nounwind92 ret void93}94 95; CHECK-LABEL: int_minus63_0:96define void @int_minus63_0() {97 ; CHECK: some_instr -598 call void asm sideeffect "some_instr $0", "J" (i8 -5) nounwind99 ret void100}101 102; CHECK-LABEL: int_2_2:103define void @int_2_2() {104 ; CHECK: some_instr 2105 call void asm sideeffect "some_instr $0", "K" (i8 2) nounwind106 ret void107}108 109; CHECK-LABEL: int_0_0:110define void @int_0_0() {111 ; CHECK: some_instr 0112 call void asm sideeffect "some_instr $0", "L" (i8 0) nounwind113 ret void114}115 116; CHECK-LABEL: int_0_255:117define void @int_0_255() {118 ; CHECK: some_instr 254119 call void asm sideeffect "some_instr $0", "M" (i8 254) nounwind120 ret void121}122 123; CHECK-LABEL: int_minus1_minus1:124define void @int_minus1_minus1() {125 ; CHECK: some_instr -1126 call void asm sideeffect "some_instr $0", "N" (i8 -1) nounwind127 ret void128}129 130; CHECK-LABEL: int_8_or_16_or_24:131define void @int_8_or_16_or_24() {132 ; CHECK: some_instr 8, 16, 24133 call void asm sideeffect "some_instr $0, $1, $2", "O,O,O" (i8 8, i8 16, i8 24) nounwind134 ret void135}136 137; CHECK-LABEL: int_1_1:138define void @int_1_1() {139 ; CHECK: some_instr 1140 call void asm sideeffect "some_instr $0", "P" (i8 1) nounwind141 ret void142}143 144; CHECK-LABEL: int_minus6_5:145define void @int_minus6_5() {146 ; CHECK: some_instr -6147 call void asm sideeffect "some_instr $0", "R" (i8 -6) nounwind148 ret void149}150 151; CHECK-LABEL: float_0_0:152define void @float_0_0() {153 ; CHECK: some_instr 0154 call void asm sideeffect "some_instr $0", "G" (float 0.0) nounwind155 ret void156}157 158 159; Memory constraint160 161@a = internal global i16 0, align 4162@b = internal global i16 0, align 4163 164; CHECK-LABEL: mem_global:165define void @mem_global() {166 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}167 call void asm "some_instr $0, $1", "=*Q,=*Q"(ptr @a, ptr @b)168 ret void169}170 171; CHECK-LABEL: mem_params:172define void @mem_params(ptr %a, ptr %b) {173 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}174 call void asm "some_instr $0, $1", "=*Q,=*Q"(ptr %a, ptr %b)175 ret void176}177 178; CHECK-LABEL: mem_local:179define void @mem_local() {180 %a = alloca i16181 %b = alloca i16182 ; CHECK: some_instr {{X|Y|Z}}+3, {{X|Y|Z}}+1183 call void asm "some_instr $0, $1", "=*Q,=*Q"(ptr %a, ptr %b)184 ret void185}186 187; CHECK-LABEL: mem_mixed:188define void @mem_mixed() {189 %a = alloca i16190 %b = alloca i16191 ; CHECK: some_instr {{X|Y|Z}}, {{X|Y|Z}}+3, {{X|Y|Z}}+1192 call void asm "some_instr $0, $1, $2", "=*Q,=*Q,=*Q"(ptr @a, ptr %a, ptr %b)193 ret void194}195 196; CHECK-LABEL: mem_gep:197define i8 @mem_gep(ptr %p) {198entry:199; CHECK: movw {{r[0-9]+}}, [[REG:r[0-9]+]]200 %arrayidx = getelementptr inbounds i8, ptr %p, i16 1201; CHECK: ld [[REG]], {{X|Y|Z}}+1202 %0 = tail call i8 asm sideeffect "ld $0, $1\0A\09", "=r,*Q"(ptr %arrayidx)203 ret i8 %0204}205