summaryrefslogtreecommitdiff
path: root/libinterp/comp-386.c
diff options
context:
space:
mode:
authorCharles Forsyth <charles.forsyth@gmail.com>2013-06-04 08:30:04 +0000
committerCharles Forsyth <charles.forsyth@gmail.com>2013-06-04 08:30:04 +0000
commit4a4256626644b5e413cfb1c228d396d27364030b (patch)
tree5106c854262a2b88b4c56c9bbbefbf237cb17279 /libinterp/comp-386.c
parent6fd2624083b72690a3c4d9f61f5c51a61d0f2b00 (diff)
adjust code to size of Runes
Diffstat (limited to 'libinterp/comp-386.c')
-rw-r--r--libinterp/comp-386.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/libinterp/comp-386.c b/libinterp/comp-386.c
index 916e3c34..21a12718 100644
--- a/libinterp/comp-386.c
+++ b/libinterp/comp-386.c
@@ -1406,13 +1406,18 @@ comp(Inst *i)
genb(0x0f);
gen2(Omovzxb, (1<<6)|(0<<3)|4);
gen2((0<<6)|(RBX<<3)|RAX, O(String, data));
- gen2(Ojmpb, 11);
+ gen2(Ojmpb, sizeof(Rune)==4? 10: 11);
gen2(Oneg, (3<<6)|(3<<3)|RTA);
gen2(0x3b, (3<<6)|(RBX<<3)|RTA); /* cmp index, len */
gen2(0x73, 0xee); /* JNB */
- genb(0x0f);
- gen2(Omovzxw, (1<<6)|(0<<3)|4);
- gen2((1<<6)|(RBX<<3)|RAX, O(String, data));
+ if(sizeof(Rune) == 4){
+ gen2(Oldw, (1<<6)|(0<<3)|4);
+ gen2((2<<6)|(RBX<<3)|RAX, O(String, data));
+ }else{
+ genb(0x0f);
+ gen2(Omovzxw, (1<<6)|(0<<3)|4);
+ gen2((1<<6)|(RBX<<3)|RAX, O(String, data));
+ }
opwst(i, Ostw, RAX);
break;
}
@@ -1422,10 +1427,16 @@ comp(Inst *i)
genb(0x0f);
gen2(Omovzxb, (1<<6)|(0<<3)|4); /* movzbx 12(AX)(RBX*1), RAX */
gen2((0<<6)|(RBX<<3)|RAX, O(String, data));
- gen2(Ojmpb, 5);
- genb(0x0f);
- gen2(Omovzxw, (1<<6)|(0<<3)|4); /* movzwx 12(AX)(RBX*2), RAX */
- gen2((1<<6)|(RBX<<3)|RAX, O(String, data));
+ if(sizeof(Rune) == 4){
+ gen2(Ojmpb, 4);
+ gen2(Oldw, (1<<6)|(0<<3)|4); /* movl 12(AX)(RBX*4), RAX */
+ gen2((2<<6)|(RBX<<3)|RAX, O(String, data));
+ }else{
+ gen2(Ojmpb, 5);
+ genb(0x0f);
+ gen2(Omovzxw, (1<<6)|(0<<3)|4); /* movzwx 12(AX)(RBX*2), RAX */
+ gen2((1<<6)|(RBX<<3)|RAX, O(String, data));
+ }
opwst(i, Ostw, RAX);
break;
case ICASE: