126 lines · plain
1; RUN: llc -mattr=avr6 < %s -mtriple=avr | FileCheck %s2 3; Tests atomic operations on AVR4 5; CHECK-LABEL: atomic_load86; CHECK: in r0, 637; CHECK-NEXT: cli8; CHECK-NEXT: ld [[RR:r[0-9]+]], [[RD:(X|Y|Z)]]9; CHECK-NEXT: out 63, r010define i8 @atomic_load8(ptr %foo) {11 %val = load atomic i8, ptr %foo unordered, align 112 ret i8 %val13}14 15; CHECK-LABEL: atomic_load_swap816; CHECK: call __sync_lock_test_and_set_117define i8 @atomic_load_swap8(ptr %foo) {18 %val = atomicrmw xchg ptr %foo, i8 13 seq_cst19 ret i8 %val20}21 22; CHECK-LABEL: atomic_load_cmp_swap823; CHECK: call __sync_val_compare_and_swap_124define i8 @atomic_load_cmp_swap8(ptr %foo) {25 %val = cmpxchg ptr %foo, i8 5, i8 10 acq_rel monotonic26 %value_loaded = extractvalue { i8, i1 } %val, 027 ret i8 %value_loaded28}29 30; CHECK-LABEL: atomic_load_add831; CHECK: in r0, 6332; CHECK-NEXT: cli33; CHECK-NEXT: ld [[RD:r[0-9]+]], [[RR:(X|Y|Z)]]34; CHECK-NEXT: add [[RR1:r[0-9]+]], [[RD]]35; CHECK-NEXT: st [[RR]], [[RR1]]36; CHECK-NEXT: out 63, r037define i8 @atomic_load_add8(ptr %foo) {38 %val = atomicrmw add ptr %foo, i8 13 seq_cst39 ret i8 %val40}41 42; CHECK-LABEL: atomic_load_sub843; CHECK: in r0, 6344; CHECK-NEXT: cli45; CHECK-NEXT: ld [[RD:r[0-9]+]], [[RR:(X|Y|Z)]]46; CHECK-NEXT: mov [[TMP:r[0-9]+]], [[RD]]47; CHECK-NEXT: sub [[TMP]], [[RR1:r[0-9]+]]48; CHECK-NEXT: st [[RR]], [[TMP]]49; CHECK-NEXT: out 63, r050define i8 @atomic_load_sub8(ptr %foo) {51 %val = atomicrmw sub ptr %foo, i8 13 seq_cst52 ret i8 %val53}54 55; CHECK-LABEL: atomic_load_and856; CHECK: in r0, 6357; CHECK-NEXT: cli58; CHECK-NEXT: ld [[RD:r[0-9]+]], [[RR:(X|Y|Z)]]59; CHECK-NEXT: and [[RR1:r[0-9]+]], [[RD]]60; CHECK-NEXT: st [[RR]], [[RR1]]61; CHECK-NEXT: out 63, r062define i8 @atomic_load_and8(ptr %foo) {63 %val = atomicrmw and ptr %foo, i8 13 seq_cst64 ret i8 %val65}66 67; CHECK-LABEL: atomic_load_or868; CHECK: in r0, 6369; CHECK-NEXT: cli70; CHECK-NEXT: ld [[RD:r[0-9]+]], [[RR:(X|Y|Z)]]71; CHECK-NEXT: or [[RR1:r[0-9]+]], [[RD]]72; CHECK-NEXT: st [[RR]], [[RR1]]73; CHECK-NEXT: out 63, r074define i8 @atomic_load_or8(ptr %foo) {75 %val = atomicrmw or ptr %foo, i8 13 seq_cst76 ret i8 %val77}78 79; CHECK-LABEL: atomic_load_xor880; CHECK: in r0, 6381; CHECK-NEXT: cli82; CHECK-NEXT: ld [[RD:r[0-9]+]], [[RR:(X|Y|Z)]]83; CHECK-NEXT: eor [[RR1:r[0-9]+]], [[RD]]84; CHECK-NEXT: st [[RR]], [[RR1]]85; CHECK-NEXT: out 63, r086define i8 @atomic_load_xor8(ptr %foo) {87 %val = atomicrmw xor ptr %foo, i8 13 seq_cst88 ret i8 %val89}90 91; CHECK-LABEL: atomic_load_nand892; CHECK: call __sync_fetch_and_nand_193define i8 @atomic_load_nand8(ptr %foo) {94 %val = atomicrmw nand ptr %foo, i8 13 seq_cst95 ret i8 %val96}97 98; CHECK-LABEL: atomic_load_max899; CHECK: call __sync_fetch_and_max_1100define i8 @atomic_load_max8(ptr %foo) {101 %val = atomicrmw max ptr %foo, i8 13 seq_cst102 ret i8 %val103}104 105; CHECK-LABEL: atomic_load_min8106; CHECK: call __sync_fetch_and_min_1107define i8 @atomic_load_min8(ptr %foo) {108 %val = atomicrmw min ptr %foo, i8 13 seq_cst109 ret i8 %val110}111 112; CHECK-LABEL: atomic_load_umax8113; CHECK: call __sync_fetch_and_umax_1114define i8 @atomic_load_umax8(ptr %foo) {115 %val = atomicrmw umax ptr %foo, i8 13 seq_cst116 ret i8 %val117}118 119; CHECK-LABEL: atomic_load_umin8120; CHECK: call __sync_fetch_and_umin_1121define i8 @atomic_load_umin8(ptr %foo) {122 %val = atomicrmw umin ptr %foo, i8 13 seq_cst123 ret i8 %val124}125 126