| ; 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 | 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 |
| } |