add: c style register casting to supported instructions

This commit is contained in:
2025-01-16 11:48:08 +01:00
parent 0d5b736a82
commit ce612f16f1

View File

@@ -253,7 +253,7 @@ void sub() {
if (!check_args(state->args, 0, 2)) { if (!check_args(state->args, 0, 2)) {
return; return;
} }
*get_reg(state->args->arg1) -= get_value(state->args->arg2); *get_reg(state->args->arg1) -= apply_cast(get_value(state->args->arg2), state->args->arg2);
} }
void add() { void add() {
@@ -261,7 +261,7 @@ void add() {
return; return;
} }
*get_reg(state->args->arg1) += get_value(state->args->arg2); *get_reg(state->args->arg1) += apply_cast(get_value(state->args->arg2), state->args->arg2);
} }
@@ -271,7 +271,7 @@ void _sqrt() {
} }
#ifndef LAIKA //Realistically Laika won't ever need sqrt, + that creates linker errors with the CRT #ifndef LAIKA //Realistically Laika won't ever need sqrt, + that creates linker errors with the CRT
*get_reg(state->args->arg1) = (long long)sqrt(get_value(state->args->arg1)); *get_reg(state->args->arg1) = apply_cast((long long)sqrt(get_value(state->args->arg1)), state->args->arg1);
#endif #endif
} }
@@ -280,7 +280,7 @@ void neg() {
return; return;
} }
*get_reg(state->args->arg1) = -get_value(state->args->arg1); *get_reg(state->args->arg1) = -apply_cast(get_value(state->args->arg1), state->args->arg1);
} }
void mul() { void mul() {
@@ -292,7 +292,7 @@ void mul() {
//MSVC wants to link __allmul, but a mul is just a lot of add, isn't it ? //MSVC wants to link __allmul, but a mul is just a lot of add, isn't it ?
long long v1 = *get_reg(state->args->arg1); long long v1 = *get_reg(state->args->arg1);
long long v2 = get_value(state->args->arg2); long long v2 = apply_cast(get_value(state->args->arg2));
long long result = 0; long long result = 0;
int isNegative = 0; int isNegative = 0;
@@ -310,7 +310,7 @@ void mul() {
} }
v1 = isNegative ? -result : result; v1 = isNegative ? -result : result;
#else #else
*get_reg(state->args->arg1) *= get_value(state->args->arg2); *get_reg(state->args->arg1) *= apply_cast(get_value(state->args->arg2), state->args->arg2);
#endif #endif
} }
@@ -351,7 +351,7 @@ void mov() {
if (!check_args(state->args, 0, 2)) { if (!check_args(state->args, 0, 2)) {
return; return;
} }
*get_reg(state->args->arg1) = get_value(state->args->arg2); *get_reg(state->args->arg1) = apply_cast(get_value(state->args->arg2), state->args->arg2);
} }
void call() { void call() {
@@ -370,7 +370,7 @@ void push() {
return; return;
} }
long long value = get_value(state->args->arg1); long long value = apply_cast(get_value(state->args->arg1), state->args->arg1);
if (value == 0 && !is_reg(state->args->arg1)) { if (value == 0 && !is_reg(state->args->arg1)) {
if (state->args->arg1[0] == '\\') { if (state->args->arg1[0] == '\\') {
switch (state->args->arg1[1]) { switch (state->args->arg1[1]) {