1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc < %s -verify-machineinstrs -mcpu=mvp -mattr=+multivalue -target-abi=experimental-mv | FileCheck %s --check-prefix=MULTIVALUE 3; RUN: llc < %s -verify-machineinstrs -mcpu=mvp | FileCheck %s --check-prefix=NO_MULTIVALUE 4 5; Test libcall signatures when multivalue is enabled and disabled 6 7target triple = "wasm32-unknown-unknown" 8 9define i128 @multivalue_sdiv(i128 %a, i128 %b) { 10; MULTIVALUE-LABEL: multivalue_sdiv: 11; MULTIVALUE: .functype multivalue_sdiv (i64, i64, i64, i64) -> (i64, i64) 12; MULTIVALUE-NEXT: # %bb.0: 13; MULTIVALUE-NEXT: local.get 0 14; MULTIVALUE-NEXT: local.get 1 15; MULTIVALUE-NEXT: local.get 2 16; MULTIVALUE-NEXT: local.get 3 17; MULTIVALUE-NEXT: call __divti3 18; MULTIVALUE-NEXT: # fallthrough-return 19; 20; NO_MULTIVALUE-LABEL: multivalue_sdiv: 21; NO_MULTIVALUE: .functype multivalue_sdiv (i32, i64, i64, i64, i64) -> () 22; NO_MULTIVALUE-NEXT: .local i32 23; NO_MULTIVALUE-NEXT: # %bb.0: 24; NO_MULTIVALUE-NEXT: global.get __stack_pointer 25; NO_MULTIVALUE-NEXT: i32.const 16 26; NO_MULTIVALUE-NEXT: i32.sub 27; NO_MULTIVALUE-NEXT: local.tee 5 28; NO_MULTIVALUE-NEXT: global.set __stack_pointer 29; NO_MULTIVALUE-NEXT: local.get 5 30; NO_MULTIVALUE-NEXT: local.get 1 31; NO_MULTIVALUE-NEXT: local.get 2 32; NO_MULTIVALUE-NEXT: local.get 3 33; NO_MULTIVALUE-NEXT: local.get 4 34; NO_MULTIVALUE-NEXT: call __divti3 35; NO_MULTIVALUE-NEXT: local.get 0 36; NO_MULTIVALUE-NEXT: local.get 5 37; NO_MULTIVALUE-NEXT: i64.load 8 38; NO_MULTIVALUE-NEXT: i64.store 8 39; NO_MULTIVALUE-NEXT: local.get 0 40; NO_MULTIVALUE-NEXT: local.get 5 41; NO_MULTIVALUE-NEXT: i64.load 0 42; NO_MULTIVALUE-NEXT: i64.store 0 43; NO_MULTIVALUE-NEXT: local.get 5 44; NO_MULTIVALUE-NEXT: i32.const 16 45; NO_MULTIVALUE-NEXT: i32.add 46; NO_MULTIVALUE-NEXT: global.set __stack_pointer 47; NO_MULTIVALUE-NEXT: # fallthrough-return 48 %div = sdiv i128 %a, %b 49 ret i128 %div 50} 51 52 53define fp128 @multivalue_fsub(fp128 %a, fp128 %b) { 54; MULTIVALUE-LABEL: multivalue_fsub: 55; MULTIVALUE: .functype multivalue_fsub (i64, i64, i64, i64) -> (i64, i64) 56; MULTIVALUE-NEXT: # %bb.0: 57; MULTIVALUE-NEXT: local.get 0 58; MULTIVALUE-NEXT: local.get 1 59; MULTIVALUE-NEXT: local.get 2 60; MULTIVALUE-NEXT: local.get 3 61; MULTIVALUE-NEXT: call __subtf3 62; MULTIVALUE-NEXT: # fallthrough-return 63; 64; NO_MULTIVALUE-LABEL: multivalue_fsub: 65; NO_MULTIVALUE: .functype multivalue_fsub (i32, i64, i64, i64, i64) -> () 66; NO_MULTIVALUE-NEXT: .local i32 67; NO_MULTIVALUE-NEXT: # %bb.0: 68; NO_MULTIVALUE-NEXT: global.get __stack_pointer 69; NO_MULTIVALUE-NEXT: i32.const 16 70; NO_MULTIVALUE-NEXT: i32.sub 71; NO_MULTIVALUE-NEXT: local.tee 5 72; NO_MULTIVALUE-NEXT: global.set __stack_pointer 73; NO_MULTIVALUE-NEXT: local.get 5 74; NO_MULTIVALUE-NEXT: local.get 1 75; NO_MULTIVALUE-NEXT: local.get 2 76; NO_MULTIVALUE-NEXT: local.get 3 77; NO_MULTIVALUE-NEXT: local.get 4 78; NO_MULTIVALUE-NEXT: call __subtf3 79; NO_MULTIVALUE-NEXT: local.get 0 80; NO_MULTIVALUE-NEXT: local.get 5 81; NO_MULTIVALUE-NEXT: i64.load 8 82; NO_MULTIVALUE-NEXT: i64.store 8 83; NO_MULTIVALUE-NEXT: local.get 0 84; NO_MULTIVALUE-NEXT: local.get 5 85; NO_MULTIVALUE-NEXT: i64.load 0 86; NO_MULTIVALUE-NEXT: i64.store 0 87; NO_MULTIVALUE-NEXT: local.get 5 88; NO_MULTIVALUE-NEXT: i32.const 16 89; NO_MULTIVALUE-NEXT: i32.add 90; NO_MULTIVALUE-NEXT: global.set __stack_pointer 91; NO_MULTIVALUE-NEXT: # fallthrough-return 92 %sub = fsub fp128 %a, %b 93 ret fp128 %sub 94} 95 96define i128 @multivalue_lshr(i128 %a, i128 %b) { 97; MULTIVALUE-LABEL: multivalue_lshr: 98; MULTIVALUE: .functype multivalue_lshr (i64, i64, i64, i64) -> (i64, i64) 99; MULTIVALUE-NEXT: # %bb.0: 100; MULTIVALUE-NEXT: local.get 2 101; MULTIVALUE-NEXT: local.get 3 102; MULTIVALUE-NEXT: local.get 0 103; MULTIVALUE-NEXT: i32.wrap_i64 104; MULTIVALUE-NEXT: call __ashlti3 105; MULTIVALUE-NEXT: # fallthrough-return 106; 107; NO_MULTIVALUE-LABEL: multivalue_lshr: 108; NO_MULTIVALUE: .functype multivalue_lshr (i32, i64, i64, i64, i64) -> () 109; NO_MULTIVALUE-NEXT: .local i32 110; NO_MULTIVALUE-NEXT: # %bb.0: 111; NO_MULTIVALUE-NEXT: global.get __stack_pointer 112; NO_MULTIVALUE-NEXT: i32.const 16 113; NO_MULTIVALUE-NEXT: i32.sub 114; NO_MULTIVALUE-NEXT: local.tee 5 115; NO_MULTIVALUE-NEXT: global.set __stack_pointer 116; NO_MULTIVALUE-NEXT: local.get 5 117; NO_MULTIVALUE-NEXT: local.get 3 118; NO_MULTIVALUE-NEXT: local.get 4 119; NO_MULTIVALUE-NEXT: local.get 1 120; NO_MULTIVALUE-NEXT: i32.wrap_i64 121; NO_MULTIVALUE-NEXT: call __ashlti3 122; NO_MULTIVALUE-NEXT: local.get 0 123; NO_MULTIVALUE-NEXT: local.get 5 124; NO_MULTIVALUE-NEXT: i64.load 8 125; NO_MULTIVALUE-NEXT: i64.store 8 126; NO_MULTIVALUE-NEXT: local.get 0 127; NO_MULTIVALUE-NEXT: local.get 5 128; NO_MULTIVALUE-NEXT: i64.load 0 129; NO_MULTIVALUE-NEXT: i64.store 0 130; NO_MULTIVALUE-NEXT: local.get 5 131; NO_MULTIVALUE-NEXT: i32.const 16 132; NO_MULTIVALUE-NEXT: i32.add 133; NO_MULTIVALUE-NEXT: global.set __stack_pointer 134; NO_MULTIVALUE-NEXT: # fallthrough-return 135 %tmp = shl i128 %b, %a 136 ret i128 %tmp 137} 138