#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ abort();
int /*<<< orphan*/ movi_msl16(int *);
int /*<<< orphan*/ movi_msl8(int *);
int /*<<< orphan*/ mvni_msl16(int *);
int /*<<< orphan*/ mvni_msl8(int *);
int main(void) {
  int a[16] = {0};
  int i;
  movi_msl8(a);
  for (i = 0; i < 16; i++)
    if (a[i] != 0xabff)
      abort();
  ;
  movi_msl16(a);
  for (i = 0; i < 16; i++)
    if (a[i] != 0xabffff)
      abort();
  ;
  mvni_msl8(a);
  for (i = 0; i < 16; i++)
    if (a[i] != 0xffff5400)
      abort();
  ;
  mvni_msl16(a);
  for (i = 0; i < 16; i++)
    if (a[i] != 0xff540000)
      abort();
  ;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movl   $0x0,-0x4(%rbp)
lea    -0x50(%rbp),%rdi
xor    %esi,%esi
mov    $0x40,%edx
call   1060 <memset@plt>
lea    -0x50(%rbp),%rdi
call   1040 <movi_msl8@plt>
movl   $0x0,-0x54(%rbp)
cmpl   $0x10,-0x54(%rbp)
jge    11c5 <main+0x65>
movslq -0x54(%rbp),%rax
cmpl   $0xabff,-0x50(%rbp,%rax,4)
je     11b2 <main+0x52>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    11b7 <main+0x57>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    118f <main+0x2f>
lea    -0x50(%rbp),%rdi
call   1070 <movi_msl16@plt>
movl   $0x0,-0x54(%rbp)
cmpl   $0x10,-0x54(%rbp)
jge    120b <main+0xab>
movslq -0x54(%rbp),%rax
cmpl   $0xabffff,-0x50(%rbp,%rax,4)
je     11f8 <main+0x98>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    11fd <main+0x9d>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    11d5 <main+0x75>
lea    -0x50(%rbp),%rdi
call   1080 <mvni_msl8@plt>
movl   $0x0,-0x54(%rbp)
cmpl   $0x10,-0x54(%rbp)
jge    1251 <main+0xf1>
movslq -0x54(%rbp),%rax
cmpl   $0xffff5400,-0x50(%rbp,%rax,4)
ff
je     123e <main+0xde>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    1243 <main+0xe3>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    121b <main+0xbb>
lea    -0x50(%rbp),%rdi
call   1050 <mvni_msl16@plt>
movl   $0x0,-0x54(%rbp)
cmpl   $0x10,-0x54(%rbp)
jge    1297 <main+0x137>
movslq -0x54(%rbp),%rax
cmpl   $0xff540000,-0x50(%rbp,%rax,4)
ff
je     1284 <main+0x124>
mov    $0x0,%al
call   1030 <abort@plt>
jmp    1289 <main+0x129>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1261 <main+0x101>
xor    %eax,%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
sub    $0x48,%rsp
pxor   %xmm0,%xmm0
movdqa %xmm0,0x30(%rsp)
movdqa %xmm0,0x20(%rsp)
movdqa %xmm0,0x10(%rsp)
movdqa %xmm0,(%rsp)
mov    %rsp,%rdi
call   1040 <movi_msl8@plt>
cmpl   $0xabff,(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x4(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x8(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0xc(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x10(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x14(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x18(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x1c(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x20(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x24(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x28(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x2c(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x30(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x34(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x38(%rsp)
jne    1372 <main+0x222>
cmpl   $0xabff,0x3c(%rsp)
jne    1372 <main+0x222>
mov    %rsp,%rdi
call   1060 <movi_msl16@plt>
movdqa 0xd9a(%rip),%xmm0
movdqa 0x30(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pcmpeqd %xmm3,%xmm3
pxor   %xmm3,%xmm1
movdqa 0x20(%rsp),%xmm2
pcmpeqd %xmm0,%xmm2
pxor   %xmm3,%xmm2
packssdw %xmm1,%xmm2
movdqa 0x10(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pxor   %xmm3,%xmm1
pcmpeqd (%rsp),%xmm0
pxor   %xmm3,%xmm0
packssdw %xmm1,%xmm0
packsswb %xmm2,%xmm0
pmovmskb %xmm0,%eax
test   %eax,%eax
jne    1372 <main+0x222>
mov    %rsp,%rdi
call   1070 <mvni_msl8@plt>
movdqa 0xd4b(%rip),%xmm0
movdqa 0x30(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pcmpeqd %xmm3,%xmm3
pxor   %xmm3,%xmm1
movdqa 0x20(%rsp),%xmm2
pcmpeqd %xmm0,%xmm2
pxor   %xmm3,%xmm2
packssdw %xmm1,%xmm2
movdqa 0x10(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pxor   %xmm3,%xmm1
pcmpeqd (%rsp),%xmm0
pxor   %xmm3,%xmm0
packssdw %xmm1,%xmm0
packsswb %xmm2,%xmm0
pmovmskb %xmm0,%eax
test   %eax,%eax
jne    1372 <main+0x222>
mov    %rsp,%rdi
call   1050 <mvni_msl16@plt>
movdqa 0xd00(%rip),%xmm0
movdqa 0x30(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pcmpeqd %xmm2,%xmm2
pxor   %xmm2,%xmm1
movdqa 0x20(%rsp),%xmm3
pcmpeqd %xmm0,%xmm3
pxor   %xmm2,%xmm3
packssdw %xmm1,%xmm3
movdqa 0x10(%rsp),%xmm1
pcmpeqd %xmm0,%xmm1
pxor   %xmm2,%xmm1
pcmpeqd (%rsp),%xmm0
pxor   %xmm2,%xmm0
packssdw %xmm1,%xmm0
packsswb %xmm3,%xmm0
pmovmskb %xmm0,%eax
test   %eax,%eax
jne    1372 <main+0x222>
xor    %eax,%eax
add    $0x48,%rsp
ret
xor    %eax,%eax
call   1030 <abort@plt>

LLVM IR (-O0):
define i32 @main() {
%1 = alloca i32
%2 = alloca [16 x i32]
%3 = alloca i32
store i32 0, i32* %1
%4 = bitcast [16 x i32]* %2 to i8*
%5 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 0
%6 = call i32 @movi_msl8(i32* %5)
store i32 0, i32* %3
br label %7
7: ; preds = %19, %0
%8 = load i32, i32* %3
%9 = icmp slt i32 %8, 16
br i1 %9, label %10, label %22
10: ; preds = %7
%11 = load i32, i32* %3
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %12
%14 = load i32, i32* %13
%15 = icmp ne i32 %14, 44031
br i1 %15, label %16, label %18
16: ; preds = %10
%17 = call i32 (...) @abort()
unreachable
18: ; preds = %10
br label %19
19: ; preds = %18
%20 = load i32, i32* %3
%21 = add nsw i32 %20, 1
store i32 %21, i32* %3
br label %7
22: ; preds = %7
%23 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 0
%24 = call i32 @movi_msl16(i32* %23)
store i32 0, i32* %3
br label %25
25: ; preds = %37, %22
%26 = load i32, i32* %3
%27 = icmp slt i32 %26, 16
br i1 %27, label %28, label %40
28: ; preds = %25
%29 = load i32, i32* %3
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %30
%32 = load i32, i32* %31
%33 = icmp ne i32 %32, 11272191
br i1 %33, label %34, label %36
34: ; preds = %28
%35 = call i32 (...) @abort()
unreachable
36: ; preds = %28
br label %37
37: ; preds = %36
%38 = load i32, i32* %3
%39 = add nsw i32 %38, 1
store i32 %39, i32* %3
br label %25
40: ; preds = %25
%41 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 0
%42 = call i32 @mvni_msl8(i32* %41)
store i32 0, i32* %3
br label %43
43: ; preds = %55, %40
%44 = load i32, i32* %3
%45 = icmp slt i32 %44, 16
br i1 %45, label %46, label %58
46: ; preds = %43
%47 = load i32, i32* %3
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %48
%50 = load i32, i32* %49
%51 = icmp ne i32 %50, -44032
br i1 %51, label %52, label %54
52: ; preds = %46
%53 = call i32 (...) @abort()
unreachable
54: ; preds = %46
br label %55
55: ; preds = %54
%56 = load i32, i32* %3
%57 = add nsw i32 %56, 1
store i32 %57, i32* %3
br label %43
58: ; preds = %43
%59 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 0
%60 = call i32 @mvni_msl16(i32* %59)
store i32 0, i32* %3
br label %61
61: ; preds = %73, %58
%62 = load i32, i32* %3
%63 = icmp slt i32 %62, 16
br i1 %63, label %64, label %76
64: ; preds = %61
%65 = load i32, i32* %3
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds [16 x i32], [16 x i32]* %2, i64 0, i64 %66
%68 = load i32, i32* %67
%69 = icmp ne i32 %68, -11272192
br i1 %69, label %70, label %72
70: ; preds = %64
%71 = call i32 (...) @abort()
unreachable
72: ; preds = %64
br label %73
73: ; preds = %72
%74 = load i32, i32* %3
%75 = add nsw i32 %74, 1
store i32 %75, i32* %3
br label %61
76: ; preds = %61
ret i32 0
}

LLVM IR (-O2):
define i32 @main() {
%1 = alloca <16 x i32>
%2 = bitcast <16 x i32>* %1 to i8*
%3 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 0
%4 = call i32 @movi_msl8(i32* %3)
%5 = load i32, i32* %3
%6 = icmp eq i32 %5, 44031
%7 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 1
%8 = load i32, i32* %7
%9 = icmp eq i32 %8, 44031
%10 = select i1 %6, i1 %9, i1 false
%11 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 2
%12 = load i32, i32* %11
%13 = icmp eq i32 %12, 44031
%14 = select i1 %10, i1 %13, i1 false
%15 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 3
%16 = load i32, i32* %15
%17 = icmp eq i32 %16, 44031
%18 = select i1 %14, i1 %17, i1 false
%19 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 4
%20 = load i32, i32* %19
%21 = icmp eq i32 %20, 44031
%22 = select i1 %18, i1 %21, i1 false
%23 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 5
%24 = load i32, i32* %23
%25 = icmp eq i32 %24, 44031
%26 = select i1 %22, i1 %25, i1 false
%27 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 6
%28 = load i32, i32* %27
%29 = icmp eq i32 %28, 44031
%30 = select i1 %26, i1 %29, i1 false
%31 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 7
%32 = load i32, i32* %31
%33 = icmp eq i32 %32, 44031
%34 = select i1 %30, i1 %33, i1 false
%35 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 8
%36 = load i32, i32* %35
%37 = icmp eq i32 %36, 44031
%38 = select i1 %34, i1 %37, i1 false
%39 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 9
%40 = load i32, i32* %39
%41 = icmp eq i32 %40, 44031
%42 = select i1 %38, i1 %41, i1 false
%43 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 10
%44 = load i32, i32* %43
%45 = icmp eq i32 %44, 44031
%46 = select i1 %42, i1 %45, i1 false
%47 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 11
%48 = load i32, i32* %47
%49 = icmp eq i32 %48, 44031
%50 = select i1 %46, i1 %49, i1 false
%51 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 12
%52 = load i32, i32* %51
%53 = icmp eq i32 %52, 44031
%54 = select i1 %50, i1 %53, i1 false
%55 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 13
%56 = load i32, i32* %55
%57 = icmp eq i32 %56, 44031
%58 = select i1 %54, i1 %57, i1 false
%59 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 14
%60 = load i32, i32* %59
%61 = icmp eq i32 %60, 44031
%62 = select i1 %58, i1 %61, i1 false
%63 = getelementptr inbounds <16 x i32>, <16 x i32>* %1, i64 0, i64 15
%64 = load i32, i32* %63
%65 = icmp eq i32 %64, 44031
%66 = select i1 %62, i1 %65, i1 false
br i1 %66, label %67, label %74
67: ; preds = %0
%68 = call i32 @movi_msl16(i32* %3)
%69 = load <16 x i32>, <16 x i32>* %1
%70 = freeze <16 x i32> %69
%71 = icmp ne <16 x i32> %70, <i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191, i32 11272191>
%72 = bitcast <16 x i1> %71 to i16
%73 = icmp eq i16 %72, 0
br i1 %73, label %76, label %83
74: ; preds = %0
%75 = call i32 (...) @abort()
unreachable
76: ; preds = %67
%77 = call i32 @mvni_msl8(i32* %3)
%78 = load <16 x i32>, <16 x i32>* %1
%79 = freeze <16 x i32> %78
%80 = icmp ne <16 x i32> %79, <i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032, i32 -44032>
%81 = bitcast <16 x i1> %80 to i16
%82 = icmp eq i16 %81, 0
br i1 %82, label %85, label %92
83: ; preds = %67
%84 = call i32 (...) @abort()
unreachable
85: ; preds = %76
%86 = call i32 @mvni_msl16(i32* %3)
%87 = load <16 x i32>, <16 x i32>* %1
%88 = freeze <16 x i32> %87
%89 = icmp ne <16 x i32> %88, <i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192, i32 -11272192>
%90 = bitcast <16 x i1> %89 to i16
%91 = icmp eq i16 %90, 0
br i1 %91, label %94, label %95
92: ; preds = %76
%93 = call i32 (...) @abort()
unreachable
94: ; preds = %85
ret i32 0
95: ; preds = %85
%96 = call i32 (...) @abort()
unreachable
}