Skip to content

Commit 9dce77b

Browse files
Add tests for alignment hint less than natural alignment
1 parent 54dc0b0 commit 9dce77b

File tree

1 file changed

+131
-6
lines changed

1 file changed

+131
-6
lines changed

test/core/threads/atomic.wast

Lines changed: 131 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@
7070
(func (export "i64.atomic.rmw32.xchg_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.xchg_u (local.get $addr) (local.get $value)))
7171

7272
(func (export "i32.atomic.rmw.cmpxchg") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw.cmpxchg (local.get $addr) (local.get $expected) (local.get $value)))
73-
(func (export "i64.atomic.rmw.cmpxchg") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw.cmpxchg (local.get $addr) (local.get $expected) (local.get $value)))
74-
(func (export "i32.atomic.rmw8.cmpxchg_u") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw8.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
75-
(func (export "i32.atomic.rmw16.cmpxchg_u") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw16.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
76-
(func (export "i64.atomic.rmw8.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw8.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
77-
(func (export "i64.atomic.rmw16.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw16.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
78-
(func (export "i64.atomic.rmw32.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw32.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
73+
(func (export "i64.atomic.rmw.cmpxchg") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw.cmpxchg (local.get $addr) (local.get $expected) (local.get $value)))
74+
(func (export "i32.atomic.rmw8.cmpxchg_u") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw8.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
75+
(func (export "i32.atomic.rmw16.cmpxchg_u") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw16.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
76+
(func (export "i64.atomic.rmw8.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw8.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
77+
(func (export "i64.atomic.rmw16.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw16.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
78+
(func (export "i64.atomic.rmw32.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw32.cmpxchg_u (local.get $addr) (local.get $expected) (local.get $value)))
7979

8080
)
8181

@@ -437,6 +437,131 @@
437437
(assert_trap (invoke "i64.atomic.rmw16.cmpxchg_u" (i32.const 1) (i64.const 0) (i64.const 0)) "unaligned atomic")
438438
(assert_trap (invoke "i64.atomic.rmw32.cmpxchg_u" (i32.const 1) (i64.const 0) (i64.const 0)) "unaligned atomic")
439439

440+
;; Alignment hint is lower than the natural alignment. Execution will trap even if the address being read is aligned.
441+
442+
(module
443+
(memory 1 1 shared)
444+
445+
(func (export "i32.atomic.load") (param $addr i32) (result i32) (i32.atomic.load align=1 (local.get $addr)))
446+
(func (export "i64.atomic.load") (param $addr i32) (result i64) (i64.atomic.load align=1 (local.get $addr)))
447+
(func (export "i32.atomic.load8_u") (param $addr i32) (result i32) (i32.atomic.load8_u align=1 (local.get $addr)))
448+
(func (export "i32.atomic.load16_u") (param $addr i32) (result i32) (i32.atomic.load16_u align=1 (local.get $addr)))
449+
(func (export "i64.atomic.load8_u") (param $addr i32) (result i64) (i64.atomic.load8_u align=1 (local.get $addr)))
450+
(func (export "i64.atomic.load16_u") (param $addr i32) (result i64) (i64.atomic.load16_u align=1 (local.get $addr)))
451+
(func (export "i64.atomic.load32_u") (param $addr i32) (result i64) (i64.atomic.load32_u align=1 (local.get $addr)))
452+
453+
(func (export "i32.atomic.store") (param $addr i32) (param $value i32) (i32.atomic.store align=1 (local.get $addr) (local.get $value)))
454+
(func (export "i64.atomic.store") (param $addr i32) (param $value i64) (i64.atomic.store align=1 (local.get $addr) (local.get $value)))
455+
(func (export "i32.atomic.store8") (param $addr i32) (param $value i32) (i32.atomic.store8 align=1 (local.get $addr) (local.get $value)))
456+
(func (export "i32.atomic.store16") (param $addr i32) (param $value i32) (i32.atomic.store16 align=1 (local.get $addr) (local.get $value)))
457+
(func (export "i64.atomic.store8") (param $addr i32) (param $value i64) (i64.atomic.store8 align=1 (local.get $addr) (local.get $value)))
458+
(func (export "i64.atomic.store16") (param $addr i32) (param $value i64) (i64.atomic.store16 align=1 (local.get $addr) (local.get $value)))
459+
(func (export "i64.atomic.store32") (param $addr i32) (param $value i64) (i64.atomic.store32 align=1 (local.get $addr) (local.get $value)))
460+
461+
(func (export "i32.atomic.rmw.add") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw.add align=1 (local.get $addr) (local.get $value)))
462+
(func (export "i64.atomic.rmw.add") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw.add align=1 (local.get $addr) (local.get $value)))
463+
(func (export "i32.atomic.rmw8.add_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw8.add_u align=1 (local.get $addr) (local.get $value)))
464+
(func (export "i32.atomic.rmw16.add_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw16.add_u align=1 (local.get $addr) (local.get $value)))
465+
(func (export "i64.atomic.rmw8.add_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw8.add_u align=1 (local.get $addr) (local.get $value)))
466+
(func (export "i64.atomic.rmw16.add_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw16.add_u align=1 (local.get $addr) (local.get $value)))
467+
(func (export "i64.atomic.rmw32.add_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.add_u align=1 (local.get $addr) (local.get $value)))
468+
469+
(func (export "i32.atomic.rmw.sub") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw.sub align=1 (local.get $addr) (local.get $value)))
470+
(func (export "i64.atomic.rmw.sub") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw.sub align=1 (local.get $addr) (local.get $value)))
471+
(func (export "i32.atomic.rmw8.sub_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw8.sub_u align=1 (local.get $addr) (local.get $value)))
472+
(func (export "i32.atomic.rmw16.sub_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw16.sub_u align=1 (local.get $addr) (local.get $value)))
473+
(func (export "i64.atomic.rmw8.sub_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw8.sub_u align=1 (local.get $addr) (local.get $value)))
474+
(func (export "i64.atomic.rmw16.sub_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw16.sub_u align=1 (local.get $addr) (local.get $value)))
475+
(func (export "i64.atomic.rmw32.sub_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.sub_u align=1 (local.get $addr) (local.get $value)))
476+
477+
(func (export "i32.atomic.rmw.and") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw.and align=1 (local.get $addr) (local.get $value)))
478+
(func (export "i64.atomic.rmw.and") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw.and align=1 (local.get $addr) (local.get $value)))
479+
(func (export "i32.atomic.rmw8.and_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw8.and_u align=1 (local.get $addr) (local.get $value)))
480+
(func (export "i32.atomic.rmw16.and_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw16.and_u align=1 (local.get $addr) (local.get $value)))
481+
(func (export "i64.atomic.rmw8.and_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw8.and_u align=1 (local.get $addr) (local.get $value)))
482+
(func (export "i64.atomic.rmw16.and_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw16.and_u align=1 (local.get $addr) (local.get $value)))
483+
(func (export "i64.atomic.rmw32.and_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.and_u align=1 (local.get $addr) (local.get $value)))
484+
485+
(func (export "i32.atomic.rmw.or") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw.or align=1 (local.get $addr) (local.get $value)))
486+
(func (export "i64.atomic.rmw.or") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw.or align=1 (local.get $addr) (local.get $value)))
487+
(func (export "i32.atomic.rmw8.or_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw8.or_u align=1 (local.get $addr) (local.get $value)))
488+
(func (export "i32.atomic.rmw16.or_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw16.or_u align=1 (local.get $addr) (local.get $value)))
489+
(func (export "i64.atomic.rmw8.or_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw8.or_u align=1 (local.get $addr) (local.get $value)))
490+
(func (export "i64.atomic.rmw16.or_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw16.or_u align=1 (local.get $addr) (local.get $value)))
491+
(func (export "i64.atomic.rmw32.or_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.or_u align=1 (local.get $addr) (local.get $value)))
492+
493+
(func (export "i32.atomic.rmw.xor") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw.xor align=1 (local.get $addr) (local.get $value)))
494+
(func (export "i64.atomic.rmw.xor") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw.xor align=1 (local.get $addr) (local.get $value)))
495+
(func (export "i32.atomic.rmw8.xor_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw8.xor_u align=1 (local.get $addr) (local.get $value)))
496+
(func (export "i32.atomic.rmw16.xor_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw16.xor_u align=1 (local.get $addr) (local.get $value)))
497+
(func (export "i64.atomic.rmw8.xor_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw8.xor_u align=1 (local.get $addr) (local.get $value)))
498+
(func (export "i64.atomic.rmw16.xor_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw16.xor_u align=1 (local.get $addr) (local.get $value)))
499+
(func (export "i64.atomic.rmw32.xor_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.xor_u align=1 (local.get $addr) (local.get $value)))
500+
501+
(func (export "i32.atomic.rmw.xchg") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw.xchg align=1 (local.get $addr) (local.get $value)))
502+
(func (export "i64.atomic.rmw.xchg") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw.xchg align=1 (local.get $addr) (local.get $value)))
503+
(func (export "i32.atomic.rmw8.xchg_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw8.xchg_u align=1 (local.get $addr) (local.get $value)))
504+
(func (export "i32.atomic.rmw16.xchg_u") (param $addr i32) (param $value i32) (result i32) (i32.atomic.rmw16.xchg_u align=1 (local.get $addr) (local.get $value)))
505+
(func (export "i64.atomic.rmw8.xchg_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw8.xchg_u align=1 (local.get $addr) (local.get $value)))
506+
(func (export "i64.atomic.rmw16.xchg_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw16.xchg_u align=1 (local.get $addr) (local.get $value)))
507+
(func (export "i64.atomic.rmw32.xchg_u") (param $addr i32) (param $value i64) (result i64) (i64.atomic.rmw32.xchg_u align=1 (local.get $addr) (local.get $value)))
508+
509+
(func (export "i32.atomic.rmw.cmpxchg") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw.cmpxchg align=1 (local.get $addr) (local.get $expected) (local.get $value)))
510+
(func (export "i64.atomic.rmw.cmpxchg") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw.cmpxchg align=1 (local.get $addr) (local.get $expected) (local.get $value)))
511+
(func (export "i32.atomic.rmw8.cmpxchg_u") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw8.cmpxchg_u align=1 (local.get $addr) (local.get $expected) (local.get $value)))
512+
(func (export "i32.atomic.rmw16.cmpxchg_u") (param $addr i32) (param $expected i32) (param $value i32) (result i32) (i32.atomic.rmw16.cmpxchg_u align=1 (local.get $addr) (local.get $expected) (local.get $value)))
513+
(func (export "i64.atomic.rmw8.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw8.cmpxchg_u align=1 (local.get $addr) (local.get $expected) (local.get $value)))
514+
(func (export "i64.atomic.rmw16.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw16.cmpxchg_u align=1 (local.get $addr) (local.get $expected) (local.get $value)))
515+
(func (export "i64.atomic.rmw32.cmpxchg_u") (param $addr i32) (param $expected i64) (param $value i64) (result i64) (i64.atomic.rmw32.cmpxchg_u align=1 (local.get $addr) (local.get $expected) (local.get $value)))
516+
)
517+
518+
(assert_trap (invoke "i32.atomic.load" (i32.const 0)) "unaligned atomic")
519+
(assert_trap (invoke "i64.atomic.load" (i32.const 0)) "unaligned atomic")
520+
(assert_trap (invoke "i32.atomic.load16_u" (i32.const 0)) "unaligned atomic")
521+
(assert_trap (invoke "i64.atomic.load16_u" (i32.const 0)) "unaligned atomic")
522+
(assert_trap (invoke "i64.atomic.load32_u" (i32.const 0)) "unaligned atomic")
523+
(assert_trap (invoke "i32.atomic.store" (i32.const 0) (i32.const 0)) "unaligned atomic")
524+
(assert_trap (invoke "i64.atomic.store" (i32.const 0) (i64.const 0)) "unaligned atomic")
525+
(assert_trap (invoke "i32.atomic.store16" (i32.const 0) (i32.const 0)) "unaligned atomic")
526+
(assert_trap (invoke "i64.atomic.store16" (i32.const 0) (i64.const 0)) "unaligned atomic")
527+
(assert_trap (invoke "i64.atomic.store32" (i32.const 0) (i64.const 0)) "unaligned atomic")
528+
(assert_trap (invoke "i32.atomic.rmw.add" (i32.const 0) (i32.const 0)) "unaligned atomic")
529+
(assert_trap (invoke "i64.atomic.rmw.add" (i32.const 0) (i64.const 0)) "unaligned atomic")
530+
(assert_trap (invoke "i32.atomic.rmw16.add_u" (i32.const 0) (i32.const 0)) "unaligned atomic")
531+
(assert_trap (invoke "i64.atomic.rmw16.add_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
532+
(assert_trap (invoke "i64.atomic.rmw32.add_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
533+
(assert_trap (invoke "i32.atomic.rmw.sub" (i32.const 0) (i32.const 0)) "unaligned atomic")
534+
(assert_trap (invoke "i64.atomic.rmw.sub" (i32.const 0) (i64.const 0)) "unaligned atomic")
535+
(assert_trap (invoke "i32.atomic.rmw16.sub_u" (i32.const 0) (i32.const 0)) "unaligned atomic")
536+
(assert_trap (invoke "i64.atomic.rmw16.sub_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
537+
(assert_trap (invoke "i64.atomic.rmw32.sub_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
538+
(assert_trap (invoke "i32.atomic.rmw.and" (i32.const 0) (i32.const 0)) "unaligned atomic")
539+
(assert_trap (invoke "i64.atomic.rmw.and" (i32.const 0) (i64.const 0)) "unaligned atomic")
540+
(assert_trap (invoke "i32.atomic.rmw16.and_u" (i32.const 0) (i32.const 0)) "unaligned atomic")
541+
(assert_trap (invoke "i64.atomic.rmw16.and_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
542+
(assert_trap (invoke "i64.atomic.rmw32.and_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
543+
(assert_trap (invoke "i32.atomic.rmw.or" (i32.const 0) (i32.const 0)) "unaligned atomic")
544+
(assert_trap (invoke "i64.atomic.rmw.or" (i32.const 0) (i64.const 0)) "unaligned atomic")
545+
(assert_trap (invoke "i32.atomic.rmw16.or_u" (i32.const 0) (i32.const 0)) "unaligned atomic")
546+
(assert_trap (invoke "i64.atomic.rmw16.or_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
547+
(assert_trap (invoke "i64.atomic.rmw32.or_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
548+
(assert_trap (invoke "i32.atomic.rmw.xor" (i32.const 0) (i32.const 0)) "unaligned atomic")
549+
(assert_trap (invoke "i64.atomic.rmw.xor" (i32.const 0) (i64.const 0)) "unaligned atomic")
550+
(assert_trap (invoke "i32.atomic.rmw16.xor_u" (i32.const 0) (i32.const 0)) "unaligned atomic")
551+
(assert_trap (invoke "i64.atomic.rmw16.xor_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
552+
(assert_trap (invoke "i64.atomic.rmw32.xor_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
553+
(assert_trap (invoke "i32.atomic.rmw.xchg" (i32.const 0) (i32.const 0)) "unaligned atomic")
554+
(assert_trap (invoke "i64.atomic.rmw.xchg" (i32.const 0) (i64.const 0)) "unaligned atomic")
555+
(assert_trap (invoke "i32.atomic.rmw16.xchg_u" (i32.const 0) (i32.const 0)) "unaligned atomic")
556+
(assert_trap (invoke "i64.atomic.rmw16.xchg_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
557+
(assert_trap (invoke "i64.atomic.rmw32.xchg_u" (i32.const 0) (i64.const 0)) "unaligned atomic")
558+
(assert_trap (invoke "i32.atomic.rmw.cmpxchg" (i32.const 0) (i32.const 0) (i32.const 0)) "unaligned atomic")
559+
(assert_trap (invoke "i64.atomic.rmw.cmpxchg" (i32.const 0) (i64.const 0) (i64.const 0)) "unaligned atomic")
560+
(assert_trap (invoke "i32.atomic.rmw16.cmpxchg_u" (i32.const 0) (i32.const 0) (i32.const 0)) "unaligned atomic")
561+
(assert_trap (invoke "i64.atomic.rmw16.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0)) "unaligned atomic")
562+
(assert_trap (invoke "i64.atomic.rmw32.cmpxchg_u" (i32.const 0) (i64.const 0) (i64.const 0)) "unaligned atomic")
563+
564+
440565
;; wait/notify
441566
(module
442567
(memory 1 1 shared)

0 commit comments

Comments
 (0)