Library multi_sub_s_s_u_prg
Require Import machine_int.
Import MachineInt.
Require Import mips_cmd.
Import expr_m.
Require Import multi_is_zero_u_prg pick_sign_prg copy_s_u_prg multi_lt_prg.
Require Import multi_zero_s_prg multi_sub_u_u_prg multi_add_u_u_prg copy_s_s_prg.
Local Open Scope mips_cmd_scope.
Import MachineInt.
Require Import mips_cmd.
Import expr_m.
Require Import multi_is_zero_u_prg pick_sign_prg copy_s_u_prg multi_lt_prg.
Require Import multi_zero_s_prg multi_sub_u_u_prg multi_add_u_u_prg copy_s_s_prg.
Local Open Scope mips_cmd_scope.
z <- x - y with z, x signed and y unsigned
Definition multi_sub_s_s_u0 rk rz rx ry a0 a1 a2 a3 a4 ret X Z :=
lw Z four16 rz ;
lw X four16 rx ;
pick_sign rx a0 a1 ;
If_bgez a1 Then
If_beq a1, r0 Then
copy_s_u rk rz ry a0 a1 a2 a3 ;
addiu a3 r0 zero16 ;
subu a0 r0 rk ;
sw a0 zero16 rz
Else
multi_lt rk ry X a0 a1 ret a2 a3 a4 ;
If_beq ret, r0 Then
If_beq a2, r0 Then
multi_zero_s rz ;
addiu a3 r0 zero16
Else
multi_sub_u_u rk ry X Z a0 a1 a2 a3 a4 ret;
subu a0 r0 rk ;
sw a0 zero16 rz
Else
multi_sub_u_u rk X ry Z a0 a1 a2 a3 a4 ret;
sw rk zero16 rz
Else
addiu a3 r0 one16 ;
multi_add_u_u rk a3 X ry Z a0 a1 a2 ;
mflo a3 ;
subu a0 r0 rk ;
sw a0 zero16 rz.
Definition multi_sub_s_s_u rk rz rx ry a0 a1 a2 a3 a4 ret X Z :=
multi_is_zero_u rk ry a0 a1 a2 ;
If_bne a2 , r0 Then
addiu a3 r0 zero16 ;
copy_s_s rk rz rx a0 a1 a2 ret a4
Else
multi_sub_s_s_u0 rk rz rx ry a0 a1 a2 a3 a4 ret X Z.
lw Z four16 rz ;
lw X four16 rx ;
pick_sign rx a0 a1 ;
If_bgez a1 Then
If_beq a1, r0 Then
copy_s_u rk rz ry a0 a1 a2 a3 ;
addiu a3 r0 zero16 ;
subu a0 r0 rk ;
sw a0 zero16 rz
Else
multi_lt rk ry X a0 a1 ret a2 a3 a4 ;
If_beq ret, r0 Then
If_beq a2, r0 Then
multi_zero_s rz ;
addiu a3 r0 zero16
Else
multi_sub_u_u rk ry X Z a0 a1 a2 a3 a4 ret;
subu a0 r0 rk ;
sw a0 zero16 rz
Else
multi_sub_u_u rk X ry Z a0 a1 a2 a3 a4 ret;
sw rk zero16 rz
Else
addiu a3 r0 one16 ;
multi_add_u_u rk a3 X ry Z a0 a1 a2 ;
mflo a3 ;
subu a0 r0 rk ;
sw a0 zero16 rz.
Definition multi_sub_s_s_u rk rz rx ry a0 a1 a2 a3 a4 ret X Z :=
multi_is_zero_u rk ry a0 a1 a2 ;
If_bne a2 , r0 Then
addiu a3 r0 zero16 ;
copy_s_s rk rz rx a0 a1 a2 ret a4
Else
multi_sub_s_s_u0 rk rz rx ry a0 a1 a2 a3 a4 ret X Z.