255 lines · plain
1; RUN: llc < %s -mtriple=bpfel -mcpu=v3 -verify-machineinstrs -show-mc-encoding | FileCheck %s2;3; Source:4; int test_load_add_32(int *p, int v) {5; return __sync_fetch_and_add(p, v);6; }7; int test_load_add_64(long *p, long v) {8; return __sync_fetch_and_add(p, v);9; }10; int test_load_sub_32(int *p, int v) {11; return __sync_fetch_and_sub(p, v);12; }13; int test_load_sub_64(long *p, long v) {14; return __sync_fetch_and_sub(p, v);15; }16; // from https://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html17; // __sync_lock_test_and_set() actually does atomic xchg and returns18; // old contents.19; int test_xchg_32(int *p, int v) {20; return __sync_lock_test_and_set(p, v);21; }22; int test_xchg_64(long *p, long v) {23; return __sync_lock_test_and_set(p, v);24; }25; int test_cas_32(int *p, int old, int new) {26; return __sync_val_compare_and_swap(p, old, new);27; }28; long test_cas_64(long *p, long old, long new) {29; return __sync_val_compare_and_swap(p, old, new);30; }31; int test_load_and_32(int *p, int v) {32; return __sync_fetch_and_and(p, v);33; }34; int test_load_and_64(long *p, long v) {35; return __sync_fetch_and_and(p, v);36; }37; int test_load_or_32(int *p, int v) {38; return __sync_fetch_and_or(p, v);39; }40; int test_load_or_64(long *p, long v) {41; return __sync_fetch_and_or(p, v);42; }43; int test_load_xor_32(int *p, int v) {44; return __sync_fetch_and_xor(p, v);45; }46; int test_load_xor_64(long *p, long v) {47; return __sync_fetch_and_xor(p, v);48; }49; int test_atomic_xor_32(int *p, int v) {50; __sync_fetch_and_xor(p, v);51; return 0;52; }53; int test_atomic_xor_64(long *p, long v) {54; __sync_fetch_and_xor(p, v);55; return 0;56; }57; int test_atomic_and_64(long *p, long v) {58; __sync_fetch_and_and(p, v);59; return 0;60; }61; int test_atomic_or_64(long *p, long v) {62; __sync_fetch_and_or(p, v);63; return 0;64; }65 66; CHECK-LABEL: test_load_add_3267; CHECK: w0 = w268; CHECK: w0 = atomic_fetch_add((u32 *)(r1 + 0), w0)69; CHECK: encoding: [0xc3,0x01,0x00,0x00,0x01,0x00,0x00,0x00]70define dso_local i32 @test_load_add_32(ptr nocapture %p, i32 %v) local_unnamed_addr {71entry:72 %0 = atomicrmw add ptr %p, i32 %v seq_cst73 ret i32 %074}75 76; CHECK-LABEL: test_load_add_6477; CHECK: r0 = r278; CHECK: r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)79; CHECK: encoding: [0xdb,0x01,0x00,0x00,0x01,0x00,0x00,0x00]80define dso_local i32 @test_load_add_64(ptr nocapture %p, i64 %v) local_unnamed_addr {81entry:82 %0 = atomicrmw add ptr %p, i64 %v seq_cst83 %conv = trunc i64 %0 to i3284 ret i32 %conv85}86 87; CHECK-LABEL: test_load_sub_3288; CHECK: w0 = w289; CHECK: w0 = -w090; CHECK: w0 = atomic_fetch_add((u32 *)(r1 + 0), w0)91; CHECK: encoding: [0xc3,0x01,0x00,0x00,0x01,0x00,0x00,0x00]92define dso_local i32 @test_load_sub_32(ptr nocapture %p, i32 %v) local_unnamed_addr {93entry:94 %0 = atomicrmw sub ptr %p, i32 %v seq_cst95 ret i32 %096}97 98; CHECK-LABEL: test_load_sub_6499; CHECK: r0 = r2100; CHECK: r0 = -r0101; CHECK: r0 = atomic_fetch_add((u64 *)(r1 + 0), r0)102; CHECK: encoding: [0xdb,0x01,0x00,0x00,0x01,0x00,0x00,0x00]103define dso_local i32 @test_load_sub_64(ptr nocapture %p, i64 %v) local_unnamed_addr {104entry:105 %0 = atomicrmw sub ptr %p, i64 %v seq_cst106 %conv = trunc i64 %0 to i32107 ret i32 %conv108}109 110; CHECK-LABEL: test_xchg_32111; CHECK: w0 = w2112; CHECK: w0 = xchg32_32(r1 + 0, w0)113; CHECK: encoding: [0xc3,0x01,0x00,0x00,0xe1,0x00,0x00,0x00]114define dso_local i32 @test_xchg_32(ptr nocapture %p, i32 %v) local_unnamed_addr {115entry:116 %0 = atomicrmw xchg ptr %p, i32 %v seq_cst117 ret i32 %0118}119 120; CHECK-LABEL: test_xchg_64121; CHECK: r0 = r2122; CHECK: r0 = xchg_64(r1 + 0, r0)123; CHECK: encoding: [0xdb,0x01,0x00,0x00,0xe1,0x00,0x00,0x00]124define dso_local i32 @test_xchg_64(ptr nocapture %p, i64 %v) local_unnamed_addr {125entry:126 %0 = atomicrmw xchg ptr %p, i64 %v seq_cst127 %conv = trunc i64 %0 to i32128 ret i32 %conv129}130 131; CHECK-LABEL: test_cas_32132; CHECK: w0 = w2133; CHECK: w0 = cmpxchg32_32(r1 + 0, w0, w3)134; CHECK: encoding: [0xc3,0x31,0x00,0x00,0xf1,0x00,0x00,0x00]135define dso_local i32 @test_cas_32(ptr nocapture %p, i32 %old, i32 %new) local_unnamed_addr {136entry:137 %0 = cmpxchg ptr %p, i32 %old, i32 %new seq_cst seq_cst138 %1 = extractvalue { i32, i1 } %0, 0139 ret i32 %1140}141 142; CHECK-LABEL: test_cas_64143; CHECK: r0 = r2144; CHECK: r0 = cmpxchg_64(r1 + 0, r0, r3)145; CHECK: encoding: [0xdb,0x31,0x00,0x00,0xf1,0x00,0x00,0x00]146define dso_local i64 @test_cas_64(ptr nocapture %p, i64 %old, i64 %new) local_unnamed_addr {147entry:148 %0 = cmpxchg ptr %p, i64 %old, i64 %new seq_cst seq_cst149 %1 = extractvalue { i64, i1 } %0, 0150 ret i64 %1151}152 153; CHECK-LABEL: test_load_and_32154; CHECK: w0 = w2155; CHECK: w0 = atomic_fetch_and((u32 *)(r1 + 0), w0)156; CHECK: encoding: [0xc3,0x01,0x00,0x00,0x51,0x00,0x00,0x00]157define dso_local i32 @test_load_and_32(ptr nocapture %p, i32 %v) local_unnamed_addr {158entry:159 %0 = atomicrmw and ptr %p, i32 %v seq_cst160 ret i32 %0161}162 163; CHECK-LABEL: test_load_and_64164; CHECK: r0 = r2165; CHECK: r0 = atomic_fetch_and((u64 *)(r1 + 0), r0)166; CHECK: encoding: [0xdb,0x01,0x00,0x00,0x51,0x00,0x00,0x00]167define dso_local i32 @test_load_and_64(ptr nocapture %p, i64 %v) local_unnamed_addr {168entry:169 %0 = atomicrmw and ptr %p, i64 %v seq_cst170 %conv = trunc i64 %0 to i32171 ret i32 %conv172}173 174; CHECK-LABEL: test_load_or_32175; CHECK: w0 = w2176; CHECK: w0 = atomic_fetch_or((u32 *)(r1 + 0), w0)177; CHECK: encoding: [0xc3,0x01,0x00,0x00,0x41,0x00,0x00,0x00]178define dso_local i32 @test_load_or_32(ptr nocapture %p, i32 %v) local_unnamed_addr {179entry:180 %0 = atomicrmw or ptr %p, i32 %v seq_cst181 ret i32 %0182}183 184; CHECK-LABEL: test_load_or_64185; CHECK: r0 = r2186; CHECK: r0 = atomic_fetch_or((u64 *)(r1 + 0), r0)187; CHECK: encoding: [0xdb,0x01,0x00,0x00,0x41,0x00,0x00,0x00]188define dso_local i32 @test_load_or_64(ptr nocapture %p, i64 %v) local_unnamed_addr {189entry:190 %0 = atomicrmw or ptr %p, i64 %v seq_cst191 %conv = trunc i64 %0 to i32192 ret i32 %conv193}194 195; CHECK-LABEL: test_load_xor_32196; CHECK: w0 = w2197; CHECK: w0 = atomic_fetch_xor((u32 *)(r1 + 0), w0)198; CHECK: encoding: [0xc3,0x01,0x00,0x00,0xa1,0x00,0x00,0x00]199define dso_local i32 @test_load_xor_32(ptr nocapture %p, i32 %v) local_unnamed_addr {200entry:201 %0 = atomicrmw xor ptr %p, i32 %v seq_cst202 ret i32 %0203}204 205; CHECK-LABEL: test_load_xor_64206; CHECK: r0 = r2207; CHECK: r0 = atomic_fetch_xor((u64 *)(r1 + 0), r0)208; CHECK: encoding: [0xdb,0x01,0x00,0x00,0xa1,0x00,0x00,0x00]209define dso_local i32 @test_load_xor_64(ptr nocapture %p, i64 %v) local_unnamed_addr {210entry:211 %0 = atomicrmw xor ptr %p, i64 %v seq_cst212 %conv = trunc i64 %0 to i32213 ret i32 %conv214}215 216; CHECK-LABEL: test_atomic_xor_32217; CHECK: w2 = atomic_fetch_xor((u32 *)(r1 + 0), w2)218; CHECK: encoding: [0xc3,0x21,0x00,0x00,0xa1,0x00,0x00,0x00]219; CHECK: w0 = 0220define dso_local i32 @test_atomic_xor_32(ptr nocapture %p, i32 %v) local_unnamed_addr {221entry:222 %0 = atomicrmw xor ptr %p, i32 %v seq_cst223 ret i32 0224}225 226; CHECK-LABEL: test_atomic_xor_64227; CHECK: atomic_fetch_xor((u64 *)(r1 + 0), r2)228; CHECK: encoding: [0xdb,0x21,0x00,0x00,0xa1,0x00,0x00,0x00]229; CHECK: w0 = 0230define dso_local i32 @test_atomic_xor_64(ptr nocapture %p, i64 %v) local_unnamed_addr {231entry:232 %0 = atomicrmw xor ptr %p, i64 %v seq_cst233 ret i32 0234}235 236; CHECK-LABEL: test_atomic_and_64237; CHECK: r2 = atomic_fetch_and((u64 *)(r1 + 0), r2)238; CHECK: encoding: [0xdb,0x21,0x00,0x00,0x51,0x00,0x00,0x00]239; CHECK: w0 = 0240define dso_local i32 @test_atomic_and_64(ptr nocapture %p, i64 %v) local_unnamed_addr {241entry:242 %0 = atomicrmw and ptr %p, i64 %v seq_cst243 ret i32 0244}245 246; CHECK-LABEL: test_atomic_or_64247; CHECK: r2 = atomic_fetch_or((u64 *)(r1 + 0), r2)248; CHECK: encoding: [0xdb,0x21,0x00,0x00,0x41,0x00,0x00,0x00]249; CHECK: w0 = 0250define dso_local i32 @test_atomic_or_64(ptr nocapture %p, i64 %v) local_unnamed_addr {251entry:252 %0 = atomicrmw or ptr %p, i64 %v seq_cst253 ret i32 0254}255