3136 int vector_len = 2; 3137 __ evmovdqul($mem$$Address, $src$$XMMRegister, vector_len); 3138 %} 3139 ins_pipe( pipe_slow ); 3140 %} 3141 3142 instruct storeV64_qword(memory mem, vecZ src) %{ 3143 predicate(n->as_StoreVector()->memory_size() == 64 && n->as_StoreVector()->element_size() > 4); 3144 match(Set mem (StoreVector mem src)); 3145 ins_cost(145); 3146 format %{ "vmovdquq $mem k0,$src\t! store vector (64 bytes)" %} 3147 ins_encode %{ 3148 int vector_len = 2; 3149 __ evmovdquq($mem$$Address, $src$$XMMRegister, vector_len); 3150 %} 3151 ins_pipe( pipe_slow ); 3152 %} 3153 3154 // ====================LEGACY REPLICATE======================================= 3155 3156 instruct Repl4B_mem(vecS dst, memory mem) %{ 3157 predicate(n->as_Vector()->length() == 4 && UseAVX > 0 && !VM_Version::supports_avx512vlbw()); 3158 match(Set dst (ReplicateB (LoadB mem))); 3159 format %{ "punpcklbw $dst,$mem\n\t" 3160 "pshuflw $dst,$dst,0x00\t! replicate4B" %} 3161 ins_encode %{ 3162 __ punpcklbw($dst$$XMMRegister, $mem$$Address); 3163 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3164 %} 3165 ins_pipe( pipe_slow ); 3166 %} 3167 3168 instruct Repl8B_mem(vecD dst, memory mem) %{ 3169 predicate(n->as_Vector()->length() == 8 && UseAVX > 0 && !VM_Version::supports_avx512vlbw()); 3170 match(Set dst (ReplicateB (LoadB mem))); 3171 format %{ "punpcklbw $dst,$mem\n\t" 3172 "pshuflw $dst,$dst,0x00\t! replicate8B" %} 3173 ins_encode %{ 3174 __ punpcklbw($dst$$XMMRegister, $mem$$Address); 3175 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3176 %} 3177 ins_pipe( pipe_slow ); 3178 %} 3179 3180 instruct Repl16B(vecX dst, rRegI src) %{ 3181 predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vlbw()); 3182 match(Set dst (ReplicateB src)); 3183 format %{ "movd $dst,$src\n\t" 3184 "punpcklbw $dst,$dst\n\t" 3185 "pshuflw $dst,$dst,0x00\n\t" 3186 "punpcklqdq $dst,$dst\t! replicate16B" %} 3187 ins_encode %{ 3188 __ movdl($dst$$XMMRegister, $src$$Register); 3189 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); 3190 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3191 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3192 %} 3193 ins_pipe( pipe_slow ); 3194 %} 3195 3196 instruct Repl16B_mem(vecX dst, memory mem) %{ 3197 predicate(n->as_Vector()->length() == 16 && UseAVX > 0 && !VM_Version::supports_avx512vlbw()); 3198 match(Set dst (ReplicateB (LoadB mem))); 3199 format %{ "punpcklbw $dst,$mem\n\t" 3200 "pshuflw $dst,$dst,0x00\n\t" 3201 "punpcklqdq $dst,$dst\t! replicate16B" %} 3202 ins_encode %{ 3203 __ punpcklbw($dst$$XMMRegister, $mem$$Address); 3204 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3205 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3206 %} 3207 ins_pipe( pipe_slow ); 3208 %} 3209 3210 instruct Repl32B(vecY dst, rRegI src) %{ 3211 predicate(n->as_Vector()->length() == 32 && !VM_Version::supports_avx512vlbw()); 3212 match(Set dst (ReplicateB src)); 3213 format %{ "movd $dst,$src\n\t" 3214 "punpcklbw $dst,$dst\n\t" 3215 "pshuflw $dst,$dst,0x00\n\t" 3216 "punpcklqdq $dst,$dst\n\t" 3217 "vinserti128_high $dst,$dst\t! replicate32B" %} 3218 ins_encode %{ 3219 __ movdl($dst$$XMMRegister, $src$$Register); 3220 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); 3221 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3222 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3223 __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister); 3224 %} 3225 ins_pipe( pipe_slow ); 3226 %} 3227 3228 instruct Repl32B_mem(vecY dst, memory mem) %{ 3229 predicate(n->as_Vector()->length() == 32 && !VM_Version::supports_avx512vlbw()); 3230 match(Set dst (ReplicateB (LoadB mem))); 3231 format %{ "punpcklbw $dst,$mem\n\t" 3232 "pshuflw $dst,$dst,0x00\n\t" 3233 "punpcklqdq $dst,$dst\n\t" 3234 "vinserti128_high $dst,$dst\t! replicate32B" %} 3235 ins_encode %{ 3236 __ punpcklbw($dst$$XMMRegister, $mem$$Address); 3237 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3238 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3239 __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister); 3240 %} 3241 ins_pipe( pipe_slow ); 3242 %} 3243 3244 instruct Repl64B(legVecZ dst, rRegI src) %{ 3245 predicate(n->as_Vector()->length() == 64 && !VM_Version::supports_avx512vlbw()); 3246 match(Set dst (ReplicateB src)); 3247 format %{ "movd $dst,$src\n\t" 3248 "punpcklbw $dst,$dst\n\t" 3249 "pshuflw $dst,$dst,0x00\n\t" 3250 "punpcklqdq $dst,$dst\n\t" 3251 "vinserti128_high $dst,$dst\t" 3252 "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate64B" %} 3253 ins_encode %{ 3254 __ movdl($dst$$XMMRegister, $src$$Register); 3255 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); 3256 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3257 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3258 __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister); 3259 __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1); 3260 %} 3261 ins_pipe( pipe_slow ); 3262 %} 3263 3264 instruct Repl64B_mem(legVecZ dst, memory mem) %{ 3265 predicate(n->as_Vector()->length() == 64 && !VM_Version::supports_avx512vlbw()); 3266 match(Set dst (ReplicateB (LoadB mem))); 3267 format %{ "punpcklbw $dst,$mem\n\t" 3268 "pshuflw $dst,$dst,0x00\n\t" 3269 "punpcklqdq $dst,$dst\n\t" 3270 "vinserti128_high $dst,$dst\t" 3271 "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate64B" %} 3272 ins_encode %{ 3273 __ punpcklbw($dst$$XMMRegister, $mem$$Address); 3274 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3275 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3276 __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister); 3277 __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1); 3278 %} 3279 ins_pipe( pipe_slow ); 3280 %} 3281 3282 instruct Repl16B_imm(vecX dst, immI con) %{ 3283 predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vlbw()); 3284 match(Set dst (ReplicateB con)); 3285 format %{ "movq $dst,[$constantaddress]\n\t" 3286 "punpcklqdq $dst,$dst\t! replicate16B($con)" %} 3287 ins_encode %{ 3288 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1))); 3289 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3290 %} 3291 ins_pipe( pipe_slow ); 3292 %} 3293 | 3136 int vector_len = 2; 3137 __ evmovdqul($mem$$Address, $src$$XMMRegister, vector_len); 3138 %} 3139 ins_pipe( pipe_slow ); 3140 %} 3141 3142 instruct storeV64_qword(memory mem, vecZ src) %{ 3143 predicate(n->as_StoreVector()->memory_size() == 64 && n->as_StoreVector()->element_size() > 4); 3144 match(Set mem (StoreVector mem src)); 3145 ins_cost(145); 3146 format %{ "vmovdquq $mem k0,$src\t! store vector (64 bytes)" %} 3147 ins_encode %{ 3148 int vector_len = 2; 3149 __ evmovdquq($mem$$Address, $src$$XMMRegister, vector_len); 3150 %} 3151 ins_pipe( pipe_slow ); 3152 %} 3153 3154 // ====================LEGACY REPLICATE======================================= 3155 3156 instruct Repl16B(vecX dst, rRegI src) %{ 3157 predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vlbw()); 3158 match(Set dst (ReplicateB src)); 3159 format %{ "movd $dst,$src\n\t" 3160 "punpcklbw $dst,$dst\n\t" 3161 "pshuflw $dst,$dst,0x00\n\t" 3162 "punpcklqdq $dst,$dst\t! replicate16B" %} 3163 ins_encode %{ 3164 __ movdl($dst$$XMMRegister, $src$$Register); 3165 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); 3166 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3167 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3168 %} 3169 ins_pipe( pipe_slow ); 3170 %} 3171 3172 instruct Repl32B(vecY dst, rRegI src) %{ 3173 predicate(n->as_Vector()->length() == 32 && !VM_Version::supports_avx512vlbw()); 3174 match(Set dst (ReplicateB src)); 3175 format %{ "movd $dst,$src\n\t" 3176 "punpcklbw $dst,$dst\n\t" 3177 "pshuflw $dst,$dst,0x00\n\t" 3178 "punpcklqdq $dst,$dst\n\t" 3179 "vinserti128_high $dst,$dst\t! replicate32B" %} 3180 ins_encode %{ 3181 __ movdl($dst$$XMMRegister, $src$$Register); 3182 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); 3183 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3184 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3185 __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister); 3186 %} 3187 ins_pipe( pipe_slow ); 3188 %} 3189 3190 instruct Repl64B(legVecZ dst, rRegI src) %{ 3191 predicate(n->as_Vector()->length() == 64 && !VM_Version::supports_avx512vlbw()); 3192 match(Set dst (ReplicateB src)); 3193 format %{ "movd $dst,$src\n\t" 3194 "punpcklbw $dst,$dst\n\t" 3195 "pshuflw $dst,$dst,0x00\n\t" 3196 "punpcklqdq $dst,$dst\n\t" 3197 "vinserti128_high $dst,$dst\t" 3198 "vinserti64x4 $dst,$dst,$dst,0x1\t! replicate64B" %} 3199 ins_encode %{ 3200 __ movdl($dst$$XMMRegister, $src$$Register); 3201 __ punpcklbw($dst$$XMMRegister, $dst$$XMMRegister); 3202 __ pshuflw($dst$$XMMRegister, $dst$$XMMRegister, 0x00); 3203 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3204 __ vinserti128_high($dst$$XMMRegister, $dst$$XMMRegister); 3205 __ vinserti64x4($dst$$XMMRegister, $dst$$XMMRegister, $dst$$XMMRegister, 0x1); 3206 %} 3207 ins_pipe( pipe_slow ); 3208 %} 3209 3210 instruct Repl16B_imm(vecX dst, immI con) %{ 3211 predicate(n->as_Vector()->length() == 16 && !VM_Version::supports_avx512vlbw()); 3212 match(Set dst (ReplicateB con)); 3213 format %{ "movq $dst,[$constantaddress]\n\t" 3214 "punpcklqdq $dst,$dst\t! replicate16B($con)" %} 3215 ins_encode %{ 3216 __ movq($dst$$XMMRegister, $constantaddress(replicate8_imm($con$$constant, 1))); 3217 __ punpcklqdq($dst$$XMMRegister, $dst$$XMMRegister); 3218 %} 3219 ins_pipe( pipe_slow ); 3220 %} 3221 |