// File: /workspace/github_c_makefile_star2_O3/mjosaarinen[P]brutus/crypto_aead/shellaes128v1d5n64/ref/shellaes.c
// Function: KeySetupDec
void KeySetupDec(u32 mk[], u32 sk[], u32 isk[], u8 L[], u8 Lprime[], u8 keyprime[], const u32 rk[], const u8 key[]){

    int i;
    u32 temp;

    KeySetupEnc(mk, sk, L, Lprime, keyprime, rk, key);

    memcpy(isk, sk, 48*d);

    /*inverse the order of round keys for each auxiliary permutation */
    for(i=0; i<d; ++i){
        temp=isk[12*i  ]; isk[12*i  ]=isk[12*i+ 8]; isk[12*i+ 8]=temp;
        temp=isk[12*i+1]; isk[12*i+1]=isk[12*i+ 9]; isk[12*i+ 9]=temp;
        temp=isk[12*i+2]; isk[12*i+2]=isk[12*i+10]; isk[12*i+10]=temp;
        temp=isk[12*i+3]; isk[12*i+3]=isk[12*i+11]; isk[12*i+11]=temp;
    }


    /*apply inverse mixcolumn to the round keys*/
    for(i=0; i< 12*d; ++i){
        isk[i] =
			Td0[Te4[(isk[i] >> 24)       ] & 0xff] ^
			Td1[Te4[(isk[i] >> 16) & 0xff] & 0xff] ^
			Td2[Te4[(isk[i] >>  8) & 0xff] & 0xff] ^
			Td3[Te4[(isk[i]      ) & 0xff] & 0xff];
    }
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %r9, %rax
movq %rdx, %rbx
movq %rsi, %r14
movq 0x20(%rsp), %r9
movq 0x28(%rsp), %rdx
movq %rdx, (%rsp)
movq %rcx, %rdx
movq %r8, %rcx
movq %rax, %r8
callq 0x2210
movl $0xf0, %edx
movq %rbx, %rdi
movq %r14, %rsi
callq 0x2240
xorl %eax, %eax
vmovups (%rbx,%rax), %xmm0
vmovups 0x20(%rbx,%rax), %xmm1
vmovups %xmm1, (%rbx,%rax)
vmovups %xmm0, 0x20(%rbx,%rax)
addq $0x30, %rax
cmpq $0xf0, %rax
jne 0x3d91
vpmovsxbq 0x8400(%rip), %ymm0 # 0xc1bc
vpmovsxbq 0x83fb(%rip), %ymm1 # 0xc1c0
vpbroadcastq 0x8422(%rip), %ymm2 # 0xc1f0
xorl %eax, %eax
leaq 0x8829(%rip), %rcx      # 0xc600
vpbroadcastd 0x83e4(%rip), %ymm3 # 0xc1c4
vmovdqa 0x8378(%rip), %ymm4     # 0xc160
leaq 0x8411(%rip), %rdx      # 0xc200
leaq 0x8c0a(%rip), %rsi      # 0xca00
vmovdqa 0x8382(%rip), %ymm5     # 0xc180
leaq 0x8ffb(%rip), %rdi      # 0xce00
leaq 0x93f4(%rip), %r8       # 0xd200
vpbroadcastq %rax, %ymm6
vpor %ymm0, %ymm6, %ymm7
vpor %ymm1, %ymm6, %ymm6
vpcmpltuq %ymm2, %ymm6, %k0
vpcmpltuq %ymm2, %ymm7, %k1
kshiftlb $0x4, %k1, %k1
korb %k1, %k0, %k1
vmovdqu32 (%rbx,%rax,4), %ymm6 {%k1} {z}
vpsrld $0x18, %ymm6, %ymm7
kmovq %k1, %k2
vpxor %xmm8, %xmm8, %xmm8
vpgatherdd (%rcx,%ymm7,4), %ymm8 {%k2}
vpand %ymm3, %ymm8, %ymm7
kmovq %k1, %k2
vpxor %xmm8, %xmm8, %xmm8
vpgatherdd (%rdx,%ymm7,4), %ymm8 {%k2}
vpshufb %ymm4, %ymm6, %ymm7
kmovq %k1, %k2
vpxor %xmm9, %xmm9, %xmm9
vpgatherdd (%rcx,%ymm7,4), %ymm9 {%k2}
vpand %ymm3, %ymm9, %ymm7
kmovq %k1, %k2
vpxor %xmm9, %xmm9, %xmm9
vpgatherdd (%rsi,%ymm7,4), %ymm9 {%k2}
vpshufb %ymm5, %ymm6, %ymm7
kmovq %k1, %k2
vpxor %xmm10, %xmm10, %xmm10
vpgatherdd (%rcx,%ymm7,4), %ymm10 {%k2}
vpand %ymm3, %ymm10, %ymm7
kmovq %k1, %k2
vpxor %xmm10, %xmm10, %xmm10
vpgatherdd (%rdi,%ymm7,4), %ymm10 {%k2}
vpand %ymm3, %ymm6, %ymm6
kmovq %k1, %k2
vpxor %xmm7, %xmm7, %xmm7
vpgatherdd (%rcx,%ymm6,4), %ymm7 {%k2}
vpand %ymm3, %ymm7, %ymm6
kmovq %k1, %k2
vpxor %xmm7, %xmm7, %xmm7
vpgatherdd (%r8,%ymm6,4), %ymm7 {%k2}
vpxor %ymm8, %ymm9, %ymm6
vpternlogd $0x96, %ymm10, %ymm6, %ymm7
vmovdqu32 %ymm7, (%rbx,%rax,4) {%k1}
addq $0x8, %rax
cmpq $0x40, %rax
jne 0x3e0c
addq $0x8, %rsp
popq %rbx
popq %r14
vzeroupper
retq