Issue |
131980
|
Summary |
[WASM] Implement movemask routine
|
Labels |
new issue
|
Assignees |
|
Reporter |
Validark
|
Currently LLVM does not recognize movemasks. [Godbolt link](https://zig.godbo.lt/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:zig,selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'export+fn+z(x:+@Vector(64,+u8))+u64+%7B%0A++++return+@bitCast(x+%3D%3D+@as(@Vector(64,+u8),+@splat(!'+!')))%3B%0A%7D%0A'),l:'5',n:'0',o:'Zig+source+%231',t:'0')),k:50,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:'1',intel:'0',libraryCode:'0',trim:'1',verboseDemangling:'0'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:2,lang:zig,libs:!(),options:'-O+ReleaseFast+-target+wasm64-linux',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:50,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)
```zig
export fn z(x: @Vector(64, u8)) u64 {
return @bitCast(x == @as(@Vector(64, u8), @splat(' ')));
}
```
LLVM IR:
```llvm
define dso_local i64 @z(<64 x i8> %0) local_unnamed_addr {
Entry:
%1 = icmp eq <64 x i8> %0, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%2 = bitcast <64 x i1> %1 to i64
ret i64 %2
}
```
Emit:
```asm
z:
local.get 0
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 1
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 3
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 2
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
local.get 4
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 5
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 7
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 6
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 4
i32.shl
i32.or
local.get 12
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 13
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 15
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 14
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 12
i32.shl
local.get 8
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 9
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 11
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 10
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 8
i32.shl
i32.or
i32.or
i32.const 65535
i32.and
local.get 16
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 17
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 19
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 18
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
local.get 20
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 21
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 23
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 22
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 4
i32.shl
i32.or
local.get 28
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 29
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 31
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 30
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 12
i32.shl
local.get 24
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 25
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 27
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 26
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 8
i32.shl
i32.or
i32.or
i32.const 16
i32.shl
i32.or
i64.extend_i32_u
local.get 32
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 33
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 35
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 34
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
local.get 36
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 37
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 39
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 38
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 4
i32.shl
i32.or
local.get 44
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 45
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 47
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 46
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 12
i32.shl
local.get 40
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 41
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 43
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 42
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 8
i32.shl
i32.or
i32.or
i32.const 65535
i32.and
local.get 48
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 49
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 51
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 50
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
local.get 52
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 53
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 55
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 54
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 4
i32.shl
i32.or
local.get 60
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 61
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 63
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 62
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 12
i32.shl
local.get 56
i32.const 255
i32.and
i32.const 32
i32.eq
local.get 57
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 1
i32.shl
i32.or
local.get 59
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 3
i32.shl
local.get 58
i32.const 255
i32.and
i32.const 32
i32.eq
i32.const 2
i32.shl
i32.or
i32.or
i32.const 8
i32.shl
i32.or
i32.or
i32.const 16
i32.shl
i32.or
i64.extend_i32_u
i64.const 32
i64.shl
i64.or
end_function
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs