| 2053 | } |
| 2054 | |
| 2055 | static void DoCast(const VMRegisters ®, const VMFrame *f, int a, int b, int cast) |
| 2056 | { |
| 2057 | switch (cast) |
| 2058 | { |
| 2059 | case CAST_I2F: |
| 2060 | ASSERTF(a); ASSERTD(b); |
| 2061 | reg.f[a] = reg.d[b]; |
| 2062 | break; |
| 2063 | case CAST_U2F: |
| 2064 | ASSERTF(a); ASSERTD(b); |
| 2065 | reg.f[a] = unsigned(reg.d[b]); |
| 2066 | break; |
| 2067 | case CAST_I2S: |
| 2068 | ASSERTS(a); ASSERTD(b); |
| 2069 | reg.s[a].Format("%d", reg.d[b]); |
| 2070 | break; |
| 2071 | case CAST_U2S: |
| 2072 | ASSERTS(a); ASSERTD(b); |
| 2073 | reg.s[a].Format("%u", reg.d[b]); |
| 2074 | break; |
| 2075 | |
| 2076 | case CAST_F2I: |
| 2077 | ASSERTD(a); ASSERTF(b); |
| 2078 | reg.d[a] = (int)reg.f[b]; |
| 2079 | break; |
| 2080 | case CAST_F2U: |
| 2081 | ASSERTD(a); ASSERTF(b); |
| 2082 | reg.d[a] = (int)(unsigned)reg.f[b]; |
| 2083 | break; |
| 2084 | case CAST_F2S: |
| 2085 | ASSERTS(a); ASSERTF(b); |
| 2086 | reg.s[a].Format("%.5f", reg.f[b]); // keep this small. For more precise conversion there should be a conversion function. |
| 2087 | break; |
| 2088 | case CAST_V22S: |
| 2089 | ASSERTS(a); ASSERTF(b+1); |
| 2090 | reg.s[a].Format("(%.5f, %.5f)", reg.f[b], reg.f[b + 1]); |
| 2091 | break; |
| 2092 | case CAST_V32S: |
| 2093 | ASSERTS(a); ASSERTF(b + 2); |
| 2094 | reg.s[a].Format("(%.5f, %.5f, %.5f)", reg.f[b], reg.f[b + 1], reg.f[b + 2]); |
| 2095 | break; |
| 2096 | |
| 2097 | case CAST_P2S: |
| 2098 | { |
| 2099 | ASSERTS(a); ASSERTA(b); |
| 2100 | if (reg.a[b] == nullptr) reg.s[a] = "null"; |
| 2101 | else reg.s[a].Format("%p", reg.a[b]); |
| 2102 | break; |
| 2103 | } |
| 2104 | |
| 2105 | case CAST_S2I: |
| 2106 | ASSERTD(a); ASSERTS(b); |
| 2107 | reg.d[a] = (VM_SWORD)reg.s[b].ToLong(); |
| 2108 | break; |
| 2109 | case CAST_S2F: |
| 2110 | ASSERTF(a); ASSERTS(b); |
| 2111 | reg.f[a] = reg.s[b].ToDouble(); |
| 2112 | break; |
no test coverage detected