blob: 642290d4804b1db8188ea81f4a4326567c7ae749 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=wasm32-unknown-unknown -mattr=+simd128 | llc --mtriple=wasm32-unknown-unknown -mattr=+simd128 -wasm-disable-explicit-locals -wasm-keep-registers | FileCheck %s
; Test that SLP vectorizer can vectorize consecutive sub-128-bit operations
; into SIMD when getMinVectorRegisterBitWidth is overriden to 32.
target triple = "wasm32-unknown-unknown"
define void @add_2xi32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: add_2xi32:
; CHECK: .functype add_2xi32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push1=, 0($0):p2align=2
; CHECK-NEXT: v128.load64_zero $push0=, 0($1):p2align=2
; CHECK-NEXT: i32x4.add $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=2, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i32, ptr %a
%a1p = getelementptr i32, ptr %a, i32 1
%a1 = load i32, ptr %a1p
%b0 = load i32, ptr %b
%b1p = getelementptr i32, ptr %b, i32 1
%b1 = load i32, ptr %b1p
%r0 = add i32 %a0, %b0
%r1 = add i32 %a1, %b1
store i32 %r0, ptr %out
%o1 = getelementptr i32, ptr %out, i32 1
store i32 %r1, ptr %o1
ret void
}
define void @add_4xi16(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: add_4xi16:
; CHECK: .functype add_4xi16 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push1=, 0($0):p2align=1
; CHECK-NEXT: v128.load64_zero $push0=, 0($1):p2align=1
; CHECK-NEXT: i16x8.add $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=1, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%a2p = getelementptr i16, ptr %a, i32 2
%a2 = load i16, ptr %a2p
%a3p = getelementptr i16, ptr %a, i32 3
%a3 = load i16, ptr %a3p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%b2p = getelementptr i16, ptr %b, i32 2
%b2 = load i16, ptr %b2p
%b3p = getelementptr i16, ptr %b, i32 3
%b3 = load i16, ptr %b3p
%r0 = add i16 %a0, %b0
%r1 = add i16 %a1, %b1
%r2 = add i16 %a2, %b2
%r3 = add i16 %a3, %b3
store i16 %r0, ptr %out
%o1 = getelementptr i16, ptr %out, i32 1
store i16 %r1, ptr %o1
%o2 = getelementptr i16, ptr %out, i32 2
store i16 %r2, ptr %o2
%o3 = getelementptr i16, ptr %out, i32 3
store i16 %r3, ptr %o3
ret void
}
define void @add_8xi8(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: add_8xi8:
; CHECK: .functype add_8xi8 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push1=, 0($0):p2align=0
; CHECK-NEXT: v128.load64_zero $push0=, 0($1):p2align=0
; CHECK-NEXT: i8x16.add $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=0, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i8, ptr %a
%a1p = getelementptr i8, ptr %a, i32 1
%a1 = load i8, ptr %a1p
%a2p = getelementptr i8, ptr %a, i32 2
%a2 = load i8, ptr %a2p
%a3p = getelementptr i8, ptr %a, i32 3
%a3 = load i8, ptr %a3p
%a4p = getelementptr i8, ptr %a, i32 4
%a4 = load i8, ptr %a4p
%a5p = getelementptr i8, ptr %a, i32 5
%a5 = load i8, ptr %a5p
%a6p = getelementptr i8, ptr %a, i32 6
%a6 = load i8, ptr %a6p
%a7p = getelementptr i8, ptr %a, i32 7
%a7 = load i8, ptr %a7p
%b0 = load i8, ptr %b
%b1p = getelementptr i8, ptr %b, i32 1
%b1 = load i8, ptr %b1p
%b2p = getelementptr i8, ptr %b, i32 2
%b2 = load i8, ptr %b2p
%b3p = getelementptr i8, ptr %b, i32 3
%b3 = load i8, ptr %b3p
%b4p = getelementptr i8, ptr %b, i32 4
%b4 = load i8, ptr %b4p
%b5p = getelementptr i8, ptr %b, i32 5
%b5 = load i8, ptr %b5p
%b6p = getelementptr i8, ptr %b, i32 6
%b6 = load i8, ptr %b6p
%b7p = getelementptr i8, ptr %b, i32 7
%b7 = load i8, ptr %b7p
%r0 = add i8 %a0, %b0
%r1 = add i8 %a1, %b1
%r2 = add i8 %a2, %b2
%r3 = add i8 %a3, %b3
%r4 = add i8 %a4, %b4
%r5 = add i8 %a5, %b5
%r6 = add i8 %a6, %b6
%r7 = add i8 %a7, %b7
store i8 %r0, ptr %out
%o1 = getelementptr i8, ptr %out, i32 1
store i8 %r1, ptr %o1
%o2 = getelementptr i8, ptr %out, i32 2
store i8 %r2, ptr %o2
%o3 = getelementptr i8, ptr %out, i32 3
store i8 %r3, ptr %o3
%o4 = getelementptr i8, ptr %out, i32 4
store i8 %r4, ptr %o4
%o5 = getelementptr i8, ptr %out, i32 5
store i8 %r5, ptr %o5
%o6 = getelementptr i8, ptr %out, i32 6
store i8 %r6, ptr %o6
%o7 = getelementptr i8, ptr %out, i32 7
store i8 %r7, ptr %o7
ret void
}
define void @add_2xf32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: add_2xf32:
; CHECK: .functype add_2xf32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push1=, 0($0):p2align=2
; CHECK-NEXT: v128.load64_zero $push0=, 0($1):p2align=2
; CHECK-NEXT: f32x4.add $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=2, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load float, ptr %a
%a1p = getelementptr float, ptr %a, i32 1
%a1 = load float, ptr %a1p
%b0 = load float, ptr %b
%b1p = getelementptr float, ptr %b, i32 1
%b1 = load float, ptr %b1p
%r0 = fadd float %a0, %b0
%r1 = fadd float %a1, %b1
store float %r0, ptr %out
%o1 = getelementptr float, ptr %out, i32 1
store float %r1, ptr %o1
ret void
}
define void @add_2xi16(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: add_2xi16:
; CHECK: .functype add_2xi16 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push1=, 0($0):p2align=1
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=1
; CHECK-NEXT: i16x8.add $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store32_lane 0($2):p2align=1, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%r0 = add i16 %a0, %b0
%r1 = add i16 %a1, %b1
store i16 %r0, ptr %out
%o1 = getelementptr i16, ptr %out, i32 1
store i16 %r1, ptr %o1
ret void
}
define void @add_4xi8(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: add_4xi8:
; CHECK: .functype add_4xi8 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push1=, 0($0):p2align=0
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=0
; CHECK-NEXT: i8x16.add $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store32_lane 0($2):p2align=0, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i8, ptr %a
%a1p = getelementptr i8, ptr %a, i32 1
%a1 = load i8, ptr %a1p
%a2p = getelementptr i8, ptr %a, i32 2
%a2 = load i8, ptr %a2p
%a3p = getelementptr i8, ptr %a, i32 3
%a3 = load i8, ptr %a3p
%b0 = load i8, ptr %b
%b1p = getelementptr i8, ptr %b, i32 1
%b1 = load i8, ptr %b1p
%b2p = getelementptr i8, ptr %b, i32 2
%b2 = load i8, ptr %b2p
%b3p = getelementptr i8, ptr %b, i32 3
%b3 = load i8, ptr %b3p
%r0 = add i8 %a0, %b0
%r1 = add i8 %a1, %b1
%r2 = add i8 %a2, %b2
%r3 = add i8 %a3, %b3
store i8 %r0, ptr %out
%o1 = getelementptr i8, ptr %out, i32 1
store i8 %r1, ptr %o1
%o2 = getelementptr i8, ptr %out, i32 2
store i8 %r2, ptr %o2
%o3 = getelementptr i8, ptr %out, i32 3
store i8 %r3, ptr %o3
ret void
}
define void @sext_add_2xi16_to_i32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: sext_add_2xi16_to_i32:
; CHECK: .functype sext_add_2xi16_to_i32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push2=, 0($0):p2align=1
; CHECK-NEXT: i32x4.extend_low_i16x8_s $push3=, $pop2
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=1
; CHECK-NEXT: i32x4.extend_low_i16x8_s $push1=, $pop0
; CHECK-NEXT: i32x4.add $push4=, $pop3, $pop1
; CHECK-NEXT: v128.store64_lane 0($2):p2align=2, $pop4, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%ea0 = sext i16 %a0 to i32
%ea1 = sext i16 %a1 to i32
%eb0 = sext i16 %b0 to i32
%eb1 = sext i16 %b1 to i32
%r0 = add i32 %ea0, %eb0
%r1 = add i32 %ea1, %eb1
store i32 %r0, ptr %out
%o1 = getelementptr i32, ptr %out, i32 1
store i32 %r1, ptr %o1
ret void
}
define void @and_2xi32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: and_2xi32:
; CHECK: .functype and_2xi32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i64.load $push1=, 0($0):p2align=2
; CHECK-NEXT: i64.load $push0=, 0($1):p2align=2
; CHECK-NEXT: i64.and $push2=, $pop1, $pop0
; CHECK-NEXT: i64.store 0($2):p2align=2, $pop2
; CHECK-NEXT: # fallthrough-return
%a0 = load i32, ptr %a
%a1p = getelementptr i32, ptr %a, i32 1
%a1 = load i32, ptr %a1p
%b0 = load i32, ptr %b
%b1p = getelementptr i32, ptr %b, i32 1
%b1 = load i32, ptr %b1p
%r0 = and i32 %a0, %b0
%r1 = and i32 %a1, %b1
store i32 %r0, ptr %out
%o1 = getelementptr i32, ptr %out, i32 1
store i32 %r1, ptr %o1
ret void
}
define void @eq_2xi32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: eq_2xi32:
; CHECK: .functype eq_2xi32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push1=, 0($0):p2align=2
; CHECK-NEXT: v128.load64_zero $push0=, 0($1):p2align=2
; CHECK-NEXT: i32x4.eq $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=2, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i32, ptr %a
%a1p = getelementptr i32, ptr %a, i32 1
%a1 = load i32, ptr %a1p
%b0 = load i32, ptr %b
%b1p = getelementptr i32, ptr %b, i32 1
%b1 = load i32, ptr %b1p
%c0 = icmp eq i32 %a0, %b0
%c1 = icmp eq i32 %a1, %b1
%r0 = sext i1 %c0 to i32
%r1 = sext i1 %c1 to i32
store i32 %r0, ptr %out
%o1 = getelementptr i32, ptr %out, i32 1
store i32 %r1, ptr %o1
ret void
}
define void @neg_2xf32(ptr %a, ptr %out) {
; CHECK-LABEL: neg_2xf32:
; CHECK: .functype neg_2xf32 (i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push0=, 0($0):p2align=2
; CHECK-NEXT: f32x4.neg $push1=, $pop0
; CHECK-NEXT: v128.store64_lane 0($1):p2align=2, $pop1, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load float, ptr %a
%a1p = getelementptr float, ptr %a, i32 1
%a1 = load float, ptr %a1p
%r0 = fneg float %a0
%r1 = fneg float %a1
store float %r0, ptr %out
%o1 = getelementptr float, ptr %out, i32 1
store float %r1, ptr %o1
ret void
}
define void @min_2xf32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: min_2xf32:
; CHECK: .functype min_2xf32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load64_zero $push1=, 0($1):p2align=2
; CHECK-NEXT: v128.load64_zero $push0=, 0($0):p2align=2
; CHECK-NEXT: f32x4.pmin $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=2, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load float, ptr %a
%a1p = getelementptr float, ptr %a, i32 1
%a1 = load float, ptr %a1p
%b0 = load float, ptr %b
%b1p = getelementptr float, ptr %b, i32 1
%b1 = load float, ptr %b1p
%c0 = fcmp olt float %a0, %b0
%c1 = fcmp olt float %a1, %b1
%r0 = select i1 %c0, float %a0, float %b0
%r1 = select i1 %c1, float %a1, float %b1
store float %r0, ptr %out
%o1 = getelementptr float, ptr %out, i32 1
store float %r1, ptr %o1
ret void
}
; Widening multiply: v128.load32_zero + i32x4.extmul_low_i16x8_s
define void @extmul_2xi16_to_i32(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: extmul_2xi16_to_i32:
; CHECK: .functype extmul_2xi16_to_i32 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push1=, 0($0):p2align=1
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=1
; CHECK-NEXT: i32x4.extmul_low_i16x8_s $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store64_lane 0($2):p2align=2, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%ea0 = sext i16 %a0 to i32
%ea1 = sext i16 %a1 to i32
%eb0 = sext i16 %b0 to i32
%eb1 = sext i16 %b1 to i32
%r0 = mul i32 %ea0, %eb0
%r1 = mul i32 %ea1, %eb1
store i32 %r0, ptr %out
%o1 = getelementptr i32, ptr %out, i32 1
store i32 %r1, ptr %o1
ret void
}
define void @sub_2xi16(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: sub_2xi16:
; CHECK: .functype sub_2xi16 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push1=, 0($0):p2align=1
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=1
; CHECK-NEXT: i16x8.sub $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store32_lane 0($2):p2align=1, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%r0 = sub i16 %a0, %b0
%r1 = sub i16 %a1, %b1
store i16 %r0, ptr %out
%o1 = getelementptr i16, ptr %out, i32 1
store i16 %r1, ptr %o1
ret void
}
define void @and_2xi16(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: and_2xi16:
; CHECK: .functype and_2xi16 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.load $push1=, 0($0):p2align=1
; CHECK-NEXT: i32.load $push0=, 0($1):p2align=1
; CHECK-NEXT: i32.and $push2=, $pop1, $pop0
; CHECK-NEXT: i32.store 0($2):p2align=1, $pop2
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%r0 = and i16 %a0, %b0
%r1 = and i16 %a1, %b1
store i16 %r0, ptr %out
%o1 = getelementptr i16, ptr %out, i32 1
store i16 %r1, ptr %o1
ret void
}
define void @or_4xi8(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: or_4xi8:
; CHECK: .functype or_4xi8 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: i32.load $push1=, 0($0):p2align=0
; CHECK-NEXT: i32.load $push0=, 0($1):p2align=0
; CHECK-NEXT: i32.or $push2=, $pop1, $pop0
; CHECK-NEXT: i32.store 0($2):p2align=0, $pop2
; CHECK-NEXT: # fallthrough-return
%a0 = load i8, ptr %a
%a1p = getelementptr i8, ptr %a, i32 1
%a1 = load i8, ptr %a1p
%a2p = getelementptr i8, ptr %a, i32 2
%a2 = load i8, ptr %a2p
%a3p = getelementptr i8, ptr %a, i32 3
%a3 = load i8, ptr %a3p
%b0 = load i8, ptr %b
%b1p = getelementptr i8, ptr %b, i32 1
%b1 = load i8, ptr %b1p
%b2p = getelementptr i8, ptr %b, i32 2
%b2 = load i8, ptr %b2p
%b3p = getelementptr i8, ptr %b, i32 3
%b3 = load i8, ptr %b3p
%r0 = or i8 %a0, %b0
%r1 = or i8 %a1, %b1
%r2 = or i8 %a2, %b2
%r3 = or i8 %a3, %b3
store i8 %r0, ptr %out
%o1 = getelementptr i8, ptr %out, i32 1
store i8 %r1, ptr %o1
%o2 = getelementptr i8, ptr %out, i32 2
store i8 %r2, ptr %o2
%o3 = getelementptr i8, ptr %out, i32 3
store i8 %r3, ptr %o3
ret void
}
define void @sub_4xi8(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: sub_4xi8:
; CHECK: .functype sub_4xi8 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push1=, 0($0):p2align=0
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=0
; CHECK-NEXT: i8x16.sub $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store32_lane 0($2):p2align=0, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i8, ptr %a
%a1p = getelementptr i8, ptr %a, i32 1
%a1 = load i8, ptr %a1p
%a2p = getelementptr i8, ptr %a, i32 2
%a2 = load i8, ptr %a2p
%a3p = getelementptr i8, ptr %a, i32 3
%a3 = load i8, ptr %a3p
%b0 = load i8, ptr %b
%b1p = getelementptr i8, ptr %b, i32 1
%b1 = load i8, ptr %b1p
%b2p = getelementptr i8, ptr %b, i32 2
%b2 = load i8, ptr %b2p
%b3p = getelementptr i8, ptr %b, i32 3
%b3 = load i8, ptr %b3p
%r0 = sub i8 %a0, %b0
%r1 = sub i8 %a1, %b1
%r2 = sub i8 %a2, %b2
%r3 = sub i8 %a3, %b3
store i8 %r0, ptr %out
%o1 = getelementptr i8, ptr %out, i32 1
store i8 %r1, ptr %o1
%o2 = getelementptr i8, ptr %out, i32 2
store i8 %r2, ptr %o2
%o3 = getelementptr i8, ptr %out, i32 3
store i8 %r3, ptr %o3
ret void
}
define void @eq_2xi16(ptr %a, ptr %b, ptr %out) {
; CHECK-LABEL: eq_2xi16:
; CHECK: .functype eq_2xi16 (i32, i32, i32) -> ()
; CHECK-NEXT: # %bb.0:
; CHECK-NEXT: v128.load32_zero $push1=, 0($0):p2align=1
; CHECK-NEXT: v128.load32_zero $push0=, 0($1):p2align=1
; CHECK-NEXT: i16x8.eq $push2=, $pop1, $pop0
; CHECK-NEXT: v128.store32_lane 0($2):p2align=1, $pop2, 0
; CHECK-NEXT: # fallthrough-return
%a0 = load i16, ptr %a
%a1p = getelementptr i16, ptr %a, i32 1
%a1 = load i16, ptr %a1p
%b0 = load i16, ptr %b
%b1p = getelementptr i16, ptr %b, i32 1
%b1 = load i16, ptr %b1p
%c0 = icmp eq i16 %a0, %b0
%c1 = icmp eq i16 %a1, %b1
%r0 = sext i1 %c0 to i16
%r1 = sext i1 %c1 to i16
store i16 %r0, ptr %out
%o1 = getelementptr i16, ptr %out, i32 1
store i16 %r1, ptr %o1
ret void
}