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)