1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mattr=+wide-arithmetic < %s | FileCheck %s 3 4target triple = "wasm32-unknown-unknown" 5 6define i128 @add_i128(i128 %a, i128 %b) { 7; CHECK-LABEL: add_i128: 8; CHECK: .functype add_i128 (i32, i64, i64, i64, i64) -> () 9; CHECK-NEXT: # %bb.0: 10; CHECK-NEXT: local.get 1 11; CHECK-NEXT: local.get 2 12; CHECK-NEXT: local.get 3 13; CHECK-NEXT: local.get 4 14; CHECK-NEXT: i64.add128 15; CHECK-NEXT: local.set 3 16; CHECK-NEXT: local.set 4 17; CHECK-NEXT: local.get 0 18; CHECK-NEXT: local.get 3 19; CHECK-NEXT: i64.store 8 20; CHECK-NEXT: local.get 0 21; CHECK-NEXT: local.get 4 22; CHECK-NEXT: i64.store 0 23; CHECK-NEXT: # fallthrough-return 24 %c = add i128 %a, %b 25 ret i128 %c 26} 27 28define i128 @sub_i128(i128 %a, i128 %b) { 29; CHECK-LABEL: sub_i128: 30; CHECK: .functype sub_i128 (i32, i64, i64, i64, i64) -> () 31; CHECK-NEXT: # %bb.0: 32; CHECK-NEXT: local.get 1 33; CHECK-NEXT: local.get 2 34; CHECK-NEXT: local.get 3 35; CHECK-NEXT: local.get 4 36; CHECK-NEXT: i64.sub128 37; CHECK-NEXT: local.set 3 38; CHECK-NEXT: local.set 4 39; CHECK-NEXT: local.get 0 40; CHECK-NEXT: local.get 3 41; CHECK-NEXT: i64.store 8 42; CHECK-NEXT: local.get 0 43; CHECK-NEXT: local.get 4 44; CHECK-NEXT: i64.store 0 45; CHECK-NEXT: # fallthrough-return 46 %c = sub i128 %a, %b 47 ret i128 %c 48} 49 50define i128 @mul_i128(i128 %a, i128 %b) { 51; CHECK-LABEL: mul_i128: 52; CHECK: .functype mul_i128 (i32, i64, i64, i64, i64) -> () 53; CHECK-NEXT: .local i64 54; CHECK-NEXT: # %bb.0: 55; CHECK-NEXT: local.get 0 56; CHECK-NEXT: local.get 1 57; CHECK-NEXT: local.get 3 58; CHECK-NEXT: i64.mul_wide_u 59; CHECK-NEXT: local.set 5 60; CHECK-NEXT: i64.store 0 61; CHECK-NEXT: local.get 0 62; CHECK-NEXT: local.get 5 63; CHECK-NEXT: local.get 1 64; CHECK-NEXT: local.get 4 65; CHECK-NEXT: i64.mul 66; CHECK-NEXT: i64.add 67; CHECK-NEXT: local.get 2 68; CHECK-NEXT: local.get 3 69; CHECK-NEXT: i64.mul 70; CHECK-NEXT: i64.add 71; CHECK-NEXT: i64.store 8 72; CHECK-NEXT: # fallthrough-return 73 %c = mul i128 %a, %b 74 ret i128 %c 75} 76 77define i128 @i64_mul_wide_s(i64 %a, i64 %b) { 78; CHECK-LABEL: i64_mul_wide_s: 79; CHECK: .functype i64_mul_wide_s (i32, i64, i64) -> () 80; CHECK-NEXT: # %bb.0: 81; CHECK-NEXT: local.get 1 82; CHECK-NEXT: local.get 2 83; CHECK-NEXT: i64.mul_wide_s 84; CHECK-NEXT: local.set 1 85; CHECK-NEXT: local.set 2 86; CHECK-NEXT: local.get 0 87; CHECK-NEXT: local.get 1 88; CHECK-NEXT: i64.store 8 89; CHECK-NEXT: local.get 0 90; CHECK-NEXT: local.get 2 91; CHECK-NEXT: i64.store 0 92; CHECK-NEXT: # fallthrough-return 93 %a128 = sext i64 %a to i128 94 %b128 = sext i64 %b to i128 95 %c = mul i128 %a128, %b128 96 ret i128 %c 97} 98 99define i128 @i64_mul_wide_u(i64 %a, i64 %b) { 100; CHECK-LABEL: i64_mul_wide_u: 101; CHECK: .functype i64_mul_wide_u (i32, i64, i64) -> () 102; CHECK-NEXT: # %bb.0: 103; CHECK-NEXT: local.get 1 104; CHECK-NEXT: local.get 2 105; CHECK-NEXT: i64.mul_wide_u 106; CHECK-NEXT: local.set 1 107; CHECK-NEXT: local.set 2 108; CHECK-NEXT: local.get 0 109; CHECK-NEXT: local.get 1 110; CHECK-NEXT: i64.store 8 111; CHECK-NEXT: local.get 0 112; CHECK-NEXT: local.get 2 113; CHECK-NEXT: i64.store 0 114; CHECK-NEXT: # fallthrough-return 115 %a128 = zext i64 %a to i128 116 %b128 = zext i64 %b to i128 117 %c = mul i128 %a128, %b128 118 ret i128 %c 119} 120 121define i64 @mul_i128_only_lo(i128 %a, i128 %b) { 122; CHECK-LABEL: mul_i128_only_lo: 123; CHECK: .functype mul_i128_only_lo (i64, i64, i64, i64) -> (i64) 124; CHECK-NEXT: # %bb.0: 125; CHECK-NEXT: local.get 0 126; CHECK-NEXT: local.get 2 127; CHECK-NEXT: i64.mul 128; CHECK-NEXT: # fallthrough-return 129 %c = mul i128 %a, %b 130 %d = trunc i128 %c to i64 131 ret i64 %d 132} 133