volatile-high-bits-arm64.js (3411B)
1 // |jit-test| skip-if: !wasmSimdEnabled() 2 3 const m = new WebAssembly.Module(wasmTextToBinary(`(module 4 (import "imp" "f" (func $f (result i32))) 5 6 (type $node (struct 7 (field $v (mut (ref null $node))) 8 )) 9 10 (memory (export "mem") 1 1) 11 12 (func (export "run") 13 (v128.store (i32.const 0) ( 14 call $doit ( 15 v128.load (i32.const 0) 16 v128.load (i32.const 0) 17 v128.load (i32.const 0) 18 v128.load (i32.const 0) 19 v128.load (i32.const 0) 20 v128.load (i32.const 0) 21 v128.load (i32.const 0) 22 v128.load (i32.const 0) 23 ) 24 )) 25 ) 26 27 (func $doit 28 ;; Enough Simd128 parameters and locals to ensure registers v8-v15 are used. 29 (param v128) (param v128) (param v128) (param v128) 30 (param v128) (param v128) (param v128) (param v128) 31 32 (result v128) 33 34 (local $var1 v128) (local $var2 v128) (local $var3 v128) (local $var4 v128) 35 (local $var5 v128) (local $var6 v128) (local $var7 v128) (local $var8 v128) 36 37 (local $var_s (ref $node)) 38 (local $var_c (ref $node)) 39 40 (struct.new_default $node) 41 local.set $var_s 42 43 ;; GC to tenure $var_s 44 (drop (call $f)) 45 46 ;; New nursery allocated $var_c 47 (struct.new_default $node) 48 local.set $var_c 49 50 (v128.const i32x4 0x1111_1111 0x1111_2222 0x1111_3333 0x1111_4444) 51 local.set $var1 52 53 (v128.const i32x4 0x2222_1111 0x2222_2222 0x2222_3333 0x2222_4444) 54 local.set $var2 55 56 (v128.const i32x4 0x3333_1111 0x3333_2222 0x3333_3333 0x3333_4444) 57 local.set $var3 58 59 (v128.const i32x4 0x4444_1111 0x4444_2222 0x4444_3333 0x4444_4444) 60 local.set $var4 61 62 (v128.const i32x4 0x5555_1111 0x5555_2222 0x5555_3333 0x5555_4444) 63 local.set $var5 64 65 (v128.const i32x4 0x6666_1111 0x6666_2222 0x6666_3333 0x6666_4444) 66 local.set $var6 67 68 (v128.const i32x4 0x7777_1111 0x7777_2222 0x7777_3333 0x7777_4444) 69 local.set $var7 70 71 (v128.const i32x4 0x8888_1111 0x8888_2222 0x8888_3333 0x8888_4444) 72 local.set $var8 73 74 local.get $var1 75 local.get 0 76 v128.or 77 78 local.get $var2 79 local.get 1 80 v128.or 81 82 local.get $var3 83 local.get 2 84 v128.or 85 86 local.get $var4 87 local.get 3 88 v128.or 89 90 local.get $var5 91 local.get 4 92 v128.or 93 94 local.get $var6 95 local.get 5 96 v128.or 97 98 local.get $var7 99 local.get 6 100 v128.or 101 102 local.get $var8 103 local.get 7 104 v128.or 105 106 local.get $var1 107 local.get 1 108 v128.or 109 110 local.get $var2 111 local.get 1 112 v128.or 113 114 local.get $var3 115 local.get 1 116 v128.or 117 118 local.get $var4 119 local.get 1 120 v128.or 121 122 local.get $var5 123 local.get 1 124 v128.or 125 126 local.get $var6 127 local.get 1 128 v128.or 129 130 local.get $var7 131 local.get 1 132 v128.or 133 134 local.get $var8 135 local.get 1 136 v128.or 137 138 ;; Postwrite barrier with ABI call. 139 (struct.set $node 0 (local.get $var_s) (local.get $var_c)) 140 141 v128.or 142 v128.or 143 v128.or 144 v128.or 145 v128.or 146 v128.or 147 v128.or 148 149 v128.or 150 v128.or 151 v128.or 152 v128.or 153 v128.or 154 v128.or 155 v128.or 156 157 v128.or 158 ) 159 )`)); 160 161 const { 162 run, mem 163 } = new WebAssembly.Instance(m, { 164 imp: { 165 f() { 166 gc(); 167 return 0; 168 } 169 } 170 }).exports; 171 172 var view = new BigUint64Array(mem.buffer, 0, 2); 173 174 for (let i = 0; i < 100; ++i) { 175 view[0] = 0n; 176 view[1] = 0n; 177 178 run(); 179 180 assertEq(view[0].toString(16), "ffff2222ffff1111"); 181 assertEq(view[1].toString(16), "ffff4444ffff3333"); 182 }