blob: 5819d948b21746cdbec20565e1d7514ad96c8fa1 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc < %s -O0 --global-isel -disable-wasm-fallthrough-return-opt -wasm-keep-registers | FileCheck %s
target triple = "wasm32-unknown-unknown"
declare i8 @llvm.fshr.i8(i8, i8, i8)
declare i16 @llvm.fshr.i16(i16, i16, i16)
declare i32 @llvm.fshr.i32(i32, i32, i32)
declare i64 @llvm.fshr.i64(i64, i64, i64)
define i8 @fshr_i8(i8 %x, i8 %y) {
; CHECK-LABEL: fshr_i8:
; CHECK: .functype fshr_i8 (i32, i32) -> (i32)
; CHECK-NEXT: .local i32
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.const $push6=, 5
; CHECK-NEXT: local.set 2, $pop6
; CHECK-NEXT: local.get $push7=, 0
; CHECK-NEXT: i32.const $push4=, 3
; CHECK-NEXT: i32.shl $push3=, $pop7, $pop4
; CHECK-NEXT: local.get $push8=, 1
; CHECK-NEXT: i32.const $push5=, 255
; CHECK-NEXT: i32.and $push1=, $pop8, $pop5
; CHECK-NEXT: local.get $push9=, 2
; CHECK-NEXT: i32.shr_u $push2=, $pop1, $pop9
; CHECK-NEXT: i32.or $push0=, $pop3, $pop2
; CHECK-NEXT: return $pop0
%a = call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 5)
ret i8 %a
}
define i8 @fshrv_i8(i8 %x, i8 %y, i8 %z) {
; CHECK-LABEL: fshrv_i8:
; CHECK: .functype fshrv_i8 (i32, i32, i32) -> (i32)
; CHECK-NEXT: .local i32, i32, i32
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.const $push9=, 7
; CHECK-NEXT: local.set 3, $pop9
; CHECK-NEXT: local.get $push12=, 2
; CHECK-NEXT: local.get $push11=, 3
; CHECK-NEXT: i32.and $push10=, $pop12, $pop11
; CHECK-NEXT: local.set 4, $pop10
; CHECK-NEXT: local.get $push15=, 3
; CHECK-NEXT: local.get $push13=, 2
; CHECK-NEXT: i32.const $push7=, -1
; CHECK-NEXT: i32.xor $push6=, $pop13, $pop7
; CHECK-NEXT: i32.and $push14=, $pop15, $pop6
; CHECK-NEXT: local.set 5, $pop14
; CHECK-NEXT: local.get $push16=, 0
; CHECK-NEXT: i32.const $push5=, 1
; CHECK-NEXT: i32.shl $push4=, $pop16, $pop5
; CHECK-NEXT: local.get $push17=, 5
; CHECK-NEXT: i32.shl $push3=, $pop4, $pop17
; CHECK-NEXT: local.get $push18=, 1
; CHECK-NEXT: i32.const $push8=, 255
; CHECK-NEXT: i32.and $push1=, $pop18, $pop8
; CHECK-NEXT: local.get $push19=, 4
; CHECK-NEXT: i32.shr_u $push2=, $pop1, $pop19
; CHECK-NEXT: i32.or $push0=, $pop3, $pop2
; CHECK-NEXT: return $pop0
%a = call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 %z)
ret i8 %a
}
define i16 @fshr_i16(i16 %x, i16 %y) {
; CHECK-LABEL: fshr_i16:
; CHECK: .functype fshr_i16 (i32, i32) -> (i32)
; CHECK-NEXT: .local i32
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.const $push6=, 13
; CHECK-NEXT: local.set 2, $pop6
; CHECK-NEXT: local.get $push7=, 0
; CHECK-NEXT: i32.const $push4=, 3
; CHECK-NEXT: i32.shl $push3=, $pop7, $pop4
; CHECK-NEXT: local.get $push8=, 1
; CHECK-NEXT: i32.const $push5=, 65535
; CHECK-NEXT: i32.and $push1=, $pop8, $pop5
; CHECK-NEXT: local.get $push9=, 2
; CHECK-NEXT: i32.shr_u $push2=, $pop1, $pop9
; CHECK-NEXT: i32.or $push0=, $pop3, $pop2
; CHECK-NEXT: return $pop0
%a = call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 13)
ret i16 %a
}
define i16 @fshrv_i16(i16 %x, i16 %y, i16 %z) {
; CHECK-LABEL: fshrv_i16:
; CHECK: .functype fshrv_i16 (i32, i32, i32) -> (i32)
; CHECK-NEXT: .local i32, i32, i32
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.const $push9=, 15
; CHECK-NEXT: local.set 3, $pop9
; CHECK-NEXT: local.get $push12=, 2
; CHECK-NEXT: local.get $push11=, 3
; CHECK-NEXT: i32.and $push10=, $pop12, $pop11
; CHECK-NEXT: local.set 4, $pop10
; CHECK-NEXT: local.get $push15=, 3
; CHECK-NEXT: local.get $push13=, 2
; CHECK-NEXT: i32.const $push7=, -1
; CHECK-NEXT: i32.xor $push6=, $pop13, $pop7
; CHECK-NEXT: i32.and $push14=, $pop15, $pop6
; CHECK-NEXT: local.set 5, $pop14
; CHECK-NEXT: local.get $push16=, 0
; CHECK-NEXT: i32.const $push5=, 1
; CHECK-NEXT: i32.shl $push4=, $pop16, $pop5
; CHECK-NEXT: local.get $push17=, 5
; CHECK-NEXT: i32.shl $push3=, $pop4, $pop17
; CHECK-NEXT: local.get $push18=, 1
; CHECK-NEXT: i32.const $push8=, 65535
; CHECK-NEXT: i32.and $push1=, $pop18, $pop8
; CHECK-NEXT: local.get $push19=, 4
; CHECK-NEXT: i32.shr_u $push2=, $pop1, $pop19
; CHECK-NEXT: i32.or $push0=, $pop3, $pop2
; CHECK-NEXT: return $pop0
%a = call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 %z)
ret i16 %a
}
define i32 @fshr_i32(i32 %x, i32 %y) {
; CHECK-LABEL: fshr_i32:
; CHECK: .functype fshr_i32 (i32, i32) -> (i32)
; CHECK-NEXT: .local i32
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.const $push4=, 21
; CHECK-NEXT: local.set 2, $pop4
; CHECK-NEXT: local.get $push5=, 0
; CHECK-NEXT: i32.const $push1=, 11
; CHECK-NEXT: i32.shl $push2=, $pop5, $pop1
; CHECK-NEXT: local.get $push7=, 1
; CHECK-NEXT: local.get $push6=, 2
; CHECK-NEXT: i32.shr_u $push3=, $pop7, $pop6
; CHECK-NEXT: i32.or $push0=, $pop2, $pop3
; CHECK-NEXT: return $pop0
%a = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 21)
ret i32 %a
}
define i32 @fshrv_i32(i32 %x, i32 %y, i32 %z) {
; CHECK-LABEL: fshrv_i32:
; CHECK: .functype fshrv_i32 (i32, i32, i32) -> (i32)
; CHECK-NEXT: .local i32
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get $push7=, 2
; CHECK-NEXT: i32.const $push1=, -1
; CHECK-NEXT: i32.xor $push6=, $pop7, $pop1
; CHECK-NEXT: local.set 3, $pop6
; CHECK-NEXT: local.get $push8=, 0
; CHECK-NEXT: i32.const $push2=, 1
; CHECK-NEXT: i32.shl $push3=, $pop8, $pop2
; CHECK-NEXT: local.get $push9=, 3
; CHECK-NEXT: i32.shl $push4=, $pop3, $pop9
; CHECK-NEXT: local.get $push11=, 1
; CHECK-NEXT: local.get $push10=, 2
; CHECK-NEXT: i32.shr_u $push5=, $pop11, $pop10
; CHECK-NEXT: i32.or $push0=, $pop4, $pop5
; CHECK-NEXT: return $pop0
%a = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)
ret i32 %a
}
define i64 @fshr_i64(i64 %x, i64 %y) {
; CHECK-LABEL: fshr_i64:
; CHECK: .functype fshr_i64 (i64, i64) -> (i64)
; CHECK-NEXT: .local i64
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i64.const $push4=, 37
; CHECK-NEXT: local.set 2, $pop4
; CHECK-NEXT: local.get $push5=, 0
; CHECK-NEXT: i64.const $push1=, 27
; CHECK-NEXT: i64.shl $push2=, $pop5, $pop1
; CHECK-NEXT: local.get $push7=, 1
; CHECK-NEXT: local.get $push6=, 2
; CHECK-NEXT: i64.shr_u $push3=, $pop7, $pop6
; CHECK-NEXT: i64.or $push0=, $pop2, $pop3
; CHECK-NEXT: return $pop0
%a = call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 37)
ret i64 %a
}
define i64 @fshrv_i64(i64 %x, i64 %y, i64 %z) {
; CHECK-LABEL: fshrv_i64:
; CHECK: .functype fshrv_i64 (i64, i64, i64) -> (i64)
; CHECK-NEXT: .local i64
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: local.get $push7=, 2
; CHECK-NEXT: i64.const $push1=, -1
; CHECK-NEXT: i64.xor $push6=, $pop7, $pop1
; CHECK-NEXT: local.set 3, $pop6
; CHECK-NEXT: local.get $push8=, 0
; CHECK-NEXT: i64.const $push2=, 1
; CHECK-NEXT: i64.shl $push3=, $pop8, $pop2
; CHECK-NEXT: local.get $push9=, 3
; CHECK-NEXT: i64.shl $push4=, $pop3, $pop9
; CHECK-NEXT: local.get $push11=, 1
; CHECK-NEXT: local.get $push10=, 2
; CHECK-NEXT: i64.shr_u $push5=, $pop11, $pop10
; CHECK-NEXT: i64.or $push0=, $pop4, $pop5
; CHECK-NEXT: return $pop0
%a = call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 %z)
ret i64 %a
}