Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/bpf,jit: improve code generation

Make use of new immediate instructions that came with the
extended immediate and general instruction extension facilities.

Reviewed-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Heiko Carstens and committed by
Martin Schwidefsky
68d9884d c10302ef

+37 -4
+37 -4
arch/s390/net/bpf_jit_comp.c
··· 10 10 #include <linux/filter.h> 11 11 #include <asm/cacheflush.h> 12 12 #include <asm/processor.h> 13 + #include <asm/facility.h> 13 14 14 15 /* 15 16 * Conventions: ··· 113 112 ({ \ 114 113 unsigned int __disp = (disp) & 0xfff; \ 115 114 EMIT6(op1 | __disp, op2); \ 115 + }) 116 + 117 + #define EMIT6_IMM(op, imm) \ 118 + ({ \ 119 + unsigned int __imm = (imm); \ 120 + EMIT6(op | (__imm >> 16), __imm & 0xffff); \ 116 121 }) 117 122 118 123 #define EMIT_CONST(val) \ ··· 283 276 if (K <= 16383) 284 277 /* ahi %r5,<K> */ 285 278 EMIT4_IMM(0xa75a0000, K); 279 + else if (test_facility(21)) 280 + /* alfi %r5,<K> */ 281 + EMIT6_IMM(0xc25b0000, K); 286 282 else 287 283 /* a %r5,<d(K)>(%r13) */ 288 284 EMIT4_DISP(0x5a50d000, EMIT_CONST(K)); ··· 301 291 if (K <= 16384) 302 292 /* ahi %r5,-K */ 303 293 EMIT4_IMM(0xa75a0000, -K); 294 + else if (test_facility(21)) 295 + /* alfi %r5,-K */ 296 + EMIT6_IMM(0xc25b0000, -K); 304 297 else 305 298 /* s %r5,<d(K)>(%r13) */ 306 299 EMIT4_DISP(0x5b50d000, EMIT_CONST(K)); ··· 317 304 if (K <= 16383) 318 305 /* mhi %r5,K */ 319 306 EMIT4_IMM(0xa75c0000, K); 307 + else if (test_facility(34)) 308 + /* msfi %r5,<K> */ 309 + EMIT6_IMM(0xc2510000, K); 320 310 else 321 311 /* ms %r5,<d(K)>(%r13) */ 322 312 EMIT4_DISP(0x7150d000, EMIT_CONST(K)); ··· 347 331 EMIT2(0x145c); 348 332 break; 349 333 case BPF_S_ALU_AND_K: /* A &= K */ 350 - /* n %r5,<d(K)>(%r13) */ 351 - EMIT4_DISP(0x5450d000, EMIT_CONST(K)); 334 + if (test_facility(21)) 335 + /* nilf %r5,<K> */ 336 + EMIT6_IMM(0xc05b0000, K); 337 + else 338 + /* n %r5,<d(K)>(%r13) */ 339 + EMIT4_DISP(0x5450d000, EMIT_CONST(K)); 352 340 break; 353 341 case BPF_S_ALU_OR_X: /* A |= X */ 354 342 jit->seen |= SEEN_XREG; ··· 360 340 EMIT2(0x165c); 361 341 break; 362 342 case BPF_S_ALU_OR_K: /* A |= K */ 363 - /* o %r5,<d(K)>(%r13) */ 364 - EMIT4_DISP(0x5650d000, EMIT_CONST(K)); 343 + if (test_facility(21)) 344 + /* oilf %r5,<K> */ 345 + EMIT6_IMM(0xc05d0000, K); 346 + else 347 + /* o %r5,<d(K)>(%r13) */ 348 + EMIT4_DISP(0x5650d000, EMIT_CONST(K)); 365 349 break; 366 350 case BPF_S_ALU_LSH_X: /* A <<= X; */ 367 351 jit->seen |= SEEN_XREG; ··· 410 386 if (K <= 16383) 411 387 /* chi %r5,<K> */ 412 388 EMIT4_IMM(0xa75e0000, K); 389 + else if (test_facility(21)) 390 + /* clfi %r5,<K> */ 391 + EMIT6_IMM(0xc25f0000, K); 413 392 else 414 393 /* c %r5,<d(K)>(%r13) */ 415 394 EMIT4_DISP(0x5950d000, EMIT_CONST(K)); ··· 535 508 if (K <= 16383) 536 509 /* lhi %r5,K */ 537 510 EMIT4_IMM(0xa7580000, K); 511 + else if (test_facility(21)) 512 + /* llilf %r5,<K> */ 513 + EMIT6_IMM(0xc05f0000, K); 538 514 else 539 515 /* l %r5,<d(K)>(%r13) */ 540 516 EMIT4_DISP(0x5850d000, EMIT_CONST(K)); ··· 547 517 if (K <= 16383) 548 518 /* lhi %r12,<K> */ 549 519 EMIT4_IMM(0xa7c80000, K); 520 + else if (test_facility(21)) 521 + /* llilf %r12,<K> */ 522 + EMIT6_IMM(0xc0cf0000, K); 550 523 else 551 524 /* l %r12,<d(K)>(%r13) */ 552 525 EMIT4_DISP(0x58c0d000, EMIT_CONST(K));