[x86] `cmp r, 64`+`jbe`+`add r, -64` => `sub r, 64`+`jbe`
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
Zig version: [(Godbolt)](https://zig.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:16,fontUsePx:'0',j:1,lang:zig,selection:(endColumn:1,endLineNumber:14,positionColumn:1,positionLineNumber:14,selectionStartColumn:1,selectionStartLineNumber:14,startColumn:1,startLineNumber:14),source:'const+std+%3D+@import(%22std%22)%3B%0A%0Aexport+fn+emit(input_ptr:+%5B*%5Dconst+u8,+input_len:+usize,+output_ptr:+%5B*%5Du8,+output_len:+usize)+void+%7B%0A++++var+cur_i+%3D+input_ptr%5B0..input_len%5D%3B%0A++++var+cur_o+%3D+output_ptr%5B0..output_len%5D%3B%0A++++while+(true)+%7B%0A++++++++const+input_vec:+@Vector(64,+u8)+%3D+cur_i%5B0..64%5D.*%3B%0A++++++++cur_o%5B0..48%5D.*+%3D+std.simd.extract(input_vec,+0,+48)%3B%0A++++++++if+(cur_i.len+%3C%3D+64)+break%3B%0A++++++++cur_i+%3D+cur_i%5B64..%5D%3B%0A++++++++cur_o+%3D+cur_o%5B48..%5D%3B%0A++++%7D%0A%7D%0A'),l:'5',n:'0',o:'Zig+source+%231',t:'0')),k:50.70404172099087,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:ztrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'0',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:17,fontUsePx:'0',j:1,lang:zig,libs:!(),options:'-O+ReleaseFast+-mcpu%3Dznver5+-target+x86_64-linux+-fomit-frame-pointer',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+zig+trunk+(Editor+%231)',t:'0')),header:(),k:49.29595827900913,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
```zig
const std = @import("std");
export fn emit(input_ptr: [*]const u8, input_len: usize, output_ptr: [*]u8, output_len: usize) void {
var cur_i = input_ptr[0..input_len];
var cur_o = output_ptr[0..output_len];
while (true) {
const input_vec: @Vector(64, u8) = cur_i[0..64].*;
cur_o[0..48].* = std.simd.extract(input_vec, 0, 48);
if (cur_i.len <= 64) break;
cur_i = cur_i[64..];
cur_o = cur_o[48..];
}
}
```
LLVM version: [(Godbolt)](https://llvm.godbo.lt/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1C1aANxakl9ZATwDKjdAGFUtAK4sGErqUcAZPAZMADkPACNMYhAAJh8AB1QFQjsGF3dPb1IEpNsBAKDQlgio2MtMa1yGIQImYgI0jy8uHytMGxTq2oJ8kPDImJaauoaM5ssh7sDeov7YgEpLVDdiZHYOAAFMFkIAagBSAGYAER2xPCYFHdNUPHQdiDiCMh28ADZpHcfnt8kFz6edptVKw4vQAHRbQh7DQAQWhMKwNCCL0EkWYtCuNzuQJB4MhBAeAIYAgYbhMO2ImCY6AEtAAnqdaHhgAwdlwdqJHstMAoIMSgnN9tEAKwaUgvd5C4U%2Bf7EHb80nkgDuxEImFpDLOLLZHKYXMpvP5mEFexF0XFPylB0FbgYzDY6AA%2BtT0HKtaz2XsAOwAIXh2EExDpIHhOx2YTlBgiGNNwr8qFQcXh8PjiZDsLDsbBCmIqCYYMkYI0%2B2OnwQeAlkn2wp9UplsYDTwZe2FR3FLdrsYAHO2RdhaEpq0dQ1Ls7n8xoiyWTnFy7Lq52RWKpY2g0P2zWpV7e8L%2B4OW8OM6Oc3miwdolPDjO518F1LzSvA83WxvF8KAJw7veYIcjrMn/MDgOIswTHPNHVuVRpx2YBMAIcotkYAhbzwHt53/ccQOXS1zz/EUqyvHZaDzO5Dicc8dig1DDmwcVbww09J2Xd02Tw4UwMAg5XnfECOIg9AoMI2D4PoNhBBQtD6JFDizwvbDJVwo9Y2FaDiOpEsnC4V5KJeLsaLogEGM43iAP41RxRYrgRwUIhKQ0iiqL0g5sClD4pPYgDZKLCymW1KyjxskgfzIrSdOo5ypWFAy5SMsEgO4kzxzMnzmQ9NjtMIvBkBYOIdjJAhK2PTDC2XV5hRHCMXk9EVXnFKNyilAAVBBGDqphoxXAdMGTWFmsYdMYTDSkCuuW4ephb8BszEUvWg4SELE5CAVQ6KisY7zCveNiu2gl1CtikrxQAWi2pSRXfOa4IWpCJNW2KNHPDbLUkPSj0q%2BqYxFVMk1hb1DxhDgFloThhV4LwOC0UhUE4Pw/AANQAWR2ABJAAlHYFCWFZguiA4eFIAhNEBhYAGsQGlMEvUkLSu2id8qeFD9uP0ThJDBomoc4XgFBAMVCYhwHSDgWAkDQHK6EichKDFuIJaiEwbGIW0Sb4Oh4OIHmIDCDmwkCWpg24XhdeYIMAHkwm0Np%2BfxsXFtNhh6Q5rAwjcYAnDEAdOHxrAWEMYBxAF0h8EpdpTB5DnMFUNo3Hgr3eECESOaZCN9ZcLAOaePAWDj0gw%2BIMJEkwI4tj9pkjCJhYqAMYAFDhvBMCVU24n6w2ZEEEQxHYKQ2/kJQ1A53QfAMcuTHMfQ8DCHnIAWRNKh5jgjtNg4diOlhkDiNwrwALwYPPQahvPVSwKeIAWVp2nsCBHBGJpfAYdAekKYo9GyZIBBvl/EjfhhH76KIWgQhfKoEwP4AIqB0CYv8Zj/3GF0UBsC6hQOflwM%2BWNVgSCBiDdmgdoYcCIrQZA9wnjK0FBAXAhASBCjxnMXg/MtBzFJiAF6YIRRdjxl6DQ%2BFJAPSHqzXg2cuAaDFODSGuDua8wJhXTBHBojYNEVzSRAsGG50iEkewkggA%3D)
```llvm
@emit = alias void (ptr, i64, ptr, i64), ptr @example.emit
define internal void @example.emit(ptr nonnull readonly align 1 captures(none) %0, i64 %1, ptr nonnull writeonly align 1 captures(none) %2, i64 %3) unnamed_addr align 1 {
Entry:
br label %Loop
Loop:
%.sroa.4.0 = phi i64 [ %1, %Entry ], [ %8, %Else ]
%.sroa.0.0 = phi ptr [ %0, %Entry ], [ %7, %Else ]
%.sroa.032.0 = phi ptr [ %2, %Entry ], [ %9, %Else ]
%.sroa.33.0..sroa_idx = getelementptr i8, ptr %.sroa.0.0, i64 32
%4 = load <32 x i8>, ptr %.sroa.0.0, align 1
%.sroa.3369.0..sroa_idx = getelementptr i8, ptr %.sroa.032.0, i64 32
%5 = load <16 x i8>, ptr %.sroa.33.0..sroa_idx, align 1
store <32 x i8> %4, ptr %.sroa.032.0, align 1
store <16 x i8> %5, ptr %.sroa.3369.0..sroa_idx, align 1
%6 = icmp ult i64 %.sroa.4.0, 65
br i1 %6, label %Then, label %Else
Then:
ret void
Else:
%7 = getelementptr i8, ptr %.sroa.0.0, i64 64
%8 = add i64 %.sroa.4.0, -64
%9 = getelementptr i8, ptr %.sroa.032.0, i64 48
br label %Loop
}
```
=>
```diff
example.emit:
.LBB0_1:
vmovups ymm0, ymmword ptr [rdi]
vmovups xmm1, xmmword ptr [rdi + 32]
vmovups ymmword ptr [rdx], ymm0
vmovups xmmword ptr [rdx + 32], xmm1
- cmp rsi, 64
+ sub rsi, 64
jbe .LBB0_2
add rdi, 64
- add rsi, -64
add rdx, 48
jmp .LBB0_1
.LBB0_2:
vzeroupper
ret
emit = example.emit
```
Contributor guide
Assessment
This issue has not been assessed yet.