340 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=hexagon < %s | FileCheck %s3 4define i8 @atomicrmw_usub_cond_i8(ptr %ptr, i8 %val) {5; CHECK-LABEL: atomicrmw_usub_cond_i8:6; CHECK: .cfi_startproc7; CHECK-NEXT: // %bb.0:8; CHECK-NEXT: {9; CHECK-NEXT: r0 = and(#24,asl(r0,#3))10; CHECK-NEXT: r3 = and(r0,#-4)11; CHECK-NEXT: r2 = #25512; CHECK-NEXT: r4 = and(r1,#255)13; CHECK-NEXT: }14; CHECK-NEXT: {15; CHECK-NEXT: r2 = asl(r2,r0)16; CHECK-NEXT: }17; CHECK-NEXT: {18; CHECK-NEXT: r5 = sub(#-1,r2)19; CHECK-NEXT: }20; CHECK-NEXT: .p2align 421; CHECK-NEXT: .LBB0_1: // %atomicrmw.start22; CHECK-NEXT: // =>This Inner Loop Header: Depth=123; CHECK-NEXT: {24; CHECK-NEXT: r6 = memw_locked(r3)25; CHECK-NEXT: }26; CHECK-NEXT: {27; CHECK-NEXT: r2 = lsr(r6,r0)28; CHECK-NEXT: r6 = and(r6,r5)29; CHECK-NEXT: }30; CHECK-NEXT: {31; CHECK-NEXT: r7 = and(r2,#255)32; CHECK-NEXT: }33; CHECK-NEXT: {34; CHECK-NEXT: p0 = cmp.gtu(r4,r7)35; CHECK-NEXT: if (p0.new) r7 = add(r2,#0)36; CHECK-NEXT: if (!p0.new) r7 = sub(r2,r1)37; CHECK-NEXT: }38; CHECK-NEXT: {39; CHECK-NEXT: r7 = and(r7,#255)40; CHECK-NEXT: }41; CHECK-NEXT: {42; CHECK-NEXT: r6 |= asl(r7,r0)43; CHECK-NEXT: }44; CHECK-NEXT: {45; CHECK-NEXT: memw_locked(r3,p0) = r646; CHECK-NEXT: }47; CHECK-NEXT: {48; CHECK-NEXT: if (!p0) jump:nt .LBB0_149; CHECK-NEXT: }50; CHECK-NEXT: // %bb.2: // %atomicrmw.end51; CHECK-NEXT: {52; CHECK-NEXT: r0 = r253; CHECK-NEXT: jumpr r3154; CHECK-NEXT: }55 %result = atomicrmw usub_cond ptr %ptr, i8 %val seq_cst56 ret i8 %result57}58 59define i16 @atomicrmw_usub_cond_i16(ptr %ptr, i16 %val) {60; CHECK-LABEL: atomicrmw_usub_cond_i16:61; CHECK: .cfi_startproc62; CHECK-NEXT: // %bb.0:63; CHECK-NEXT: {64; CHECK-NEXT: r0 = and(#24,asl(r0,#3))65; CHECK-NEXT: r3 = and(r0,#-4)66; CHECK-NEXT: r2 = ##6553567; CHECK-NEXT: }68; CHECK-NEXT: {69; CHECK-NEXT: r2 = asl(r2,r0)70; CHECK-NEXT: r4 = zxth(r1)71; CHECK-NEXT: }72; CHECK-NEXT: {73; CHECK-NEXT: r5 = sub(#-1,r2)74; CHECK-NEXT: }75; CHECK-NEXT: .p2align 476; CHECK-NEXT: .LBB1_1: // %atomicrmw.start77; CHECK-NEXT: // =>This Inner Loop Header: Depth=178; CHECK-NEXT: {79; CHECK-NEXT: r6 = memw_locked(r3)80; CHECK-NEXT: }81; CHECK-NEXT: {82; CHECK-NEXT: r2 = lsr(r6,r0)83; CHECK-NEXT: r6 = and(r6,r5)84; CHECK-NEXT: }85; CHECK-NEXT: {86; CHECK-NEXT: r7 = zxth(r2)87; CHECK-NEXT: }88; CHECK-NEXT: {89; CHECK-NEXT: p0 = cmp.gtu(r4,r7)90; CHECK-NEXT: if (p0.new) r7 = add(r2,#0)91; CHECK-NEXT: if (!p0.new) r7 = sub(r2,r1)92; CHECK-NEXT: }93; CHECK-NEXT: {94; CHECK-NEXT: r7 = zxth(r7)95; CHECK-NEXT: }96; CHECK-NEXT: {97; CHECK-NEXT: r6 |= asl(r7,r0)98; CHECK-NEXT: }99; CHECK-NEXT: {100; CHECK-NEXT: memw_locked(r3,p0) = r6101; CHECK-NEXT: }102; CHECK-NEXT: {103; CHECK-NEXT: if (!p0) jump:nt .LBB1_1104; CHECK-NEXT: }105; CHECK-NEXT: // %bb.2: // %atomicrmw.end106; CHECK-NEXT: {107; CHECK-NEXT: r0 = r2108; CHECK-NEXT: jumpr r31109; CHECK-NEXT: }110 %result = atomicrmw usub_cond ptr %ptr, i16 %val seq_cst111 ret i16 %result112}113 114define i32 @atomicrmw_usub_cond_i32(ptr %ptr, i32 %val) {115; CHECK-LABEL: atomicrmw_usub_cond_i32:116; CHECK: .cfi_startproc117; CHECK-NEXT: // %bb.0:118; CHECK-NEXT: .p2align 4119; CHECK-NEXT: .LBB2_1: // %atomicrmw.start120; CHECK-NEXT: // =>This Inner Loop Header: Depth=1121; CHECK-NEXT: {122; CHECK-NEXT: r2 = memw_locked(r0)123; CHECK-NEXT: }124; CHECK-NEXT: {125; CHECK-NEXT: p0 = cmp.gtu(r1,r2)126; CHECK-NEXT: if (p0.new) r3 = add(r2,#0)127; CHECK-NEXT: if (!p0.new) r3 = sub(r2,r1)128; CHECK-NEXT: }129; CHECK-NEXT: {130; CHECK-NEXT: memw_locked(r0,p0) = r3131; CHECK-NEXT: }132; CHECK-NEXT: {133; CHECK-NEXT: if (!p0) jump:nt .LBB2_1134; CHECK-NEXT: }135; CHECK-NEXT: // %bb.2: // %atomicrmw.end136; CHECK-NEXT: {137; CHECK-NEXT: r0 = r2138; CHECK-NEXT: jumpr r31139; CHECK-NEXT: }140 %result = atomicrmw usub_cond ptr %ptr, i32 %val seq_cst141 ret i32 %result142}143 144define i64 @atomicrmw_usub_cond_i64(ptr %ptr, i64 %val) {145; CHECK-LABEL: atomicrmw_usub_cond_i64:146; CHECK: .cfi_startproc147; CHECK-NEXT: // %bb.0:148; CHECK-NEXT: .p2align 4149; CHECK-NEXT: .LBB3_1: // %atomicrmw.start150; CHECK-NEXT: // =>This Inner Loop Header: Depth=1151; CHECK-NEXT: {152; CHECK-NEXT: r5:4 = memd_locked(r0)153; CHECK-NEXT: }154; CHECK-NEXT: {155; CHECK-NEXT: p0 = cmp.gtu(r3:2,r5:4)156; CHECK-NEXT: r7:6 = sub(r5:4,r3:2)157; CHECK-NEXT: }158; CHECK-NEXT: {159; CHECK-NEXT: r8 = mux(p0,r4,r6)160; CHECK-NEXT: r9 = mux(p0,r5,r7)161; CHECK-NEXT: }162; CHECK-NEXT: {163; CHECK-NEXT: memd_locked(r0,p0) = r9:8164; CHECK-NEXT: }165; CHECK-NEXT: {166; CHECK-NEXT: if (!p0) jump:nt .LBB3_1167; CHECK-NEXT: }168; CHECK-NEXT: // %bb.2: // %atomicrmw.end169; CHECK-NEXT: {170; CHECK-NEXT: r1:0 = combine(r5,r4)171; CHECK-NEXT: jumpr r31172; CHECK-NEXT: }173 %result = atomicrmw usub_cond ptr %ptr, i64 %val seq_cst174 ret i64 %result175}176 177define i8 @atomicrmw_usub_sat_i8(ptr %ptr, i8 %val) {178; CHECK-LABEL: atomicrmw_usub_sat_i8:179; CHECK: .cfi_startproc180; CHECK-NEXT: // %bb.0:181; CHECK-NEXT: {182; CHECK-NEXT: r0 = and(#24,asl(r0,#3))183; CHECK-NEXT: r2 = and(r0,#-4)184; CHECK-NEXT: r3 = #255185; CHECK-NEXT: r1 = and(r1,#255)186; CHECK-NEXT: }187; CHECK-NEXT: {188; CHECK-NEXT: r3 = asl(r3,r0)189; CHECK-NEXT: }190; CHECK-NEXT: {191; CHECK-NEXT: r3 = sub(#-1,r3)192; CHECK-NEXT: }193; CHECK-NEXT: .p2align 4194; CHECK-NEXT: .LBB4_1: // %atomicrmw.start195; CHECK-NEXT: // =>This Inner Loop Header: Depth=1196; CHECK-NEXT: {197; CHECK-NEXT: r5 = #255198; CHECK-NEXT: r4 = memw_locked(r2)199; CHECK-NEXT: }200; CHECK-NEXT: {201; CHECK-NEXT: r5 &= lsr(r4,r0)202; CHECK-NEXT: r6 = and(r4,r3)203; CHECK-NEXT: }204; CHECK-NEXT: {205; CHECK-NEXT: r5 = maxu(r5,r1)206; CHECK-NEXT: }207; CHECK-NEXT: {208; CHECK-NEXT: r5 = sub(r5,r1)209; CHECK-NEXT: }210; CHECK-NEXT: {211; CHECK-NEXT: r6 |= asl(r5,r0)212; CHECK-NEXT: }213; CHECK-NEXT: {214; CHECK-NEXT: memw_locked(r2,p0) = r6215; CHECK-NEXT: }216; CHECK-NEXT: {217; CHECK-NEXT: if (!p0) jump:nt .LBB4_1218; CHECK-NEXT: }219; CHECK-NEXT: // %bb.2: // %atomicrmw.end220; CHECK-NEXT: {221; CHECK-NEXT: r0 = lsr(r4,r0)222; CHECK-NEXT: jumpr r31223; CHECK-NEXT: }224 %result = atomicrmw usub_sat ptr %ptr, i8 %val seq_cst225 ret i8 %result226}227 228define i16 @atomicrmw_usub_sat_i16(ptr %ptr, i16 %val) {229; CHECK-LABEL: atomicrmw_usub_sat_i16:230; CHECK: .cfi_startproc231; CHECK-NEXT: // %bb.0:232; CHECK-NEXT: {233; CHECK-NEXT: r0 = and(#24,asl(r0,#3))234; CHECK-NEXT: r2 = and(r0,#-4)235; CHECK-NEXT: r3 = ##65535236; CHECK-NEXT: }237; CHECK-NEXT: {238; CHECK-NEXT: r3 = asl(r3,r0)239; CHECK-NEXT: r1 = zxth(r1)240; CHECK-NEXT: }241; CHECK-NEXT: {242; CHECK-NEXT: r3 = sub(#-1,r3)243; CHECK-NEXT: }244; CHECK-NEXT: .p2align 4245; CHECK-NEXT: .LBB5_1: // %atomicrmw.start246; CHECK-NEXT: // =>This Inner Loop Header: Depth=1247; CHECK-NEXT: {248; CHECK-NEXT: r5 = ##65535249; CHECK-NEXT: r4 = memw_locked(r2)250; CHECK-NEXT: }251; CHECK-NEXT: {252; CHECK-NEXT: r5 &= lsr(r4,r0)253; CHECK-NEXT: r6 = and(r4,r3)254; CHECK-NEXT: }255; CHECK-NEXT: {256; CHECK-NEXT: r5 = maxu(r5,r1)257; CHECK-NEXT: }258; CHECK-NEXT: {259; CHECK-NEXT: r5 = sub(r5,r1)260; CHECK-NEXT: }261; CHECK-NEXT: {262; CHECK-NEXT: r6 |= asl(r5,r0)263; CHECK-NEXT: }264; CHECK-NEXT: {265; CHECK-NEXT: memw_locked(r2,p0) = r6266; CHECK-NEXT: }267; CHECK-NEXT: {268; CHECK-NEXT: if (!p0) jump:nt .LBB5_1269; CHECK-NEXT: }270; CHECK-NEXT: // %bb.2: // %atomicrmw.end271; CHECK-NEXT: {272; CHECK-NEXT: r0 = lsr(r4,r0)273; CHECK-NEXT: jumpr r31274; CHECK-NEXT: }275 %result = atomicrmw usub_sat ptr %ptr, i16 %val seq_cst276 ret i16 %result277}278 279define i32 @atomicrmw_usub_sat_i32(ptr %ptr, i32 %val) {280; CHECK-LABEL: atomicrmw_usub_sat_i32:281; CHECK: .cfi_startproc282; CHECK-NEXT: // %bb.0:283; CHECK-NEXT: .p2align 4284; CHECK-NEXT: .LBB6_1: // %atomicrmw.start285; CHECK-NEXT: // =>This Inner Loop Header: Depth=1286; CHECK-NEXT: {287; CHECK-NEXT: r2 = memw_locked(r0)288; CHECK-NEXT: }289; CHECK-NEXT: {290; CHECK-NEXT: r3 = maxu(r2,r1)291; CHECK-NEXT: }292; CHECK-NEXT: {293; CHECK-NEXT: r3 = sub(r3,r1)294; CHECK-NEXT: }295; CHECK-NEXT: {296; CHECK-NEXT: memw_locked(r0,p0) = r3297; CHECK-NEXT: }298; CHECK-NEXT: {299; CHECK-NEXT: if (!p0) jump:nt .LBB6_1300; CHECK-NEXT: }301; CHECK-NEXT: // %bb.2: // %atomicrmw.end302; CHECK-NEXT: {303; CHECK-NEXT: r0 = r2304; CHECK-NEXT: jumpr r31305; CHECK-NEXT: }306 %result = atomicrmw usub_sat ptr %ptr, i32 %val seq_cst307 ret i32 %result308}309 310define i64 @atomicrmw_usub_sat_i64(ptr %ptr, i64 %val) {311; CHECK-LABEL: atomicrmw_usub_sat_i64:312; CHECK: .cfi_startproc313; CHECK-NEXT: // %bb.0:314; CHECK-NEXT: .p2align 4315; CHECK-NEXT: .LBB7_1: // %atomicrmw.start316; CHECK-NEXT: // =>This Inner Loop Header: Depth=1317; CHECK-NEXT: {318; CHECK-NEXT: r5:4 = memd_locked(r0)319; CHECK-NEXT: }320; CHECK-NEXT: {321; CHECK-NEXT: r7:6 = maxu(r5:4,r3:2)322; CHECK-NEXT: }323; CHECK-NEXT: {324; CHECK-NEXT: r7:6 = sub(r7:6,r3:2)325; CHECK-NEXT: }326; CHECK-NEXT: {327; CHECK-NEXT: memd_locked(r0,p0) = r7:6328; CHECK-NEXT: }329; CHECK-NEXT: {330; CHECK-NEXT: if (!p0) jump:nt .LBB7_1331; CHECK-NEXT: }332; CHECK-NEXT: // %bb.2: // %atomicrmw.end333; CHECK-NEXT: {334; CHECK-NEXT: r1:0 = combine(r5,r4)335; CHECK-NEXT: jumpr r31336; CHECK-NEXT: }337 %result = atomicrmw usub_sat ptr %ptr, i64 %val seq_cst338 ret i64 %result339}340