I have these functions in C++
int f1(int a)
{
    int x = a  / 2; 
}
int f2(int a)
{
    int y = a % 2;
}
 int f3(int a)
 {
    int z = a % 7;
 }
int f4(int a,int b)
 {
   int xy = a % b; 
 }
And i saw their assembly code but couldn't understand what they are doing.I couldn't even find a good referance or some explained example for the same. Here is the assembly
f1(int):
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-20], edi
    mov     eax, DWORD PTR [rbp-20]
    mov     edx, eax
    shr     edx, 31
    add     eax, edx
    sar     eax
    mov     DWORD PTR [rbp-4], eax
    nop
    pop     rbp
    ret
f2(int):
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-20], edi
    mov     eax, DWORD PTR [rbp-20]
    cdq
    shr     edx, 31
    add     eax, edx
    and     eax, 1
    sub     eax, edx
    mov     DWORD PTR [rbp-4], eax
    nop
    pop     rbp
    ret
f3(int):
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-20], edi
    mov     eax, DWORD PTR [rbp-20]
    movsx   rdx, eax
    imul    rdx, rdx, -1840700269
    shr     rdx, 32
    add     edx, eax
    sar     edx, 2
    mov     esi, eax
    sar     esi, 31
    mov     ecx, edx
    sub     ecx, esi
    mov     edx, ecx
    sal     edx, 3
    sub     edx, ecx
    sub     eax, edx
    mov     DWORD PTR [rbp-4], eax
    nop
    pop     rbp
    ret
f4(int, int):
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-20], edi
    mov     DWORD PTR [rbp-24], esi
    mov     eax, DWORD PTR [rbp-20]
    cdq
    idiv    DWORD PTR [rbp-24]
    mov     DWORD PTR [rbp-4], edx
    nop
    pop     rbp
    ret
Can you please tell by some example or what steps it is following to calculate the answers in all these three cases and why would they work just fine instead of normal divide
 
    