diff --git a/src/x86/Set_test.go b/src/x86/Set_test.go index 10df804..6f7d2a4 100644 --- a/src/x86/Set_test.go +++ b/src/x86/Set_test.go @@ -34,6 +34,9 @@ func TestSet(t *testing.T) { {x86.R1, 9, []byte{0x0F, 0x92, 0xC1}}, {x86.R0, 10, []byte{0x0F, 0x96, 0xC0}}, {x86.R1, 10, []byte{0x0F, 0x96, 0xC1}}, + {x86.R5, 1, []byte{0x40, 0x0F, 0x94, 0xC5}}, + {x86.R6, 1, []byte{0x40, 0x0F, 0x94, 0xC6}}, + {x86.R7, 1, []byte{0x40, 0x0F, 0x94, 0xC7}}, {x86.R8, 1, []byte{0x41, 0x0F, 0x94, 0xC0}}, {x86.R9, 1, []byte{0x41, 0x0F, 0x94, 0xC1}}, } diff --git a/src/x86/encode.go b/src/x86/encode.go index 4563d69..ac99129 100644 --- a/src/x86/encode.go +++ b/src/x86/encode.go @@ -27,7 +27,7 @@ func encode(code []byte, mod AddressMode, reg cpu.Register, rm cpu.Register, len code = append(code, byte(opCode>>24)) } - if w != 0 || r != 0 || b != 0 || (length == 1 && reg >= SP && reg <= R7) { + if w != 0 || r != 0 || b != 0 || length == 1 && (reg >= SP && reg <= R7 || mod == AddressDirect && rm >= R5 && rm <= R7) { code = append(code, REX(w, r, 0, b)) } diff --git a/tests/bool-2.q b/tests/bool-2.q new file mode 100644 index 0000000..a61e1ca --- /dev/null +++ b/tests/bool-2.q @@ -0,0 +1,18 @@ +main() { + a := 1 + b := 2 + c := a < b + d := b < a + e := a > 0 + checkFalse(d) + checkTrue(c) + checkTrue(e) +} + +checkFalse(v bool) { + assert !v +} + +checkTrue(v bool) { + assert v +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index 9fa9e9f..cb20479 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -49,6 +49,7 @@ var tests = []run{ {"branch-or", nil, "", "", 0}, {"branch-both", nil, "", "", 0}, {"bool", nil, "", "false\ntrue\nfalse\ntrue\nfalse\ntrue\ntrue\ntrue\n", 0}, + {"bool-2", nil, "", "", 0}, {"jump-near", nil, "", "", 0}, {"reorder-blocks", nil, "", "CDFH\n", 0}, {"switch", nil, "", "", 0},