// File: /workspace/github_cpp_makefile_star2_O2/bothaynahazem[P]AsuMathLabG13/Matrix2017.cpp
// Function: Matrix::pow(Matrix&, double)
Matrix Matrix::pow(Matrix&s,double x)
{
    if(s.nRows!=s.nColumns)throw("Invalid matrix dimensions");
    if(x<-1)throw("Invalid Power");
    if(x==0)
    {
        if(s.type=="complex")
        {
        Matrix m("complex",s.nRows,s.nColumns,MI_EYE);
        return m;
        }
        else
        {
        Matrix m(s.nRows,s.nColumns,MI_EYE);
        return m;
        }
    }
    else if(x==1)
    {
        if(s.type=="complex")
        {

        Matrix m("complex",s.nRows,s.nColumns);
         m.copy(s);
         return m;
        }
        else{
        Matrix m(s.nRows,s.nColumns);
         m.copy(s);
         return m;
        }
    }
    else if(x==-1)
    {  if(s.type=="complex")
    {
        Matrix m("complex",s.nRows,s.nColumns);
        m=s.getInverse();
        return m;
    }
    else{
        Matrix m(s.nRows,s.nColumns);
        m=s.getInverse();
        return m;
    }
    }
    else
    {
        if(s.type=="complex")
        {
          Matrix m("complex",s.nRows,s.nColumns);
         m.copy(s);
         for(int i=1;i<x;i++)
          {
           m*=s;
           }
          return m;
        }
        else{
      Matrix m(s.nRows,s.nColumns);
      m.copy(s);
      for(int i=1;i<x;i++)
        {
           m*=s;
        }
     return m;
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x138, %rsp            # imm = 0x138
movl (%rsi), %eax
cmpl 0x4(%rsi), %eax
jne 0xde52
movsd 0x15e3(%rip), %xmm1     # 0xf160
ucomisd %xmm0, %xmm1
ja 0xde63
movq %rsi, %r14
movq %rdi, %rbx
xorpd %xmm1, %xmm1
leaq 0x18(%rsi), %rdi
leaq 0x1659(%rip), %rsi      # 0xf1f5
ucomisd %xmm1, %xmm0
jne 0xdbfb
jp 0xdbfb
callq 0x795a
testb %al, %al
je 0xdc68
leaq 0x163d(%rip), %rsi      # 0xf1f5
leaq -0xd8(%rbp), %rdi
leaq -0x58(%rbp), %rdx
callq 0x7844
movl (%r14), %edx
movl 0x4(%r14), %ecx
leaq -0xd8(%rbp), %rsi
pushq $0x2
popq %r8
xorpd %xmm0, %xmm0
xorpd %xmm1, %xmm1
movq %rbx, %rdi
callq 0xe29a
leaq -0xd8(%rbp), %rdi
callq 0x3170
jmp 0xddfd
ucomisd 0x1555(%rip), %xmm0     # 0xf158
jne 0xdc83
jp 0xdc83
callq 0x795a
testb %al, %al
je 0xdd1d
leaq 0x15da(%rip), %rsi      # 0xf1f5
leaq -0xb8(%rbp), %rdi
leaq -0x58(%rbp), %rdx
callq 0x7844
movl (%r14), %edx
movl 0x4(%r14), %ecx
leaq -0xb8(%rbp), %rsi
xorpd %xmm0, %xmm0
xorpd %xmm1, %xmm1
movq %rbx, %rdi
xorl %r8d, %r8d
callq 0xe29a
leaq -0xb8(%rbp), %rdi
callq 0x3170
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8dee
jmp 0xddfd
movl (%r14), %esi
movl 0x4(%r14), %edx
pushq $0x2
popq %rcx
xorpd %xmm0, %xmm0
movq %rbx, %rdi
callq 0x8ace
jmp 0xddfd
movsd %xmm0, -0x20(%rbp)
callq 0x795a
movsd -0x20(%rbp), %xmm0
ucomisd 0x14c6(%rip), %xmm0     # 0xf160
jne 0xdd42
jp 0xdd42
testb %al, %al
je 0xddb4
leaq 0x1540(%rip), %rsi      # 0xf1f5
leaq -0x98(%rbp), %rdi
leaq -0x58(%rbp), %rdx
callq 0x7844
movl (%r14), %edx
movl 0x4(%r14), %ecx
leaq -0x98(%rbp), %rsi
xorpd %xmm0, %xmm0
xorpd %xmm1, %xmm1
movq %rbx, %rdi
xorl %r8d, %r8d
callq 0xe29a
leaq -0x98(%rbp), %rdi
callq 0x3170
leaq -0x58(%rbp), %rdi
movq %r14, %rsi
callq 0xaeea
leaq -0x148(%rbp), %rdi
leaq -0x58(%rbp), %rdx
movq %rbx, %rsi
callq 0x9e42
leaq -0x148(%rbp), %rdi
jmp 0xddef
movl (%r14), %esi
movl 0x4(%r14), %edx
xorpd %xmm0, %xmm0
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x8ace
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8dee
jmp 0xddfd
testb %al, %al
je 0xde0e
leaq 0x14a4(%rip), %rsi      # 0xf1f5
leaq -0x78(%rbp), %rdi
leaq -0x58(%rbp), %rdx
callq 0x7844
movl (%r14), %edx
movl 0x4(%r14), %ecx
leaq -0x78(%rbp), %rsi
xorpd %xmm0, %xmm0
xorpd %xmm1, %xmm1
movq %rbx, %rdi
xorl %r8d, %r8d
callq 0xe29a
leaq -0x78(%rbp), %rdi
callq 0x3170
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8dee
pushq $0x1
popq %r15
cvtsi2sd %r15d, %xmm0
movsd -0x20(%rbp), %xmm1
ucomisd %xmm0, %xmm1
jbe 0xddfd
movq %rbx, %rdi
movq %r14, %rsi
callq 0xa62a
incl %r15d
jmp 0xdd94
movl (%r14), %esi
movl 0x4(%r14), %edx
xorpd %xmm0, %xmm0
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x8ace
leaq -0x58(%rbp), %rdi
movq %r14, %rsi
callq 0xaeea
leaq -0x110(%rbp), %rdi
leaq -0x58(%rbp), %rdx
movq %rbx, %rsi
callq 0x9e42
leaq -0x110(%rbp), %rdi
callq 0x8a24
leaq -0x58(%rbp), %rdi
callq 0x8a24
movq %rbx, %rax
addq $0x138, %rsp            # imm = 0x138
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
movl (%r14), %esi
movl 0x4(%r14), %edx
xorpd %xmm0, %xmm0
movq %rbx, %rdi
xorl %ecx, %ecx
callq 0x8ace
movq %rbx, %rdi
movq %r14, %rsi
callq 0x8dee
pushq $0x1
popq %r15
cvtsi2sd %r15d, %xmm0
movsd -0x20(%rbp), %xmm1
ucomisd %xmm0, %xmm1
jbe 0xddfd
movq %rbx, %rdi
movq %r14, %rsi
callq 0xa62a
incl %r15d
jmp 0xde32
pushq $0x8
popq %rdi
callq 0x31a0
leaq 0x1496(%rip), %rcx      # 0xf2f7
jmp 0xde72
pushq $0x8
popq %rdi
callq 0x31a0
leaq 0x149f(%rip), %rcx      # 0xf311
movq %rcx, (%rax)
movq 0x614c(%rip), %rsi      # 0x13fc8
movq %rax, %rdi
xorl %edx, %edx
callq 0x34e0
jmp 0xdee1
movq %rax, %r14
leaq -0x78(%rbp), %rdi
jmp 0xded3
jmp 0xdee1
jmp 0xdeda
jmp 0xde99
jmp 0xdee1
movq %rax, %r14
leaq -0x58(%rbp), %rdi
callq 0x8a24
jmp 0xdee4
movq %rax, %r14
leaq -0x98(%rbp), %rdi
jmp 0xded3
jmp 0xdee1
jmp 0xdeda
jmp 0xdee1
movq %rax, %r14
leaq -0xb8(%rbp), %rdi
jmp 0xded3
jmp 0xdee1
jmp 0xdeda
movq %rax, %r14
leaq -0xd8(%rbp), %rdi
callq 0x3170
jmp 0xdeec
movq %rax, %r14
jmp 0xdeec
jmp 0xdee1
movq %rax, %r14
movq %rbx, %rdi
callq 0x8a24
movq %r14, %rdi
callq 0x3520