From c0bcf00ed100181a532240d904395de11addcd33 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Sat, 24 Feb 2018 23:10:20 +1100
Subject: [PATCH] py/asm*.c: Remove unnecessary check for num_locals<0 in asm
 entry func.

All callers of the asm entry function guarantee that num_locals>=0, so no
need to add an explicit check for it.  Use an assertion instead.

Also, the signature of asm_x86_entry is changed to match the other asm
entry functions.
---
 py/asmarm.c   | 5 +----
 py/asmthumb.c | 5 ++---
 py/asmx64.c   | 4 +---
 py/asmx86.c   | 3 ++-
 py/asmx86.h   | 2 +-
 5 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/py/asmarm.c b/py/asmarm.c
index 552fdfb34..1a8923bc2 100644
--- a/py/asmarm.c
+++ b/py/asmarm.c
@@ -150,10 +150,7 @@ void asm_arm_bkpt(asm_arm_t *as) {
 //  | low address    | high address in RAM
 
 void asm_arm_entry(asm_arm_t *as, int num_locals) {
-
-    if (num_locals < 0) {
-        num_locals = 0;
-    }
+    assert(num_locals >= 0);
 
     as->stack_adjust = 0;
     as->push_reglist = 1 << ASM_ARM_REG_R1
diff --git a/py/asmthumb.c b/py/asmthumb.c
index 5316a7efb..c5b45f2f5 100644
--- a/py/asmthumb.c
+++ b/py/asmthumb.c
@@ -104,6 +104,8 @@ STATIC void asm_thumb_write_word32(asm_thumb_t *as, int w32) {
 //  | low address    | high address in RAM
 
 void asm_thumb_entry(asm_thumb_t *as, int num_locals) {
+    assert(num_locals >= 0);
+
     // work out what to push and how many extra spaces to reserve on stack
     // so that we have enough for all locals and it's aligned an 8-byte boundary
     // we push extra regs (r1, r2, r3) to help do the stack adjustment
@@ -111,9 +113,6 @@ void asm_thumb_entry(asm_thumb_t *as, int num_locals) {
     // for push rlist, lowest numbered register at the lowest address
     uint reglist;
     uint stack_adjust;
-    if (num_locals < 0) {
-        num_locals = 0;
-    }
     // don't pop r0 because it's used for return value
     switch (num_locals) {
         case 0:
diff --git a/py/asmx64.c b/py/asmx64.c
index aa2a8ec7c..c900a08d1 100644
--- a/py/asmx64.c
+++ b/py/asmx64.c
@@ -526,11 +526,9 @@ void asm_x64_jcc_label(asm_x64_t *as, int jcc_type, mp_uint_t label) {
 }
 
 void asm_x64_entry(asm_x64_t *as, int num_locals) {
+    assert(num_locals >= 0);
     asm_x64_push_r64(as, ASM_X64_REG_RBP);
     asm_x64_mov_r64_r64(as, ASM_X64_REG_RBP, ASM_X64_REG_RSP);
-    if (num_locals < 0) {
-        num_locals = 0;
-    }
     num_locals |= 1; // make it odd so stack is aligned on 16 byte boundary
     asm_x64_sub_r64_i32(as, ASM_X64_REG_RSP, num_locals * WORD_SIZE);
     asm_x64_push_r64(as, ASM_X64_REG_RBX);
diff --git a/py/asmx86.c b/py/asmx86.c
index 6a78fbd5e..3938baaac 100644
--- a/py/asmx86.c
+++ b/py/asmx86.c
@@ -387,7 +387,8 @@ void asm_x86_jcc_label(asm_x86_t *as, mp_uint_t jcc_type, mp_uint_t label) {
     }
 }
 
-void asm_x86_entry(asm_x86_t *as, mp_uint_t num_locals) {
+void asm_x86_entry(asm_x86_t *as, int num_locals) {
+    assert(num_locals >= 0);
     asm_x86_push_r32(as, ASM_X86_REG_EBP);
     asm_x86_mov_r32_r32(as, ASM_X86_REG_EBP, ASM_X86_REG_ESP);
     if (num_locals > 0) {
diff --git a/py/asmx86.h b/py/asmx86.h
index bd5895453..09559850c 100644
--- a/py/asmx86.h
+++ b/py/asmx86.h
@@ -104,7 +104,7 @@ void asm_x86_test_r8_with_r8(asm_x86_t* as, int src_r32_a, int src_r32_b);
 void asm_x86_setcc_r8(asm_x86_t* as, mp_uint_t jcc_type, int dest_r8);
 void asm_x86_jmp_label(asm_x86_t* as, mp_uint_t label);
 void asm_x86_jcc_label(asm_x86_t* as, mp_uint_t jcc_type, mp_uint_t label);
-void asm_x86_entry(asm_x86_t* as, mp_uint_t num_locals);
+void asm_x86_entry(asm_x86_t* as, int num_locals);
 void asm_x86_exit(asm_x86_t* as);
 void asm_x86_mov_arg_to_r32(asm_x86_t *as, int src_arg_num, int dest_r32);
 void asm_x86_mov_local_to_r32(asm_x86_t* as, int src_local_num, int dest_r32);
-- 
GitLab