364 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=wasm32-unknown-unknown < %s | FileCheck -check-prefix=WASM32 %s3; RUN: llc -mtriple=wasm64-unknown-unknown < %s | FileCheck -check-prefix=WASM64 %s4 5define i8 @atomicrmw_usub_cond_i8(ptr %ptr, i8 %val) {6; WASM32-LABEL: atomicrmw_usub_cond_i8:7; WASM32: .functype atomicrmw_usub_cond_i8 (i32, i32) -> (i32)8; WASM32-NEXT: .local i329; WASM32-NEXT: # %bb.0:10; WASM32-NEXT: local.get 011; WASM32-NEXT: local.get 012; WASM32-NEXT: i32.load8_u 013; WASM32-NEXT: local.tee 214; WASM32-NEXT: local.get 115; WASM32-NEXT: i32.sub16; WASM32-NEXT: local.get 217; WASM32-NEXT: local.get 218; WASM32-NEXT: local.get 119; WASM32-NEXT: i32.const 25520; WASM32-NEXT: i32.and21; WASM32-NEXT: i32.ge_u22; WASM32-NEXT: i32.select23; WASM32-NEXT: i32.store8 024; WASM32-NEXT: local.get 225; WASM32-NEXT: # fallthrough-return26;27; WASM64-LABEL: atomicrmw_usub_cond_i8:28; WASM64: .functype atomicrmw_usub_cond_i8 (i64, i32) -> (i32)29; WASM64-NEXT: .local i3230; WASM64-NEXT: # %bb.0:31; WASM64-NEXT: local.get 032; WASM64-NEXT: local.get 033; WASM64-NEXT: i32.load8_u 034; WASM64-NEXT: local.tee 235; WASM64-NEXT: local.get 136; WASM64-NEXT: i32.sub37; WASM64-NEXT: local.get 238; WASM64-NEXT: local.get 239; WASM64-NEXT: local.get 140; WASM64-NEXT: i32.const 25541; WASM64-NEXT: i32.and42; WASM64-NEXT: i32.ge_u43; WASM64-NEXT: i32.select44; WASM64-NEXT: i32.store8 045; WASM64-NEXT: local.get 246; WASM64-NEXT: # fallthrough-return47 %result = atomicrmw usub_cond ptr %ptr, i8 %val seq_cst48 ret i8 %result49}50 51define i16 @atomicrmw_usub_cond_i16(ptr %ptr, i16 %val) {52; WASM32-LABEL: atomicrmw_usub_cond_i16:53; WASM32: .functype atomicrmw_usub_cond_i16 (i32, i32) -> (i32)54; WASM32-NEXT: .local i3255; WASM32-NEXT: # %bb.0:56; WASM32-NEXT: local.get 057; WASM32-NEXT: local.get 058; WASM32-NEXT: i32.load16_u 059; WASM32-NEXT: local.tee 260; WASM32-NEXT: local.get 161; WASM32-NEXT: i32.sub62; WASM32-NEXT: local.get 263; WASM32-NEXT: local.get 264; WASM32-NEXT: local.get 165; WASM32-NEXT: i32.const 6553566; WASM32-NEXT: i32.and67; WASM32-NEXT: i32.ge_u68; WASM32-NEXT: i32.select69; WASM32-NEXT: i32.store16 070; WASM32-NEXT: local.get 271; WASM32-NEXT: # fallthrough-return72;73; WASM64-LABEL: atomicrmw_usub_cond_i16:74; WASM64: .functype atomicrmw_usub_cond_i16 (i64, i32) -> (i32)75; WASM64-NEXT: .local i3276; WASM64-NEXT: # %bb.0:77; WASM64-NEXT: local.get 078; WASM64-NEXT: local.get 079; WASM64-NEXT: i32.load16_u 080; WASM64-NEXT: local.tee 281; WASM64-NEXT: local.get 182; WASM64-NEXT: i32.sub83; WASM64-NEXT: local.get 284; WASM64-NEXT: local.get 285; WASM64-NEXT: local.get 186; WASM64-NEXT: i32.const 6553587; WASM64-NEXT: i32.and88; WASM64-NEXT: i32.ge_u89; WASM64-NEXT: i32.select90; WASM64-NEXT: i32.store16 091; WASM64-NEXT: local.get 292; WASM64-NEXT: # fallthrough-return93 %result = atomicrmw usub_cond ptr %ptr, i16 %val seq_cst94 ret i16 %result95}96 97define i32 @atomicrmw_usub_cond_i32(ptr %ptr, i32 %val) {98; WASM32-LABEL: atomicrmw_usub_cond_i32:99; WASM32: .functype atomicrmw_usub_cond_i32 (i32, i32) -> (i32)100; WASM32-NEXT: .local i32101; WASM32-NEXT: # %bb.0:102; WASM32-NEXT: local.get 0103; WASM32-NEXT: local.get 0104; WASM32-NEXT: i32.load 0105; WASM32-NEXT: local.tee 2106; WASM32-NEXT: local.get 1107; WASM32-NEXT: i32.sub108; WASM32-NEXT: local.get 2109; WASM32-NEXT: local.get 2110; WASM32-NEXT: local.get 1111; WASM32-NEXT: i32.ge_u112; WASM32-NEXT: i32.select113; WASM32-NEXT: i32.store 0114; WASM32-NEXT: local.get 2115; WASM32-NEXT: # fallthrough-return116;117; WASM64-LABEL: atomicrmw_usub_cond_i32:118; WASM64: .functype atomicrmw_usub_cond_i32 (i64, i32) -> (i32)119; WASM64-NEXT: .local i32120; WASM64-NEXT: # %bb.0:121; WASM64-NEXT: local.get 0122; WASM64-NEXT: local.get 0123; WASM64-NEXT: i32.load 0124; WASM64-NEXT: local.tee 2125; WASM64-NEXT: local.get 1126; WASM64-NEXT: i32.sub127; WASM64-NEXT: local.get 2128; WASM64-NEXT: local.get 2129; WASM64-NEXT: local.get 1130; WASM64-NEXT: i32.ge_u131; WASM64-NEXT: i32.select132; WASM64-NEXT: i32.store 0133; WASM64-NEXT: local.get 2134; WASM64-NEXT: # fallthrough-return135 %result = atomicrmw usub_cond ptr %ptr, i32 %val seq_cst136 ret i32 %result137}138 139define i64 @atomicrmw_usub_cond_i64(ptr %ptr, i64 %val) {140; WASM32-LABEL: atomicrmw_usub_cond_i64:141; WASM32: .functype atomicrmw_usub_cond_i64 (i32, i64) -> (i64)142; WASM32-NEXT: .local i64143; WASM32-NEXT: # %bb.0:144; WASM32-NEXT: local.get 0145; WASM32-NEXT: local.get 0146; WASM32-NEXT: i64.load 0147; WASM32-NEXT: local.tee 2148; WASM32-NEXT: local.get 1149; WASM32-NEXT: i64.sub150; WASM32-NEXT: local.get 2151; WASM32-NEXT: local.get 2152; WASM32-NEXT: local.get 1153; WASM32-NEXT: i64.ge_u154; WASM32-NEXT: i64.select155; WASM32-NEXT: i64.store 0156; WASM32-NEXT: local.get 2157; WASM32-NEXT: # fallthrough-return158;159; WASM64-LABEL: atomicrmw_usub_cond_i64:160; WASM64: .functype atomicrmw_usub_cond_i64 (i64, i64) -> (i64)161; WASM64-NEXT: .local i64162; WASM64-NEXT: # %bb.0:163; WASM64-NEXT: local.get 0164; WASM64-NEXT: local.get 0165; WASM64-NEXT: i64.load 0166; WASM64-NEXT: local.tee 2167; WASM64-NEXT: local.get 1168; WASM64-NEXT: i64.sub169; WASM64-NEXT: local.get 2170; WASM64-NEXT: local.get 2171; WASM64-NEXT: local.get 1172; WASM64-NEXT: i64.ge_u173; WASM64-NEXT: i64.select174; WASM64-NEXT: i64.store 0175; WASM64-NEXT: local.get 2176; WASM64-NEXT: # fallthrough-return177 %result = atomicrmw usub_cond ptr %ptr, i64 %val seq_cst178 ret i64 %result179}180 181define i8 @atomicrmw_usub_sat_i8(ptr %ptr, i8 %val) {182; WASM32-LABEL: atomicrmw_usub_sat_i8:183; WASM32: .functype atomicrmw_usub_sat_i8 (i32, i32) -> (i32)184; WASM32-NEXT: .local i32185; WASM32-NEXT: # %bb.0:186; WASM32-NEXT: local.get 0187; WASM32-NEXT: i32.const 0188; WASM32-NEXT: local.get 0189; WASM32-NEXT: i32.load8_u 0190; WASM32-NEXT: local.tee 2191; WASM32-NEXT: local.get 1192; WASM32-NEXT: i32.const 255193; WASM32-NEXT: i32.and194; WASM32-NEXT: i32.sub195; WASM32-NEXT: local.tee 1196; WASM32-NEXT: local.get 1197; WASM32-NEXT: local.get 2198; WASM32-NEXT: i32.gt_u199; WASM32-NEXT: i32.select200; WASM32-NEXT: i32.store8 0201; WASM32-NEXT: local.get 2202; WASM32-NEXT: # fallthrough-return203;204; WASM64-LABEL: atomicrmw_usub_sat_i8:205; WASM64: .functype atomicrmw_usub_sat_i8 (i64, i32) -> (i32)206; WASM64-NEXT: .local i32207; WASM64-NEXT: # %bb.0:208; WASM64-NEXT: local.get 0209; WASM64-NEXT: i32.const 0210; WASM64-NEXT: local.get 0211; WASM64-NEXT: i32.load8_u 0212; WASM64-NEXT: local.tee 2213; WASM64-NEXT: local.get 1214; WASM64-NEXT: i32.const 255215; WASM64-NEXT: i32.and216; WASM64-NEXT: i32.sub217; WASM64-NEXT: local.tee 1218; WASM64-NEXT: local.get 1219; WASM64-NEXT: local.get 2220; WASM64-NEXT: i32.gt_u221; WASM64-NEXT: i32.select222; WASM64-NEXT: i32.store8 0223; WASM64-NEXT: local.get 2224; WASM64-NEXT: # fallthrough-return225 %result = atomicrmw usub_sat ptr %ptr, i8 %val seq_cst226 ret i8 %result227}228 229define i16 @atomicrmw_usub_sat_i16(ptr %ptr, i16 %val) {230; WASM32-LABEL: atomicrmw_usub_sat_i16:231; WASM32: .functype atomicrmw_usub_sat_i16 (i32, i32) -> (i32)232; WASM32-NEXT: .local i32233; WASM32-NEXT: # %bb.0:234; WASM32-NEXT: local.get 0235; WASM32-NEXT: i32.const 0236; WASM32-NEXT: local.get 0237; WASM32-NEXT: i32.load16_u 0238; WASM32-NEXT: local.tee 2239; WASM32-NEXT: local.get 1240; WASM32-NEXT: i32.const 65535241; WASM32-NEXT: i32.and242; WASM32-NEXT: i32.sub243; WASM32-NEXT: local.tee 1244; WASM32-NEXT: local.get 1245; WASM32-NEXT: local.get 2246; WASM32-NEXT: i32.gt_u247; WASM32-NEXT: i32.select248; WASM32-NEXT: i32.store16 0249; WASM32-NEXT: local.get 2250; WASM32-NEXT: # fallthrough-return251;252; WASM64-LABEL: atomicrmw_usub_sat_i16:253; WASM64: .functype atomicrmw_usub_sat_i16 (i64, i32) -> (i32)254; WASM64-NEXT: .local i32255; WASM64-NEXT: # %bb.0:256; WASM64-NEXT: local.get 0257; WASM64-NEXT: i32.const 0258; WASM64-NEXT: local.get 0259; WASM64-NEXT: i32.load16_u 0260; WASM64-NEXT: local.tee 2261; WASM64-NEXT: local.get 1262; WASM64-NEXT: i32.const 65535263; WASM64-NEXT: i32.and264; WASM64-NEXT: i32.sub265; WASM64-NEXT: local.tee 1266; WASM64-NEXT: local.get 1267; WASM64-NEXT: local.get 2268; WASM64-NEXT: i32.gt_u269; WASM64-NEXT: i32.select270; WASM64-NEXT: i32.store16 0271; WASM64-NEXT: local.get 2272; WASM64-NEXT: # fallthrough-return273 %result = atomicrmw usub_sat ptr %ptr, i16 %val seq_cst274 ret i16 %result275}276 277define i32 @atomicrmw_usub_sat_i32(ptr %ptr, i32 %val) {278; WASM32-LABEL: atomicrmw_usub_sat_i32:279; WASM32: .functype atomicrmw_usub_sat_i32 (i32, i32) -> (i32)280; WASM32-NEXT: .local i32281; WASM32-NEXT: # %bb.0:282; WASM32-NEXT: local.get 0283; WASM32-NEXT: i32.const 0284; WASM32-NEXT: local.get 0285; WASM32-NEXT: i32.load 0286; WASM32-NEXT: local.tee 2287; WASM32-NEXT: local.get 1288; WASM32-NEXT: i32.sub289; WASM32-NEXT: local.tee 1290; WASM32-NEXT: local.get 1291; WASM32-NEXT: local.get 2292; WASM32-NEXT: i32.gt_u293; WASM32-NEXT: i32.select294; WASM32-NEXT: i32.store 0295; WASM32-NEXT: local.get 2296; WASM32-NEXT: # fallthrough-return297;298; WASM64-LABEL: atomicrmw_usub_sat_i32:299; WASM64: .functype atomicrmw_usub_sat_i32 (i64, i32) -> (i32)300; WASM64-NEXT: .local i32301; WASM64-NEXT: # %bb.0:302; WASM64-NEXT: local.get 0303; WASM64-NEXT: i32.const 0304; WASM64-NEXT: local.get 0305; WASM64-NEXT: i32.load 0306; WASM64-NEXT: local.tee 2307; WASM64-NEXT: local.get 1308; WASM64-NEXT: i32.sub309; WASM64-NEXT: local.tee 1310; WASM64-NEXT: local.get 1311; WASM64-NEXT: local.get 2312; WASM64-NEXT: i32.gt_u313; WASM64-NEXT: i32.select314; WASM64-NEXT: i32.store 0315; WASM64-NEXT: local.get 2316; WASM64-NEXT: # fallthrough-return317 %result = atomicrmw usub_sat ptr %ptr, i32 %val seq_cst318 ret i32 %result319}320 321define i64 @atomicrmw_usub_sat_i64(ptr %ptr, i64 %val) {322; WASM32-LABEL: atomicrmw_usub_sat_i64:323; WASM32: .functype atomicrmw_usub_sat_i64 (i32, i64) -> (i64)324; WASM32-NEXT: .local i64325; WASM32-NEXT: # %bb.0:326; WASM32-NEXT: local.get 0327; WASM32-NEXT: i64.const 0328; WASM32-NEXT: local.get 0329; WASM32-NEXT: i64.load 0330; WASM32-NEXT: local.tee 2331; WASM32-NEXT: local.get 1332; WASM32-NEXT: i64.sub333; WASM32-NEXT: local.tee 1334; WASM32-NEXT: local.get 1335; WASM32-NEXT: local.get 2336; WASM32-NEXT: i64.gt_u337; WASM32-NEXT: i64.select338; WASM32-NEXT: i64.store 0339; WASM32-NEXT: local.get 2340; WASM32-NEXT: # fallthrough-return341;342; WASM64-LABEL: atomicrmw_usub_sat_i64:343; WASM64: .functype atomicrmw_usub_sat_i64 (i64, i64) -> (i64)344; WASM64-NEXT: .local i64345; WASM64-NEXT: # %bb.0:346; WASM64-NEXT: local.get 0347; WASM64-NEXT: i64.const 0348; WASM64-NEXT: local.get 0349; WASM64-NEXT: i64.load 0350; WASM64-NEXT: local.tee 2351; WASM64-NEXT: local.get 1352; WASM64-NEXT: i64.sub353; WASM64-NEXT: local.tee 1354; WASM64-NEXT: local.get 1355; WASM64-NEXT: local.get 2356; WASM64-NEXT: i64.gt_u357; WASM64-NEXT: i64.select358; WASM64-NEXT: i64.store 0359; WASM64-NEXT: local.get 2360; WASM64-NEXT: # fallthrough-return361 %result = atomicrmw usub_sat ptr %ptr, i64 %val seq_cst362 ret i64 %result363}364