|
518 | 518 | (NE (TESTB (SETA cmp) (SETA cmp)) yes no) -> (UGT cmp yes no)
|
519 | 519 | (NE (TESTB (SETAE cmp) (SETAE cmp)) yes no) -> (UGE cmp yes no)
|
520 | 520 |
|
| 521 | +// Normalize TESTx argument order for BTx rewrites below. |
| 522 | +(TESTQ y x:(SHLQ _ _)) && y.Op != OpAMD64SHLQ -> (TESTQ x y) |
| 523 | +(TESTL y x:(SHLL _ _)) && y.Op != OpAMD64SHLL -> (TESTL x y) |
| 524 | + |
| 525 | +// Recognize bit tests: a&(1<<b) != 0 for b suitably bounded |
| 526 | +// Note that ULT and SETB check the carry flag; they are identical to CS and SETCS. |
| 527 | +// Same, mutatis mutandis, for UGE and SETAE, and CC and SETCC. |
| 528 | +(NE (TESTL (SHLL (MOVLconst [1]) x) y)) && !config.nacl -> (ULT (BTL x y)) |
| 529 | +(EQ (TESTL (SHLL (MOVLconst [1]) x) y)) && !config.nacl -> (UGE (BTL x y)) |
| 530 | +(NE (TESTQ (SHLQ (MOVQconst [1]) x) y)) && !config.nacl -> (ULT (BTQ x y)) |
| 531 | +(EQ (TESTQ (SHLQ (MOVQconst [1]) x) y)) && !config.nacl -> (UGE (BTQ x y)) |
| 532 | +(NE (TESTLconst [c] x)) && isPowerOfTwo(c) && log2(c) < 32 && !config.nacl -> (ULT (BTLconst [log2(c)] x)) |
| 533 | +(EQ (TESTLconst [c] x)) && isPowerOfTwo(c) && log2(c) < 32 && !config.nacl -> (UGE (BTLconst [log2(c)] x)) |
| 534 | +(NE (TESTQconst [c] x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (ULT (BTQconst [log2(c)] x)) |
| 535 | +(EQ (TESTQconst [c] x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (UGE (BTQconst [log2(c)] x)) |
| 536 | +(NE (TESTQ (MOVQconst [c]) x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (ULT (BTQconst [log2(c)] x)) |
| 537 | +(EQ (TESTQ (MOVQconst [c]) x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (UGE (BTQconst [log2(c)] x)) |
| 538 | +(SETNE (TESTL (SHLL (MOVLconst [1]) x) y)) && !config.nacl -> (SETB (BTL x y)) |
| 539 | +(SETEQ (TESTL (SHLL (MOVLconst [1]) x) y)) && !config.nacl -> (SETAE (BTL x y)) |
| 540 | +(SETNE (TESTQ (SHLQ (MOVQconst [1]) x) y)) && !config.nacl -> (SETB (BTQ x y)) |
| 541 | +(SETEQ (TESTQ (SHLQ (MOVQconst [1]) x) y)) && !config.nacl -> (SETAE (BTQ x y)) |
| 542 | +(SETNE (TESTLconst [c] x)) && isPowerOfTwo(c) && log2(c) < 32 && !config.nacl -> (SETB (BTLconst [log2(c)] x)) |
| 543 | +(SETEQ (TESTLconst [c] x)) && isPowerOfTwo(c) && log2(c) < 32 && !config.nacl -> (SETAE (BTLconst [log2(c)] x)) |
| 544 | +(SETNE (TESTQconst [c] x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (SETB (BTQconst [log2(c)] x)) |
| 545 | +(SETEQ (TESTQconst [c] x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (SETAE (BTQconst [log2(c)] x)) |
| 546 | +(SETNE (TESTQ (MOVQconst [c]) x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (SETB (BTQconst [log2(c)] x)) |
| 547 | +(SETEQ (TESTQ (MOVQconst [c]) x)) && isPowerOfTwo(c) && log2(c) < 64 && !config.nacl -> (SETAE (BTQconst [log2(c)] x)) |
| 548 | + |
| 549 | +// Convert BTQconst to BTLconst if possible. It has a shorter encoding. |
| 550 | +(BTQconst [c] x) && c < 32 -> (BTLconst [c] x) |
| 551 | + |
521 | 552 | // Special case for floating point - LF/LEF not generated
|
522 | 553 | (NE (TESTB (SETGF cmp) (SETGF cmp)) yes no) -> (UGT cmp yes no)
|
523 | 554 | (NE (TESTB (SETGEF cmp) (SETGEF cmp)) yes no) -> (UGE cmp yes no)
|
|
1380 | 1411 | (CMPWconst (ANDLconst [c] x) [0]) -> (TESTWconst [int64(int16(c))] x)
|
1381 | 1412 | (CMPBconst (ANDLconst [c] x) [0]) -> (TESTBconst [int64(int8(c))] x)
|
1382 | 1413 |
|
| 1414 | +// Convert TESTx to TESTxconst if possible. |
| 1415 | +(TESTQ (MOVQconst [c]) x) && c < 1<<31 -> (TESTQconst [c] x) |
| 1416 | +(TESTL (MOVLconst [c]) x) -> (TESTLconst [c] x) |
| 1417 | +(TESTW (MOVLconst [c]) x) -> (TESTWconst [c] x) |
| 1418 | +(TESTB (MOVLconst [c]) x) -> (TESTBconst [c] x) |
| 1419 | +(TESTQ x (MOVQconst [c])) && c < 1<<31 -> (TESTQconst [c] x) |
| 1420 | +(TESTL x (MOVLconst [c])) -> (TESTLconst [c] x) |
| 1421 | +(TESTW x (MOVLconst [c])) -> (TESTWconst [c] x) |
| 1422 | +(TESTB x (MOVLconst [c])) -> (TESTBconst [c] x) |
| 1423 | + |
1383 | 1424 | // TEST %reg,%reg is shorter than CMP
|
1384 | 1425 | (CMPQconst x [0]) -> (TESTQ x x)
|
1385 | 1426 | (CMPLconst x [0]) -> (TESTL x x)
|
|
0 commit comments