Mercurial > hg > index.cgi
comparison lwasm/insn_tfm.c @ 387:2abcd82b455f
Make TFM complain if invalid registers are used
TFM can only accept 5 pointer registers as source/dest. Complain if anything
else is used.
Thanks to Erik G <erik@6809.org> for the patch.
author | William Astle <lost@l-w.ca> |
---|---|
date | Mon, 13 Jul 2015 21:33:54 -0600 |
parents | 8764142b3192 |
children | b20f14edda5a |
comparison
equal
deleted
inserted
replaced
386:221b5f58d8ad | 387:2abcd82b455f |
---|---|
32 int tfm = 0; | 32 int tfm = 0; |
33 | 33 |
34 c = strchr(reglist, toupper(*(*p)++)); | 34 c = strchr(reglist, toupper(*(*p)++)); |
35 if (!c) | 35 if (!c) |
36 { | 36 { |
37 lwasm_register_error(as, l, E_UNKNOWN_OPERATION); | 37 lwasm_register_error(as, l, E_REGISTER_BAD); |
38 return; | 38 return; |
39 } | 39 } |
40 r0 = c - reglist; | 40 r0 = c - reglist; |
41 if (**p == '+') | 41 if (**p == '+') |
42 { | 42 { |
54 return; | 54 return; |
55 } | 55 } |
56 c = strchr(reglist, toupper(*(*p)++)); | 56 c = strchr(reglist, toupper(*(*p)++)); |
57 if (!c) | 57 if (!c) |
58 { | 58 { |
59 lwasm_register_error(as, l, E_UNKNOWN_OPERATION); | 59 lwasm_register_error(as, l, E_REGISTER_BAD); |
60 return; | 60 return; |
61 } | 61 } |
62 r1 = c - reglist; | 62 r1 = c - reglist; |
63 | 63 |
64 if (**p == '+') | 64 if (**p == '+') |
75 if (**p && !isspace(**p)) | 75 if (**p && !isspace(**p)) |
76 { | 76 { |
77 lwasm_register_error(as, l, E_OPERAND_BAD); | 77 lwasm_register_error(as, l, E_OPERAND_BAD); |
78 return; | 78 return; |
79 } | 79 } |
80 | 80 /* only D, X, Y, U, S are valid tfm registers */ |
81 if (r0 > 4 || r1 > 4) | |
82 { | |
83 if (r0 < r1) r0 = r1; | |
84 lwasm_register_error2(as, l, E_REGISTER_BAD, "'%c'", reglist[r0]); | |
85 } | |
86 | |
81 // valid values of tfm here are: | 87 // valid values of tfm here are: |
82 // 1: r0+,r1 (2) | 88 // 1: r0+,r1 (2) |
83 // 4: r0,r1+ (3) | 89 // 4: r0,r1+ (3) |
84 // 5: r0+,r1+ (0) | 90 // 5: r0+,r1+ (0) |
85 // 10: r0-,r1- (1) | 91 // 10: r0-,r1- (1) |