; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc < %s -verify-machineinstrs -mcpu=mvp -mattr=+multivalue -target-abi=experimental-mv | FileCheck %s --check-prefix=MULTIVALUE
; RUN: llc < %s -verify-machineinstrs -mcpu=mvp | FileCheck %s --check-prefix=NO_MULTIVALUE
; Test libcall signatures when multivalue is enabled and disabled
target triple = "wasm32-unknown-unknown"
define i128 @multivalue_sdiv(i128 %a, i128 %b) {
; MULTIVALUE-LABEL: multivalue_sdiv:
; MULTIVALUE: .functype multivalue_sdiv (i64, i64, i64, i64) -> (i64, i64)
; MULTIVALUE-NEXT: # %bb.0:
; MULTIVALUE-NEXT: local.get 0
; MULTIVALUE-NEXT: local.get 1
; MULTIVALUE-NEXT: local.get 2
; MULTIVALUE-NEXT: local.get 3
; MULTIVALUE-NEXT: call __divti3
; MULTIVALUE-NEXT: # fallthrough-return
;
; NO_MULTIVALUE-LABEL: multivalue_sdiv:
; NO_MULTIVALUE: .functype multivalue_sdiv (i32, i64, i64, i64, i64) -> ()
; NO_MULTIVALUE-NEXT: .local i32
; NO_MULTIVALUE-NEXT: # %bb.0:
; NO_MULTIVALUE-NEXT: global.get __stack_pointer
; NO_MULTIVALUE-NEXT: i32.const 16
; NO_MULTIVALUE-NEXT: i32.sub
; NO_MULTIVALUE-NEXT: local.tee 5
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: local.get 1
; NO_MULTIVALUE-NEXT: local.get 2
; NO_MULTIVALUE-NEXT: local.get 3
; NO_MULTIVALUE-NEXT: local.get 4
; NO_MULTIVALUE-NEXT: call __divti3
; NO_MULTIVALUE-NEXT: local.get 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i32.const 8
; NO_MULTIVALUE-NEXT: i32.add
; NO_MULTIVALUE-NEXT: i64.load 0
; NO_MULTIVALUE-NEXT: i64.store 8
; NO_MULTIVALUE-NEXT: local.get 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i64.load 0
; NO_MULTIVALUE-NEXT: i64.store 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i32.const 16
; NO_MULTIVALUE-NEXT: i32.add
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
; NO_MULTIVALUE-NEXT: # fallthrough-return
%div = sdiv i128 %a, %b
ret i128 %div
}
define fp128 @multivalue_fsub(fp128 %a, fp128 %b) {
; MULTIVALUE-LABEL: multivalue_fsub:
; MULTIVALUE: .functype multivalue_fsub (i64, i64, i64, i64) -> (i64, i64)
; MULTIVALUE-NEXT: # %bb.0:
; MULTIVALUE-NEXT: local.get 0
; MULTIVALUE-NEXT: local.get 1
; MULTIVALUE-NEXT: local.get 2
; MULTIVALUE-NEXT: local.get 3
; MULTIVALUE-NEXT: call __subtf3
; MULTIVALUE-NEXT: # fallthrough-return
;
; NO_MULTIVALUE-LABEL: multivalue_fsub:
; NO_MULTIVALUE: .functype multivalue_fsub (i32, i64, i64, i64, i64) -> ()
; NO_MULTIVALUE-NEXT: .local i32
; NO_MULTIVALUE-NEXT: # %bb.0:
; NO_MULTIVALUE-NEXT: global.get __stack_pointer
; NO_MULTIVALUE-NEXT: i32.const 16
; NO_MULTIVALUE-NEXT: i32.sub
; NO_MULTIVALUE-NEXT: local.tee 5
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: local.get 1
; NO_MULTIVALUE-NEXT: local.get 2
; NO_MULTIVALUE-NEXT: local.get 3
; NO_MULTIVALUE-NEXT: local.get 4
; NO_MULTIVALUE-NEXT: call __subtf3
; NO_MULTIVALUE-NEXT: local.get 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i32.const 8
; NO_MULTIVALUE-NEXT: i32.add
; NO_MULTIVALUE-NEXT: i64.load 0
; NO_MULTIVALUE-NEXT: i64.store 8
; NO_MULTIVALUE-NEXT: local.get 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i64.load 0
; NO_MULTIVALUE-NEXT: i64.store 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i32.const 16
; NO_MULTIVALUE-NEXT: i32.add
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
; NO_MULTIVALUE-NEXT: # fallthrough-return
%sub = fsub fp128 %a, %b
ret fp128 %sub
}
define i128 @multivalue_lshr(i128 %a, i128 %b) {
; MULTIVALUE-LABEL: multivalue_lshr:
; MULTIVALUE: .functype multivalue_lshr (i64, i64, i64, i64) -> (i64, i64)
; MULTIVALUE-NEXT: # %bb.0:
; MULTIVALUE-NEXT: local.get 2
; MULTIVALUE-NEXT: local.get 3
; MULTIVALUE-NEXT: local.get 0
; MULTIVALUE-NEXT: i32.wrap_i64
; MULTIVALUE-NEXT: call __ashlti3
; MULTIVALUE-NEXT: # fallthrough-return
;
; NO_MULTIVALUE-LABEL: multivalue_lshr:
; NO_MULTIVALUE: .functype multivalue_lshr (i32, i64, i64, i64, i64) -> ()
; NO_MULTIVALUE-NEXT: .local i32
; NO_MULTIVALUE-NEXT: # %bb.0:
; NO_MULTIVALUE-NEXT: global.get __stack_pointer
; NO_MULTIVALUE-NEXT: i32.const 16
; NO_MULTIVALUE-NEXT: i32.sub
; NO_MULTIVALUE-NEXT: local.tee 5
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: local.get 3
; NO_MULTIVALUE-NEXT: local.get 4
; NO_MULTIVALUE-NEXT: local.get 1
; NO_MULTIVALUE-NEXT: i32.wrap_i64
; NO_MULTIVALUE-NEXT: call __ashlti3
; NO_MULTIVALUE-NEXT: local.get 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i32.const 8
; NO_MULTIVALUE-NEXT: i32.add
; NO_MULTIVALUE-NEXT: i64.load 0
; NO_MULTIVALUE-NEXT: i64.store 8
; NO_MULTIVALUE-NEXT: local.get 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i64.load 0
; NO_MULTIVALUE-NEXT: i64.store 0
; NO_MULTIVALUE-NEXT: local.get 5
; NO_MULTIVALUE-NEXT: i32.const 16
; NO_MULTIVALUE-NEXT: i32.add
; NO_MULTIVALUE-NEXT: global.set __stack_pointer
; NO_MULTIVALUE-NEXT: # fallthrough-return
%tmp = shl i128 %b, %a
ret i128 %tmp
}