brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.4 KiB · d9bec9b Raw
724 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck %s3 4; Test that basic 128-bit integer operations assemble as expected.5 6target triple = "wasm32-unknown-unknown"7 8declare i128 @llvm.ctlz.i128(i128, i1)9declare i128 @llvm.cttz.i128(i128, i1)10declare i128 @llvm.ctpop.i128(i128)11 12define i128 @add128(i128 %x, i128 %y) {13; CHECK-LABEL: add128:14; CHECK:         .functype add128 (i32, i64, i64, i64, i64) -> ()15; CHECK-NEXT:  # %bb.0:16; CHECK-NEXT:    local.get $push8=, 017; CHECK-NEXT:    local.get $push7=, 118; CHECK-NEXT:    local.get $push6=, 319; CHECK-NEXT:    i64.add $push5=, $pop7, $pop620; CHECK-NEXT:    local.tee $push4=, 3, $pop521; CHECK-NEXT:    i64.store 0($pop8), $pop422; CHECK-NEXT:    local.get $push13=, 023; CHECK-NEXT:    local.get $push10=, 224; CHECK-NEXT:    local.get $push9=, 425; CHECK-NEXT:    i64.add $push0=, $pop10, $pop926; CHECK-NEXT:    local.get $push12=, 327; CHECK-NEXT:    local.get $push11=, 128; CHECK-NEXT:    i64.lt_u $push1=, $pop12, $pop1129; CHECK-NEXT:    i64.extend_i32_u $push2=, $pop130; CHECK-NEXT:    i64.add $push3=, $pop0, $pop231; CHECK-NEXT:    i64.store 8($pop13), $pop332; CHECK-NEXT:    return33  %a = add i128 %x, %y34  ret i128 %a35}36 37define i128 @sub128(i128 %x, i128 %y) {38; CHECK-LABEL: sub128:39; CHECK:         .functype sub128 (i32, i64, i64, i64, i64) -> ()40; CHECK-NEXT:  # %bb.0:41; CHECK-NEXT:    local.get $push7=, 042; CHECK-NEXT:    local.get $push6=, 143; CHECK-NEXT:    local.get $push5=, 344; CHECK-NEXT:    i64.sub $push0=, $pop6, $pop545; CHECK-NEXT:    i64.store 0($pop7), $pop046; CHECK-NEXT:    local.get $push12=, 047; CHECK-NEXT:    local.get $push9=, 248; CHECK-NEXT:    local.get $push8=, 449; CHECK-NEXT:    i64.sub $push1=, $pop9, $pop850; CHECK-NEXT:    local.get $push11=, 151; CHECK-NEXT:    local.get $push10=, 352; CHECK-NEXT:    i64.lt_u $push2=, $pop11, $pop1053; CHECK-NEXT:    i64.extend_i32_u $push3=, $pop254; CHECK-NEXT:    i64.sub $push4=, $pop1, $pop355; CHECK-NEXT:    i64.store 8($pop12), $pop456; CHECK-NEXT:    return57  %a = sub i128 %x, %y58  ret i128 %a59}60 61define i128 @mul128(i128 %x, i128 %y) {62; CHECK-LABEL: mul128:63; CHECK:         .functype mul128 (i32, i64, i64, i64, i64) -> ()64; CHECK-NEXT:    .local i3265; CHECK-NEXT:  # %bb.0:66; CHECK-NEXT:    global.get $push2=, __stack_pointer67; CHECK-NEXT:    i32.const $push3=, 1668; CHECK-NEXT:    i32.sub $push7=, $pop2, $pop369; CHECK-NEXT:    local.tee $push6=, 5, $pop770; CHECK-NEXT:    global.set __stack_pointer, $pop671; CHECK-NEXT:    local.get $push12=, 572; CHECK-NEXT:    local.get $push11=, 173; CHECK-NEXT:    local.get $push10=, 274; CHECK-NEXT:    local.get $push9=, 375; CHECK-NEXT:    local.get $push8=, 476; CHECK-NEXT:    call __multi3, $pop12, $pop11, $pop10, $pop9, $pop877; CHECK-NEXT:    local.get $push14=, 078; CHECK-NEXT:    local.get $push13=, 579; CHECK-NEXT:    i64.load $push0=, 8($pop13)80; CHECK-NEXT:    i64.store 8($pop14), $pop081; CHECK-NEXT:    local.get $push16=, 082; CHECK-NEXT:    local.get $push15=, 583; CHECK-NEXT:    i64.load $push1=, 0($pop15)84; CHECK-NEXT:    i64.store 0($pop16), $pop185; CHECK-NEXT:    local.get $push17=, 586; CHECK-NEXT:    i32.const $push4=, 1687; CHECK-NEXT:    i32.add $push5=, $pop17, $pop488; CHECK-NEXT:    global.set __stack_pointer, $pop589; CHECK-NEXT:    return90  %a = mul i128 %x, %y91  ret i128 %a92}93 94define i128 @sdiv128(i128 %x, i128 %y) {95; CHECK-LABEL: sdiv128:96; CHECK:         .functype sdiv128 (i32, i64, i64, i64, i64) -> ()97; CHECK-NEXT:    .local i3298; CHECK-NEXT:  # %bb.0:99; CHECK-NEXT:    global.get $push2=, __stack_pointer100; CHECK-NEXT:    i32.const $push3=, 16101; CHECK-NEXT:    i32.sub  $push7=, $pop2, $pop3102; CHECK-NEXT:    local.tee $push6=, 5, $pop7103; CHECK-NEXT:    global.set __stack_pointer, $pop6104; CHECK-NEXT:    local.get $push12=, 5105; CHECK-NEXT:    local.get $push11=, 1106; CHECK-NEXT:    local.get $push10=, 2107; CHECK-NEXT:    local.get $push9=, 3108; CHECK-NEXT:    local.get $push8=, 4109; CHECK-NEXT:    call __divti3, $pop12, $pop11, $pop10, $pop9, $pop8110; CHECK-NEXT:    local.get $push14=, 0111; CHECK-NEXT:    local.get $push13=, 5112; CHECK-NEXT:    i64.load $push0=, 8($pop13)113; CHECK-NEXT:    i64.store 8($pop14), $pop0114; CHECK-NEXT:    local.get $push16=, 0115; CHECK-NEXT:    local.get $push15=, 5116; CHECK-NEXT:    i64.load $push1=, 0($pop15)117; CHECK-NEXT:    i64.store 0($pop16), $pop1118; CHECK-NEXT:    local.get $push17=, 5119; CHECK-NEXT:    i32.const $push4=, 16120; CHECK-NEXT:    i32.add  $push5=, $pop17, $pop4121; CHECK-NEXT:    global.set __stack_pointer, $pop5122; CHECK-NEXT:    return123  %a = sdiv i128 %x, %y124  ret i128 %a125}126 127define i128 @udiv128(i128 %x, i128 %y) {128; CHECK-LABEL: udiv128:129; CHECK:         .functype udiv128 (i32, i64, i64, i64, i64) -> ()130; CHECK-NEXT:    .local i32131; CHECK-NEXT:  # %bb.0:132; CHECK-NEXT:    global.get $push2=, __stack_pointer133; CHECK-NEXT:    i32.const $push3=, 16134; CHECK-NEXT:    i32.sub  $push7=, $pop2, $pop3135; CHECK-NEXT:    local.tee $push6=, 5, $pop7136; CHECK-NEXT:    global.set __stack_pointer, $pop6137; CHECK-NEXT:    local.get $push12=, 5138; CHECK-NEXT:    local.get $push11=, 1139; CHECK-NEXT:    local.get $push10=, 2140; CHECK-NEXT:    local.get $push9=, 3141; CHECK-NEXT:    local.get $push8=, 4142; CHECK-NEXT:    call __udivti3, $pop12, $pop11, $pop10, $pop9, $pop8143; CHECK-NEXT:    local.get $push14=, 0144; CHECK-NEXT:    local.get $push13=, 5145; CHECK-NEXT:    i64.load $push0=, 8($pop13)146; CHECK-NEXT:    i64.store 8($pop14), $pop0147; CHECK-NEXT:    local.get $push16=, 0148; CHECK-NEXT:    local.get $push15=, 5149; CHECK-NEXT:    i64.load $push1=, 0($pop15)150; CHECK-NEXT:    i64.store 0($pop16), $pop1151; CHECK-NEXT:    local.get $push17=, 5152; CHECK-NEXT:    i32.const $push4=, 16153; CHECK-NEXT:    i32.add  $push5=, $pop17, $pop4154; CHECK-NEXT:    global.set __stack_pointer, $pop5155; CHECK-NEXT:    return156  %a = udiv i128 %x, %y157  ret i128 %a158}159 160define i128 @srem128(i128 %x, i128 %y) {161; CHECK-LABEL: srem128:162; CHECK:         .functype srem128 (i32, i64, i64, i64, i64) -> ()163; CHECK-NEXT:    .local i32164; CHECK-NEXT:  # %bb.0:165; CHECK-NEXT:    global.get $push2=, __stack_pointer166; CHECK-NEXT:    i32.const $push3=, 16167; CHECK-NEXT:    i32.sub  $push7=, $pop2, $pop3168; CHECK-NEXT:    local.tee $push6=, 5, $pop7169; CHECK-NEXT:    global.set __stack_pointer, $pop6170; CHECK-NEXT:    local.get $push12=, 5171; CHECK-NEXT:    local.get $push11=, 1172; CHECK-NEXT:    local.get $push10=, 2173; CHECK-NEXT:    local.get $push9=, 3174; CHECK-NEXT:    local.get $push8=, 4175; CHECK-NEXT:    call __modti3, $pop12, $pop11, $pop10, $pop9, $pop8176; CHECK-NEXT:    local.get $push14=, 0177; CHECK-NEXT:    local.get $push13=, 5178; CHECK-NEXT:    i64.load $push0=, 8($pop13)179; CHECK-NEXT:    i64.store 8($pop14), $pop0180; CHECK-NEXT:    local.get $push16=, 0181; CHECK-NEXT:    local.get $push15=, 5182; CHECK-NEXT:    i64.load $push1=, 0($pop15)183; CHECK-NEXT:    i64.store 0($pop16), $pop1184; CHECK-NEXT:    local.get $push17=, 5185; CHECK-NEXT:    i32.const $push4=, 16186; CHECK-NEXT:    i32.add  $push5=, $pop17, $pop4187; CHECK-NEXT:    global.set __stack_pointer, $pop5188; CHECK-NEXT:    return189  %a = srem i128 %x, %y190  ret i128 %a191}192 193define i128 @urem128(i128 %x, i128 %y) {194; CHECK-LABEL: urem128:195; CHECK:         .functype urem128 (i32, i64, i64, i64, i64) -> ()196; CHECK-NEXT:    .local i32197; CHECK-NEXT:  # %bb.0:198; CHECK-NEXT:    global.get $push2=, __stack_pointer199; CHECK-NEXT:    i32.const $push3=, 16200; CHECK-NEXT:    i32.sub  $push7=, $pop2, $pop3201; CHECK-NEXT:    local.tee $push6=, 5, $pop7202; CHECK-NEXT:    global.set __stack_pointer, $pop6203; CHECK-NEXT:    local.get $push12=, 5204; CHECK-NEXT:    local.get $push11=, 1205; CHECK-NEXT:    local.get $push10=, 2206; CHECK-NEXT:    local.get $push9=, 3207; CHECK-NEXT:    local.get $push8=, 4208; CHECK-NEXT:    call __umodti3, $pop12, $pop11, $pop10, $pop9, $pop8209; CHECK-NEXT:    local.get $push14=, 0210; CHECK-NEXT:    local.get $push13=, 5211; CHECK-NEXT:    i64.load $push0=, 8($pop13)212; CHECK-NEXT:    i64.store 8($pop14), $pop0213; CHECK-NEXT:    local.get $push16=, 0214; CHECK-NEXT:    local.get $push15=, 5215; CHECK-NEXT:    i64.load $push1=, 0($pop15)216; CHECK-NEXT:    i64.store 0($pop16), $pop1217; CHECK-NEXT:    local.get $push17=, 5218; CHECK-NEXT:    i32.const $push4=, 16219; CHECK-NEXT:    i32.add  $push5=, $pop17, $pop4220; CHECK-NEXT:    global.set __stack_pointer, $pop5221; CHECK-NEXT:    return222  %a = urem i128 %x, %y223  ret i128 %a224}225 226define i128 @and128(i128 %x, i128 %y) {227; CHECK-LABEL: and128:228; CHECK:         .functype and128 (i32, i64, i64, i64, i64) -> ()229; CHECK-NEXT:  # %bb.0:230; CHECK-NEXT:    local.get $push4=, 0231; CHECK-NEXT:    local.get $push3=, 2232; CHECK-NEXT:    local.get $push2=, 4233; CHECK-NEXT:    i64.and $push0=, $pop3, $pop2234; CHECK-NEXT:    i64.store 8($pop4), $pop0235; CHECK-NEXT:    local.get $push7=, 0236; CHECK-NEXT:    local.get $push6=, 1237; CHECK-NEXT:    local.get $push5=, 3238; CHECK-NEXT:    i64.and $push1=, $pop6, $pop5239; CHECK-NEXT:    i64.store 0($pop7), $pop1240; CHECK-NEXT:    return241  %a = and i128 %x, %y242  ret i128 %a243}244 245define i128 @or128(i128 %x, i128 %y) {246; CHECK-LABEL: or128:247; CHECK:         .functype or128 (i32, i64, i64, i64, i64) -> ()248; CHECK-NEXT:  # %bb.0:249; CHECK-NEXT:    local.get $push4=, 0250; CHECK-NEXT:    local.get $push3=, 2251; CHECK-NEXT:    local.get $push2=, 4252; CHECK-NEXT:    i64.or $push0=, $pop3, $pop2253; CHECK-NEXT:    i64.store 8($pop4), $pop0254; CHECK-NEXT:    local.get $push7=, 0255; CHECK-NEXT:    local.get $push6=, 1256; CHECK-NEXT:    local.get $push5=, 3257; CHECK-NEXT:    i64.or $push1=, $pop6, $pop5258; CHECK-NEXT:    i64.store 0($pop7), $pop1259; CHECK-NEXT:    return260  %a = or i128 %x, %y261  ret i128 %a262}263 264define i128 @xor128(i128 %x, i128 %y) {265; CHECK-LABEL: xor128:266; CHECK:         .functype xor128 (i32, i64, i64, i64, i64) -> ()267; CHECK-NEXT:  # %bb.0:268; CHECK-NEXT:    local.get $push4=, 0269; CHECK-NEXT:    local.get $push3=, 2270; CHECK-NEXT:    local.get $push2=, 4271; CHECK-NEXT:    i64.xor $push0=, $pop3, $pop2272; CHECK-NEXT:    i64.store 8($pop4), $pop0273; CHECK-NEXT:    local.get $push7=, 0274; CHECK-NEXT:    local.get $push6=, 1275; CHECK-NEXT:    local.get $push5=, 3276; CHECK-NEXT:    i64.xor $push1=, $pop6, $pop5277; CHECK-NEXT:    i64.store 0($pop7), $pop1278; CHECK-NEXT:    return279  %a = xor i128 %x, %y280  ret i128 %a281}282 283define i128 @shl128(i128 %x, i128 %y) {284; CHECK-LABEL: shl128:285; CHECK:         .functype shl128 (i32, i64, i64, i64, i64) -> ()286; CHECK-NEXT:    .local i32287; CHECK-NEXT:  # %bb.0:288; CHECK-NEXT:    global.get $push3=, __stack_pointer289; CHECK-NEXT:    i32.const $push4=, 16290; CHECK-NEXT:    i32.sub  $push8=, $pop3, $pop4291; CHECK-NEXT:    local.tee $push7=, 5, $pop8292; CHECK-NEXT:    global.set __stack_pointer, $pop7293; CHECK-NEXT:    local.get $push12=, 5294; CHECK-NEXT:    local.get $push11=, 1295; CHECK-NEXT:    local.get $push10=, 2296; CHECK-NEXT:    local.get $push9=, 3297; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop9298; CHECK-NEXT:    call __ashlti3, $pop12, $pop11, $pop10, $pop0299; CHECK-NEXT:    local.get $push14=, 0300; CHECK-NEXT:    local.get $push13=, 5301; CHECK-NEXT:    i64.load $push1=, 8($pop13)302; CHECK-NEXT:    i64.store 8($pop14), $pop1303; CHECK-NEXT:    local.get $push16=, 0304; CHECK-NEXT:    local.get $push15=, 5305; CHECK-NEXT:    i64.load $push2=, 0($pop15)306; CHECK-NEXT:    i64.store 0($pop16), $pop2307; CHECK-NEXT:    local.get $push17=, 5308; CHECK-NEXT:    i32.const $push5=, 16309; CHECK-NEXT:    i32.add  $push6=, $pop17, $pop5310; CHECK-NEXT:    global.set __stack_pointer, $pop6311; CHECK-NEXT:    return312  %a = shl i128 %x, %y313  ret i128 %a314}315 316define i128 @shr128(i128 %x, i128 %y) {317; CHECK-LABEL: shr128:318; CHECK:         .functype shr128 (i32, i64, i64, i64, i64) -> ()319; CHECK-NEXT:    .local i32320; CHECK-NEXT:  # %bb.0:321; CHECK-NEXT:    global.get $push3=, __stack_pointer322; CHECK-NEXT:    i32.const $push4=, 16323; CHECK-NEXT:    i32.sub  $push8=, $pop3, $pop4324; CHECK-NEXT:    local.tee $push7=, 5, $pop8325; CHECK-NEXT:    global.set __stack_pointer, $pop7326; CHECK-NEXT:    local.get $push12=, 5327; CHECK-NEXT:    local.get $push11=, 1328; CHECK-NEXT:    local.get $push10=, 2329; CHECK-NEXT:    local.get $push9=, 3330; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop9331; CHECK-NEXT:    call __lshrti3, $pop12, $pop11, $pop10, $pop0332; CHECK-NEXT:    local.get $push14=, 0333; CHECK-NEXT:    local.get $push13=, 5334; CHECK-NEXT:    i64.load $push1=, 8($pop13)335; CHECK-NEXT:    i64.store 8($pop14), $pop1336; CHECK-NEXT:    local.get $push16=, 0337; CHECK-NEXT:    local.get $push15=, 5338; CHECK-NEXT:    i64.load $push2=, 0($pop15)339; CHECK-NEXT:    i64.store 0($pop16), $pop2340; CHECK-NEXT:    local.get $push17=, 5341; CHECK-NEXT:    i32.const $push5=, 16342; CHECK-NEXT:    i32.add  $push6=, $pop17, $pop5343; CHECK-NEXT:    global.set __stack_pointer, $pop6344; CHECK-NEXT:    return345  %a = lshr i128 %x, %y346  ret i128 %a347}348 349define i128 @sar128(i128 %x, i128 %y) {350; CHECK-LABEL: sar128:351; CHECK:         .functype sar128 (i32, i64, i64, i64, i64) -> ()352; CHECK-NEXT:    .local i32353; CHECK-NEXT:  # %bb.0:354; CHECK-NEXT:    global.get $push3=, __stack_pointer355; CHECK-NEXT:    i32.const $push4=, 16356; CHECK-NEXT:    i32.sub  $push8=, $pop3, $pop4357; CHECK-NEXT:    local.tee $push7=, 5, $pop8358; CHECK-NEXT:    global.set __stack_pointer, $pop7359; CHECK-NEXT:    local.get $push12=, 5360; CHECK-NEXT:    local.get $push11=, 1361; CHECK-NEXT:    local.get $push10=, 2362; CHECK-NEXT:    local.get $push9=, 3363; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop9364; CHECK-NEXT:    call __ashrti3, $pop12, $pop11, $pop10, $pop0365; CHECK-NEXT:    local.get $push14=, 0366; CHECK-NEXT:    local.get $push13=, 5367; CHECK-NEXT:    i64.load $push1=, 8($pop13)368; CHECK-NEXT:    i64.store 8($pop14), $pop1369; CHECK-NEXT:    local.get $push16=, 0370; CHECK-NEXT:    local.get $push15=, 5371; CHECK-NEXT:    i64.load $push2=, 0($pop15)372; CHECK-NEXT:    i64.store 0($pop16), $pop2373; CHECK-NEXT:    local.get $push17=, 5374; CHECK-NEXT:    i32.const $push5=, 16375; CHECK-NEXT:    i32.add  $push6=, $pop17, $pop5376; CHECK-NEXT:    global.set __stack_pointer, $pop6377; CHECK-NEXT:    return378  %a = ashr i128 %x, %y379  ret i128 %a380}381 382define i128 @clz128(i128 %x) {383; CHECK-LABEL: clz128:384; CHECK:         .functype clz128 (i32, i64, i64) -> ()385; CHECK-NEXT:  # %bb.0:386; CHECK-NEXT:    local.get $push8=, 0387; CHECK-NEXT:    i64.const $push0=, 0388; CHECK-NEXT:    i64.store 8($pop8), $pop0389; CHECK-NEXT:    local.get $push12=, 0390; CHECK-NEXT:    local.get $push9=, 2391; CHECK-NEXT:    i64.clz $push5=, $pop9392; CHECK-NEXT:    local.get $push10=, 1393; CHECK-NEXT:    i64.clz $push2=, $pop10394; CHECK-NEXT:    i64.const $push3=, 64395; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3396; CHECK-NEXT:    local.get $push11=, 2397; CHECK-NEXT:    i64.const $push7=, 0398; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7399; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1400; CHECK-NEXT:    i64.store 0($pop12), $pop6401; CHECK-NEXT:    return402  %a = call i128 @llvm.ctlz.i128(i128 %x, i1 false)403  ret i128 %a404}405 406define i128 @clz128_zero_undef(i128 %x) {407; CHECK-LABEL: clz128_zero_undef:408; CHECK:         .functype clz128_zero_undef (i32, i64, i64) -> ()409; CHECK-NEXT:  # %bb.0:410; CHECK-NEXT:    local.get $push8=, 0411; CHECK-NEXT:    i64.const $push0=, 0412; CHECK-NEXT:    i64.store 8($pop8), $pop0413; CHECK-NEXT:    local.get $push12=, 0414; CHECK-NEXT:    local.get $push9=, 2415; CHECK-NEXT:    i64.clz $push5=, $pop9416; CHECK-NEXT:    local.get $push10=, 1417; CHECK-NEXT:    i64.clz $push2=, $pop10418; CHECK-NEXT:    i64.const $push3=, 64419; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3420; CHECK-NEXT:    local.get $push11=, 2421; CHECK-NEXT:    i64.const $push7=, 0422; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7423; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1424; CHECK-NEXT:    i64.store 0($pop12), $pop6425; CHECK-NEXT:    return426  %a = call i128 @llvm.ctlz.i128(i128 %x, i1 true)427  ret i128 %a428}429 430define i128 @ctz128(i128 %x) {431; CHECK-LABEL: ctz128:432; CHECK:         .functype ctz128 (i32, i64, i64) -> ()433; CHECK-NEXT:  # %bb.0:434; CHECK-NEXT:    local.get $push8=, 0435; CHECK-NEXT:    i64.const $push0=, 0436; CHECK-NEXT:    i64.store 8($pop8), $pop0437; CHECK-NEXT:    local.get $push12=, 0438; CHECK-NEXT:    local.get $push9=, 1439; CHECK-NEXT:    i64.ctz $push5=, $pop9440; CHECK-NEXT:    local.get $push10=, 2441; CHECK-NEXT:    i64.ctz $push2=, $pop10442; CHECK-NEXT:    i64.const $push3=, 64443; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3444; CHECK-NEXT:    local.get $push11=, 1445; CHECK-NEXT:    i64.const $push7=, 0446; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7447; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1448; CHECK-NEXT:    i64.store 0($pop12), $pop6449; CHECK-NEXT:    return450  %a = call i128 @llvm.cttz.i128(i128 %x, i1 false)451  ret i128 %a452}453 454define i128 @ctz128_zero_undef(i128 %x) {455; CHECK-LABEL: ctz128_zero_undef:456; CHECK:         .functype ctz128_zero_undef (i32, i64, i64) -> ()457; CHECK-NEXT:  # %bb.0:458; CHECK-NEXT:    local.get $push8=, 0459; CHECK-NEXT:    i64.const $push0=, 0460; CHECK-NEXT:    i64.store 8($pop8), $pop0461; CHECK-NEXT:    local.get $push12=, 0462; CHECK-NEXT:    local.get $push9=, 1463; CHECK-NEXT:    i64.ctz $push5=, $pop9464; CHECK-NEXT:    local.get $push10=, 2465; CHECK-NEXT:    i64.ctz $push2=, $pop10466; CHECK-NEXT:    i64.const $push3=, 64467; CHECK-NEXT:    i64.add $push4=, $pop2, $pop3468; CHECK-NEXT:    local.get $push11=, 1469; CHECK-NEXT:    i64.const $push7=, 0470; CHECK-NEXT:    i64.ne $push1=, $pop11, $pop7471; CHECK-NEXT:    i64.select $push6=, $pop5, $pop4, $pop1472; CHECK-NEXT:    i64.store 0($pop12), $pop6473; CHECK-NEXT:    return474  %a = call i128 @llvm.cttz.i128(i128 %x, i1 true)475  ret i128 %a476}477 478define i128 @popcnt128(i128 %x) {479; CHECK-LABEL: popcnt128:480; CHECK:         .functype popcnt128 (i32, i64, i64) -> ()481; CHECK-NEXT:  # %bb.0:482; CHECK-NEXT:    local.get $push4=, 0483; CHECK-NEXT:    i64.const $push0=, 0484; CHECK-NEXT:    i64.store 8($pop4), $pop0485; CHECK-NEXT:    local.get $push7=, 0486; CHECK-NEXT:    local.get $push5=, 1487; CHECK-NEXT:    i64.popcnt $push2=, $pop5488; CHECK-NEXT:    local.get $push6=, 2489; CHECK-NEXT:    i64.popcnt $push1=, $pop6490; CHECK-NEXT:    i64.add $push3=, $pop2, $pop1491; CHECK-NEXT:    i64.store 0($pop7), $pop3492; CHECK-NEXT:    return493  %a = call i128 @llvm.ctpop.i128(i128 %x)494  ret i128 %a495}496 497define i32 @eqz128(i128 %x) {498; CHECK-LABEL: eqz128:499; CHECK:         .functype eqz128 (i64, i64) -> (i32)500; CHECK-NEXT:  # %bb.0:501; CHECK-NEXT:    local.get $push3=, 0502; CHECK-NEXT:    local.get $push2=, 1503; CHECK-NEXT:    i64.or $push0=, $pop3, $pop2504; CHECK-NEXT:    i64.eqz $push1=, $pop0505; CHECK-NEXT:    return $pop1506  %a = icmp eq i128 %x, 0507  %b = zext i1 %a to i32508  ret i32 %b509}510 511define i128 @rotl(i128 %x, i128 %y) {512; CHECK-LABEL: rotl:513; CHECK:         .functype rotl (i32, i64, i64, i64, i64) -> ()514; CHECK-NEXT:    .local i32, i32515; CHECK-NEXT:  # %bb.0:516; CHECK-NEXT:    global.get $push8=, __stack_pointer517; CHECK-NEXT:    i32.const $push9=, 32518; CHECK-NEXT:    i32.sub  $push17=, $pop8, $pop9519; CHECK-NEXT:    local.tee $push16=, 5, $pop17520; CHECK-NEXT:    global.set __stack_pointer, $pop16521; CHECK-NEXT:    local.get $push18=, 5522; CHECK-NEXT:    i32.const $push12=, 16523; CHECK-NEXT:    i32.add  $push13=, $pop18, $pop12524; CHECK-NEXT:    local.get $push21=, 1525; CHECK-NEXT:    local.get $push20=, 2526; CHECK-NEXT:    local.get $push19=, 3527; CHECK-NEXT:    i32.wrap_i64 $push15=, $pop19528; CHECK-NEXT:    local.tee $push14=, 6, $pop15529; CHECK-NEXT:    call __ashlti3, $pop13, $pop21, $pop20, $pop14530; CHECK-NEXT:    local.get $push25=, 5531; CHECK-NEXT:    local.get $push24=, 1532; CHECK-NEXT:    local.get $push23=, 2533; CHECK-NEXT:    i32.const $push0=, 128534; CHECK-NEXT:    local.get $push22=, 6535; CHECK-NEXT:    i32.sub  $push1=, $pop0, $pop22536; CHECK-NEXT:    call __lshrti3, $pop25, $pop24, $pop23, $pop1537; CHECK-NEXT:    local.get $push28=, 0538; CHECK-NEXT:    local.get $push26=, 5539; CHECK-NEXT:    i64.load $push2=, 24($pop26)540; CHECK-NEXT:    local.get $push27=, 5541; CHECK-NEXT:    i64.load $push3=, 8($pop27)542; CHECK-NEXT:    i64.or   $push4=, $pop2, $pop3543; CHECK-NEXT:    i64.store 8($pop28), $pop4544; CHECK-NEXT:    local.get $push31=, 0545; CHECK-NEXT:    local.get $push29=, 5546; CHECK-NEXT:    i64.load $push5=, 16($pop29)547; CHECK-NEXT:    local.get $push30=, 5548; CHECK-NEXT:    i64.load $push6=, 0($pop30)549; CHECK-NEXT:    i64.or   $push7=, $pop5, $pop6550; CHECK-NEXT:    i64.store 0($pop31), $pop7551; CHECK-NEXT:    local.get $push32=, 5552; CHECK-NEXT:    i32.const $push10=, 32553; CHECK-NEXT:    i32.add  $push11=, $pop32, $pop10554; CHECK-NEXT:    global.set __stack_pointer, $pop11555; CHECK-NEXT:    return556  %z = sub i128 128, %y557  %b = shl i128 %x, %y558  %c = lshr i128 %x, %z559  %d = or i128 %b, %c560  ret i128 %d561}562 563define i128 @masked_rotl(i128 %x, i128 %y) {564; CHECK-LABEL: masked_rotl:565; CHECK:         .functype masked_rotl (i32, i64, i64, i64, i64) -> ()566; CHECK-NEXT:    .local i32, i32567; CHECK-NEXT:  # %bb.0:568; CHECK-NEXT:    global.get $push10=, __stack_pointer569; CHECK-NEXT:    i32.const $push11=, 32570; CHECK-NEXT:    i32.sub  $push19=, $pop10, $pop11571; CHECK-NEXT:    local.tee $push18=, 5, $pop19572; CHECK-NEXT:    global.set __stack_pointer, $pop18573; CHECK-NEXT:    local.get $push20=, 5574; CHECK-NEXT:    i32.const $push14=, 16575; CHECK-NEXT:    i32.add  $push15=, $pop20, $pop14576; CHECK-NEXT:    local.get $push23=, 1577; CHECK-NEXT:    local.get $push22=, 2578; CHECK-NEXT:    local.get $push21=, 3579; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop21580; CHECK-NEXT:    i32.const $push1=, 127581; CHECK-NEXT:    i32.and  $push17=, $pop0, $pop1582; CHECK-NEXT:    local.tee $push16=, 6, $pop17583; CHECK-NEXT:    call __ashlti3, $pop15, $pop23, $pop22, $pop16584; CHECK-NEXT:    local.get $push27=, 5585; CHECK-NEXT:    local.get $push26=, 1586; CHECK-NEXT:    local.get $push25=, 2587; CHECK-NEXT:    i32.const $push2=, 128588; CHECK-NEXT:    local.get $push24=, 6589; CHECK-NEXT:    i32.sub  $push3=, $pop2, $pop24590; CHECK-NEXT:    call __lshrti3, $pop27, $pop26, $pop25, $pop3591; CHECK-NEXT:    local.get $push30=, 0592; CHECK-NEXT:    local.get $push28=, 5593; CHECK-NEXT:    i64.load $push4=, 24($pop28)594; CHECK-NEXT:    local.get $push29=, 5595; CHECK-NEXT:    i64.load $push5=, 8($pop29)596; CHECK-NEXT:    i64.or   $push6=, $pop4, $pop5597; CHECK-NEXT:    i64.store 8($pop30), $pop6598; CHECK-NEXT:    local.get $push33=, 0599; CHECK-NEXT:    local.get $push31=, 5600; CHECK-NEXT:    i64.load $push7=, 16($pop31)601; CHECK-NEXT:    local.get $push32=, 5602; CHECK-NEXT:    i64.load $push8=, 0($pop32)603; CHECK-NEXT:    i64.or   $push9=, $pop7, $pop8604; CHECK-NEXT:    i64.store 0($pop33), $pop9605; CHECK-NEXT:    local.get $push34=, 5606; CHECK-NEXT:    i32.const $push12=, 32607; CHECK-NEXT:    i32.add  $push13=, $pop34, $pop12608; CHECK-NEXT:    global.set __stack_pointer, $pop13609; CHECK-NEXT:    return610  %a = and i128 %y, 127611  %z = sub i128 128, %a612  %b = shl i128 %x, %a613  %c = lshr i128 %x, %z614  %d = or i128 %b, %c615  ret i128 %d616}617 618define i128 @rotr(i128 %x, i128 %y) {619; CHECK-LABEL: rotr:620; CHECK:         .functype rotr (i32, i64, i64, i64, i64) -> ()621; CHECK-NEXT:    .local i32, i32622; CHECK-NEXT:  # %bb.0:623; CHECK-NEXT:    global.get $push8=, __stack_pointer624; CHECK-NEXT:    i32.const $push9=, 32625; CHECK-NEXT:    i32.sub  $push17=, $pop8, $pop9626; CHECK-NEXT:    local.tee $push16=, 5, $pop17627; CHECK-NEXT:    global.set __stack_pointer, $pop16628; CHECK-NEXT:    local.get $push18=, 5629; CHECK-NEXT:    i32.const $push12=, 16630; CHECK-NEXT:    i32.add  $push13=, $pop18, $pop12631; CHECK-NEXT:    local.get $push21=, 1632; CHECK-NEXT:    local.get $push20=, 2633; CHECK-NEXT:    local.get $push19=, 3634; CHECK-NEXT:    i32.wrap_i64 $push15=, $pop19635; CHECK-NEXT:    local.tee $push14=, 6, $pop15636; CHECK-NEXT:    call __lshrti3, $pop13, $pop21, $pop20, $pop14637; CHECK-NEXT:    local.get $push25=, 5638; CHECK-NEXT:    local.get $push24=, 1639; CHECK-NEXT:    local.get $push23=, 2640; CHECK-NEXT:    i32.const $push0=, 128641; CHECK-NEXT:    local.get $push22=, 6642; CHECK-NEXT:    i32.sub  $push1=, $pop0, $pop22643; CHECK-NEXT:    call __ashlti3, $pop25, $pop24, $pop23, $pop1644; CHECK-NEXT:    local.get $push28=, 0645; CHECK-NEXT:    local.get $push26=, 5646; CHECK-NEXT:    i64.load $push2=, 24($pop26)647; CHECK-NEXT:    local.get $push27=, 5648; CHECK-NEXT:    i64.load $push3=, 8($pop27)649; CHECK-NEXT:    i64.or   $push4=, $pop2, $pop3650; CHECK-NEXT:    i64.store 8($pop28), $pop4651; CHECK-NEXT:    local.get $push31=, 0652; CHECK-NEXT:    local.get $push29=, 5653; CHECK-NEXT:    i64.load $push5=, 16($pop29)654; CHECK-NEXT:    local.get $push30=, 5655; CHECK-NEXT:    i64.load $push6=, 0($pop30)656; CHECK-NEXT:    i64.or   $push7=, $pop5, $pop6657; CHECK-NEXT:    i64.store 0($pop31), $pop7658; CHECK-NEXT:    local.get $push32=, 5659; CHECK-NEXT:    i32.const $push10=, 32660; CHECK-NEXT:    i32.add  $push11=, $pop32, $pop10661; CHECK-NEXT:    global.set __stack_pointer, $pop11662; CHECK-NEXT:    return663  %z = sub i128 128, %y664  %b = lshr i128 %x, %y665  %c = shl i128 %x, %z666  %d = or i128 %b, %c667  ret i128 %d668}669 670define i128 @masked_rotr(i128 %x, i128 %y) {671; CHECK-LABEL: masked_rotr:672; CHECK:         .functype masked_rotr (i32, i64, i64, i64, i64) -> ()673; CHECK-NEXT:    .local i32, i32674; CHECK-NEXT:  # %bb.0:675; CHECK-NEXT:    global.get $push10=, __stack_pointer676; CHECK-NEXT:    i32.const $push11=, 32677; CHECK-NEXT:    i32.sub  $push19=, $pop10, $pop11678; CHECK-NEXT:    local.tee $push18=, 5, $pop19679; CHECK-NEXT:    global.set __stack_pointer, $pop18680; CHECK-NEXT:    local.get $push20=, 5681; CHECK-NEXT:    i32.const $push14=, 16682; CHECK-NEXT:    i32.add  $push15=, $pop20, $pop14683; CHECK-NEXT:    local.get $push23=, 1684; CHECK-NEXT:    local.get $push22=, 2685; CHECK-NEXT:    local.get $push21=, 3686; CHECK-NEXT:    i32.wrap_i64 $push0=, $pop21687; CHECK-NEXT:    i32.const $push1=, 127688; CHECK-NEXT:    i32.and  $push17=, $pop0, $pop1689; CHECK-NEXT:    local.tee $push16=, 6, $pop17690; CHECK-NEXT:    call __lshrti3, $pop15, $pop23, $pop22, $pop16691; CHECK-NEXT:    local.get $push27=, 5692; CHECK-NEXT:    local.get $push26=, 1693; CHECK-NEXT:    local.get $push25=, 2694; CHECK-NEXT:    i32.const $push2=, 128695; CHECK-NEXT:    local.get $push24=, 6696; CHECK-NEXT:    i32.sub  $push3=, $pop2, $pop24697; CHECK-NEXT:    call __ashlti3, $pop27, $pop26, $pop25, $pop3698; CHECK-NEXT:    local.get $push30=, 0699; CHECK-NEXT:    local.get $push28=, 5700; CHECK-NEXT:    i64.load $push4=, 24($pop28)701; CHECK-NEXT:    local.get $push29=, 5702; CHECK-NEXT:    i64.load $push5=, 8($pop29)703; CHECK-NEXT:    i64.or   $push6=, $pop4, $pop5704; CHECK-NEXT:    i64.store 8($pop30), $pop6705; CHECK-NEXT:    local.get $push33=, 0706; CHECK-NEXT:    local.get $push31=, 5707; CHECK-NEXT:    i64.load $push7=, 16($pop31)708; CHECK-NEXT:    local.get $push32=, 5709; CHECK-NEXT:    i64.load $push8=, 0($pop32)710; CHECK-NEXT:    i64.or   $push9=, $pop7, $pop8711; CHECK-NEXT:    i64.store 0($pop33), $pop9712; CHECK-NEXT:    local.get $push34=, 5713; CHECK-NEXT:    i32.const $push12=, 32714; CHECK-NEXT:    i32.add  $push13=, $pop34, $pop12715; CHECK-NEXT:    global.set __stack_pointer, $pop13716; CHECK-NEXT:    return717  %a = and i128 %y, 127718  %z = sub i128 128, %a719  %b = lshr i128 %x, %a720  %c = shl i128 %x, %z721  %d = or i128 %b, %c722  ret i128 %d723}724